07070100000000000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000001200000000spacewalk-backend 07070100000001000081B40000000000000000000000015FBBE8EE00000178000000000000000000000000000000000000001A00000000spacewalk-backend/HACKING Before running the backend unit tests you'll need to do the following:

 * yum install python-nose python-pgsql
 * export SPACEWALK_GIT=~/src/spacewalk
   * Adjust accordingly to point to the top level of your spacewalk git clone.
   * Probably wise to add to your ~/.bashrc or equivalent.

To run the pure unit tests (no disk/network/db access):

    nosetests -s test/unit/
07070100000002000081B40000000000000000000000015FBBE8EE000046AC000000000000000000000000000000000000001A00000000spacewalk-backend/LICENSE                     GNU GENERAL PUBLIC LICENSE
                       Version 2, June 1991

 Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users.  This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it.  (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.)  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.

  To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have.  You must make sure that they, too, receive or can get the
source code.  And you must show them these terms so they know their
rights.

  We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.

  Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software.  If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.

  Finally, any free program is threatened constantly by software
patents.  We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary.  To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.

  The precise terms and conditions for copying, distribution and
modification follow.

                    GNU GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License.  The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language.  (Hereinafter, translation is included without limitation in
the term "modification".)  Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.

  1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.

You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.

  2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) You must cause the modified files to carry prominent notices
    stating that you changed the files and the date of any change.

    b) You must cause any work that you distribute or publish, that in
    whole or in part contains or is derived from the Program or any
    part thereof, to be licensed as a whole at no charge to all third
    parties under the terms of this License.

    c) If the modified program normally reads commands interactively
    when run, you must cause it, when started running for such
    interactive use in the most ordinary way, to print or display an
    announcement including an appropriate copyright notice and a
    notice that there is no warranty (or else, saying that you provide
    a warranty) and that users may redistribute the program under
    these conditions, and telling the user how to view a copy of this
    License.  (Exception: if the Program itself is interactive but
    does not normally print such an announcement, your work based on
    the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.

In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:

    a) Accompany it with the complete corresponding machine-readable
    source code, which must be distributed under the terms of Sections
    1 and 2 above on a medium customarily used for software interchange; or,

    b) Accompany it with a written offer, valid for at least three
    years, to give any third party, for a charge no more than your
    cost of physically performing source distribution, a complete
    machine-readable copy of the corresponding source code, to be
    distributed under the terms of Sections 1 and 2 above on a medium
    customarily used for software interchange; or,

    c) Accompany it with the information you received as to the offer
    to distribute corresponding source code.  (This alternative is
    allowed only for noncommercial distribution and only if you
    received the program in object code or executable form with such
    an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for
making modifications to it.  For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable.  However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.

If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.

  4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License.  Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.

  5. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Program or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.

  6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.

  7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all.  For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded.  In such case, this License incorporates
the limitation as if written in the body of this License.

  9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

Each version is given a distinguishing version number.  If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation.  If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.

  10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission.  For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this.  Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.

                            NO WARRANTY

  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.

  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    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.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License along
    with this program; if not, write to the Free Software Foundation, Inc.,
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:

    Gnomovision version 69, Copyright (C) year name of author
    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
  `Gnomovision' (which makes passes at compilers) written by James Hacker.

  <signature of Ty Coon>, 1 April 1989
  Ty Coon, President of Vice

This General Public License does not permit incorporating your program into
proprietary programs.  If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
07070100000003000081B40000000000000000000000015FBBE8EE00000039000000000000000000000000000000000000001B00000000spacewalk-backend/Makefile    
NAME := spacewalk-backend

include ../rel-eng/Makefile

   07070100000004000081B40000000000000000000000015FBBE8EE00000B25000000000000000000000000000000000000002300000000spacewalk-backend/Makefile.backend    # Makefile for the backend directory
#
SPACEWALK_FILES = __init__
CODE_DIRS = common server upload_server satellite_tools satellite_exporter po wsgi cdn_tools
PYLINT_DIRS = common upload_server satellite_tools satellite_exporter wsgi
CONF_DIRS = apache-conf rhn-conf logrotate

# We look for config files in "well known" locations (rhn-conf,
# httpd-conf, logrotate)
EXTRA_DIRS = /var/log/rhn /var/log/rhn/reposync /var/cache/rhn /var/cache/rhn/satsync /var/log/rhn/cdnsync

# Docker tests variables
DOCKER_CONTAINER_BASE = uyuni-master
DOCKER_REGISTRY       = registry.mgr.suse.de
DOCKER_RUN_EXPORT     = "PYTHONPATH=/manager/client/rhel/rhnlib/:/manager/client/rhel/rhn-client-tools/src"
DOCKER_VOLUMES        = -v "$(CURDIR)/../:/manager"


all :: all-code all-conf

%-code : Makefile.backend
	@$(foreach d,$(CODE_DIRS), $(MAKE) -C $(d) $* || exit 1; )

%-conf : Makefile.backend
	@$(foreach d,$(CONF_DIRS), $(MAKE) -C $(d) $* || exit 1; )

# now include some Macros
include Makefile.defs

__pylint ::
	$(call update_pip_env)
	pylint --rcfile=pylintrc $(shell find -name '*.py') > reports/pylint.log || true

install :: install-code install-conf

clean :: clean-code clean-conf

test    ::
	$(MAKE) -C common/test/unit-test PYTHON_BIN=$(PYTHON_BIN)
	$(MAKE) -C server/test/unit-test PYTHON_BIN=$(PYTHON_BIN)

unittest ::
	if test -x /usr/bin/unit2 ; then \
		unit2 discover -s satellite_tools/test/unit; \
		unit2 discover -s common/test/unit-test; \
	else \
		$(PYTHON_BIN) -munittest discover -s satellite_tools/test/unit; \
		$(PYTHON_BIN) -munittest discover -s common/test/unit-test; \
	fi

docker_no_db_tests ::
	mkdir -p $(CURDIR)/reports
	@echo "Running satellite_tools/test/unit tests inside of docker $(DOCKER_REGISTRY)/$(DOCKER_CONTAINER_BASE)-pgsql container"
	docker run --rm=true -e $(DOCKER_RUN_EXPORT) $(DOCKER_VOLUMES) $(DOCKER_REGISTRY)/$(DOCKER_CONTAINER_BASE)-pgsql /manager/backend/test/docker-backend-tools-tests.sh
	@echo "Running common/test/unit-test inside of docker $(DOCKER_REGISTRY)/$(DOCKER_CONTAINER_BASE)-pgsql container"
	docker run --rm=true -e $(DOCKER_RUN_EXPORT) $(DOCKER_VOLUMES) $(DOCKER_REGISTRY)/$(DOCKER_CONTAINER_BASE)-pgsql /manager/backend/test/docker-backend-common-tests.sh

docker_pgsql_tests ::
	mkdir -p $(CURDIR)/reports
	@echo "Running Postgresql tests"
	docker run --privileged --rm=true -e $(DOCKER_RUN_EXPORT) $(DOCKER_VOLUMES) $(DOCKER_REGISTRY)/$(DOCKER_CONTAINER_BASE)-pgsql /manager/backend/test/docker-backend-pgsql-tests.sh

docker_pylint ::
	docker run --rm -e $(DOCKER_RUN_EXPORT) $(DOCKER_VOLUMES) $(DOCKER_REGISTRY)/$(DOCKER_CONTAINER_BASE)-pgsql /bin/sh -c "cd /manager/backend; make -f Makefile.backend __pylint"

docker_shell ::
	docker run --rm=true -t -i -e $(DOCKER_RUN_EXPORT) $(DOCKER_VOLUMES) $(DOCKER_REGISTRY)/$(DOCKER_CONTAINER_BASE)-pgsql /bin/bash

test ::
	echo "test"

   07070100000005000081B40000000000000000000000015FBBE8EE000006FA000000000000000000000000000000000000002000000000spacewalk-backend/Makefile.defs   # Common pathnames and programs for the Spacewalk project
#

# if not defined, definit as a noop
TOP		?= .

# global defines which control this build and where we deploy files
ROOT		?= /usr/share/rhn
export ROOT

ifeq ("$(PYTHON_BIN)", "")
    PYTHON_BIN = "python"
endif

SPACEWALK_ROOT	?= $(shell $(PYTHON_BIN) -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")/spacewalk
export SPACEWALK_ROOT

PREFIX		?=
export PREFIX

# Compilation stuff
CC		= gcc
PYTHON_INCLUDE	= -I/usr/include/python$(PythonVersion)
CFLAGS		= -Wall -O2 -fomit-frame-pointer $(PYTHON_INCLUDE) -fPIC
SOFLAGS		= -shared -fPIC

# Installation stuff
INSTALL		= /usr/bin/install -c --verbose
INSTALL_BIN	= $(INSTALL) -m 755
INSTALL_DATA	= $(INSTALL) -m 644
INSTALL_DIR	= $(INSTALL) -m 755 -d

# This is for the subdir part
PYFILES		= $(addsuffix .py,$(FILES))

SPACEWALK_PYFILES		= $(addsuffix .py,$(SPACEWALK_FILES))
SPACEWALK_DEST	?= $(SPACEWALK_ROOT)/$(SUBDIR)

# what do we need to install and where
INSTALL_FILES	+= $(PYFILES)
INSTALL_DEST	?= $(ROOT)/$(SUBDIR)

SPACEWALK_INSTALL_FILES	+= $(SPACEWALK_PYFILES)

DIRS		+= $(addprefix $(PREFIX), \
			$(sort $(EXTRA_DIRS)) $(INSTALL_DEST) $(SPACEWALK_ROOT) $(SPACEWALK_DEST))

all :: $(INSTALL_FILES)

install :: all $(DIRS) $(INSTALL_FILES) $(SPACEWALK_INSTALL_FILES)
	@$(foreach f,$(INSTALL_FILES), \
		$(INSTALL_DATA) $(f) $(PREFIX)$(INSTALL_DEST)/$(f) ; )
	@$(foreach f,$(SPACEWALK_INSTALL_FILES), \
		$(INSTALL_DATA) $(f) $(PREFIX)$(SPACEWALK_DEST)/$(f) ; )

$(DIRS):
	$(INSTALL_DIR) $@

clean ::
	@rm -fv *~ *.pyc *.pyo .??*~
	@rm -fv .\#*
	@rm -fv core

# useful macro
descend-subdirs = @$(foreach d,$(SUBDIRS), $(MAKE) -C $(d) $@ || exit 1; )

# subdirs are treated at the end
all install clean:: $(SUBDIRS)
	$(descend-subdirs)


  07070100000006000081B40000000000000000000000015FBBE8EE00000329000000000000000000000000000000000000002200000000spacewalk-backend/Makefile.python THIS_MAKEFILE := $(realpath $(lastword $(MAKEFILE_LIST)))
CURRENT_DIR := $(dir $(THIS_MAKEFILE))
include $(CURRENT_DIR)../rel-eng/Makefile.python

# Docker tests variables
DOCKER_CONTAINER_BASE = uyuni-master
DOCKER_REGISTRY       = registry.mgr.suse.de
DOCKER_RUN_EXPORT     = "PYTHONPATH=$PYTHONPATH"
DOCKER_VOLUMES        = -v "$(CURDIR)/..:/manager"

__pylint ::
	$(call update_pip_env)
	pylint --rcfile=pylintrc $(shell find -name '*.py') > reports/pylint.log || true

docker_pylint ::
	docker run --rm -e $(DOCKER_RUN_EXPORT) $(DOCKER_VOLUMES) $(DOCKER_REGISTRY)/$(DOCKER_CONTAINER_BASE)-pgsql /bin/sh -c "cd /manager/backend; make -f Makefile.python __pylint"

docker_shell ::
	docker run -t -i --rm -e $(DOCKER_RUN_EXPORT) $(DOCKER_VOLUMES) $(DOCKER_REGISTRY)/$(DOCKER_CONTAINER_BASE)-pgsql /bin/bash
   07070100000007000081B40000000000000000000000015FBBE8EE00000D22000000000000000000000000000000000000001D00000000spacewalk-backend/README.ULN  Unbreakable Linux Network integration for Spacewalk
===================================================

This package contains the ULN plugin for the existing spacewalk-repo-sync
utility. The plugin allows you to synchronize ULN channels directly into Spacewalk
channels without requiring the Spacewalk server to be registered to ULN.

Configuration of the plugin
---------------------------

The plugin only requires very basic configuration via the /etc/rhn/spacewalk-repo-sync/uln.conf file.

[main]
username = <ULN SSO username>
password = <ULN SSO password>

As this file contains login credentials for the Unbreakable Linux Network, we strongly recommend ensuring
read-only access to the user that will run spacewalk-repo-sync by setting file permissions to 0400.

The plugin can also use any proxy configured via /etc/rhn/rhn.conf or the Spacewalk web interface.

Configuration of Spacewalk
--------------------------

The plugin extends the functionality of spacewalk-repo-sync by allowing it to download packages and errata
directly from ULN into an existing Spacewalk Software Channel. The configuration procedure is:

1. Create a Spacewalk Software Channel and ULN-based Repository (using the uln:/// style URL)
2. Run spacewalk-repo-sync to sync packages and errata (if available) from ULN into that channel.

Web Interface Configuration
---------------------------

Configuration of ULN repositories within the Spacewalk web interface is identical to configuring
standard yum repositories, except the URL is specially formatted to point directly to ULN.

When configuring a ULN-based repository, use a URL in the format: uln:///<ULN channel label>.

For example, the Oracle Linux 6 (x86_64) Latest channel on ULN has the label "ol6_x86_64_latest", so the
URL would be uln:///ol6_x86_64_latest in Spacewalk.

You can get a list of available ULN channel labels from the ULN web interface.

Command-Line Usage instructions
-------------------------------

This example assumes you have created a Software Channel in Spacewalk with the Channel Label
of oraclelinux6_x86_64_latest and you want to sync the packages and errata from the ULN channel with the
label of ol6_x86_64_latest into this Software Channel.

You will need to know the channel label of the Spacewalk Software Channel as well as the channel label of the
upstream ULN channel you want to synchronize from.

The format of the spacewalk-repo-sync command is:

# spacewalk-repo-sync --type uln --channel=<spacewalk channel label> --url=uln:///<ULN channel label>

For example, to sync the Oracle Linux 6 (x86_64) Latest channel from ULN, you would run:

# spacewalk-repo-sync --type uln --channel=oraclelinux6_x86_64_latest --url=uln:///ol6_x86_64_latest

The command-line parameters are:

-c CHANNEL_LABEL, --channel=CHANNEL_LABEL
    The label of the Spacewalk channel to sync packages to

-u URL, --url=URL
    The url to sync. ULN channels are specified as uln:///<channel_label>. Note there are three / characters in the URL.

-t REPO_TYPE, --type=REPO_TYPE
     The type of repo. To use direct ULN integration, set this to "uln".

It is recommended that a cronjob be manually configured to run this script at least once a day
to keep the Spacewalk channels up-to-date with ULN either by running the script via cron or scheduling
a repository sync via the Spacewalk Taskomatic engine.
  07070100000008000081B40000000000000000000000015FBBE8EE00000265000000000000000000000000000000000000001E00000000spacewalk-backend/__init__.py #
# Copyright (c) 2009--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
   07070100000009000081B40000000000000000000000015FBBE8EE0000051F000000000000000000000000000000000000001D00000000spacewalk-backend/_apache.py  #!/usr/bin/python
#
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# this is a dummy module that makes pychecker happy and provides
# the _apache module, whcih is normally provided by mod_python
# when a script runs under it

SERVER_RETURN = 0


def log_error(*_args):
    pass


def make_table(*_args):
    pass


def parse_qs(*_args):
    pass


def parse_qsl(*_args):
    pass

status = None
table = None
config_tree = None
server_root = None
mpm_query = None

# Variables for apache 2+
exists_config_define = None
stat = None

AP_CONN_UNKNOWN = None
AP_CONN_CLOSE = None
AP_CONN_KEEPALIVE = None

APR_NOFILE = None
APR_REG = None
APR_DIR = None
APR_CHR = None
APR_BLK = None
APR_PIPE = None
APR_LNK = None
APR_SOCK = None
APR_UNKFILE = None
 0707010000000A000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000001E00000000spacewalk-backend/apache-conf 0707010000000B000081B40000000000000000000000015FBBE8EE000000EC000000000000000000000000000000000000002700000000spacewalk-backend/apache-conf/Makefile    # Makefile for installation of the httpd configuration files
#

# what is the backend top dir
TOP	= ..

APACHECONFDIR	= /etc/httpd/conf.d

INSTALL_FILES	= $(wildcard *.conf)
INSTALL_DEST	= $(APACHECONFDIR)

include $(TOP)/Makefile.defs
0707010000000C000081B40000000000000000000000015FBBE8EE0000061F000000000000000000000000000000000000003700000000spacewalk-backend/apache-conf/aa-spacewalk-server.conf    #
# Workaround to deal with older (yum|dnf)-rhn-plugin issue where the plugin sends
# mildly-malformed HTTP headers, in a way that strict RFC compliance rejects with
# a 400 (See bz1427625)
#
# If httpd is more recent than 2.4.25, it a) has strict-whitespace-enforcement enabled,
# and b) has an option available to relax the restriction. We do so, so that spacewalk
# clients that have not had their yum|dnf-rhn-plugin updated, can still call home.
#
<IfVersion >= 2.4.25>
  HttpProtocolOptions unsafe
</IfVersion>
#
# Some platforms backported the strict-whitespace-enforcement without updating to 2.4.25.
# RHEL added a define to check in this case, _RH_HAS_HTTPPROTOCOLOPTIONS
#
# If an httpd version does NOT have _RH_HAS_HTTPPROTOCOLOPTIONS defined, then the
# option is ignored. If it IS defined, relax the constraints by default
#
<IfDefine _RH_HAS_HTTPPROTOCOLOPTIONS>
  HTTPProtocolOptions unsafe
</IfDefine>
#
# In either case, this setting can be removed only if a) one is certain that every ISO
# and kickstart-tree in use in the spacewalk-server is not (or at least no longer) affected
# by the problem with the plugin, and b) all existing clients have been updated to the
# fixed version of the plugin, as found in f53a791847105cf422f9fbb41dcb41eeb018c6be
#
# yum-rhn-plugin fixed in versions:
# RHEL5  : UNAFFECTED
# RHEL6  : yum-rhn-plugin-0.9.1-61-el6
# RHEL7  : yum-rhn-plugin-2.0.1-7-el7
# FEDORA : yum-rhn-plugin-2.7.1-1
#
# dnf-rhn-plugin fixed in versions:
# RHEL5  : N/A
# RHEL6  : N/A
# RHEL7  : N/A
# FEDORA : dnf-plugin-spacewalk-2.7.4-1
#
 0707010000000D000081B40000000000000000000000015FBBE8EE0000038B000000000000000000000000000000000000003C00000000spacewalk-backend/apache-conf/zz-spacewalk-server-wsgi.conf   <IfModule !wsgi_module>
    LoadModule wsgi_module modules/mod_wsgi.so
</IfModule>

<Directory /usr/share/rhn>
    <IfVersion <= 2.2>
        Order allow,deny
        Allow from all
    </IfVersion>
    <IfVersion >= 2.4>
        Require all granted
    </IfVersion>
</Directory>

WSGIPythonPath "/usr/share/rhn"

WSGIScriptAlias /APP /usr/share/rhn/wsgi/app.py
WSGIScriptAlias /APPLET /usr/share/rhn/wsgi/applet.py
WSGIScriptAlias /CONFIG-MANAGEMENT /usr/share/rhn/wsgi/config.py
WSGIScriptAlias /CONFIG-MANAGEMENT-TOOL /usr/share/rhn/wsgi/config_tool.py
WSGIScriptAlias /PACKAGE-PUSH /usr/share/rhn/wsgi/package_push.py
WSGIScriptAlias /SAT /usr/share/rhn/wsgi/sat.py
WSGIScriptAlias /SAT-DUMP-INTERNAL /usr/share/rhn/wsgi/sat_dump.py
WSGIScriptAlias /XMLRPC /usr/share/rhn/wsgi/xmlrpc.py

<IfVersion >= 2.4>
    <Directory  /usr/share/rhn/wsgi>
        Require all granted
    </Directory>
</IfVersion>

 0707010000000E000081B40000000000000000000000015FBBE8EE0000028F000000000000000000000000000000000000003700000000spacewalk-backend/apache-conf/zz-spacewalk-server.conf    # ** DO NOT EDIT **
# Master configuration file for the rhn_server setup
#

##
## Spacewalk settings
##
#
<IfDefine !ISSUSE>
<VirtualHost *>

<IfModule mod_jk.c>
    # Inherit the mod_jk settings defined in zz-spacewalk-www.conf
    JkMountCopy On
</IfModule>

<Directory "/var/www/html/*">
        AllowOverride all
</Directory>

RewriteEngine on
RewriteOptions inherit
</VirtualHost>

# Override default httpd prefork settings
#
# On SUSE use /etc/apache2/server-tuning.conf
#
<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  200
</IfModule>
</IfDefine>

 0707010000000F000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000001C00000000spacewalk-backend/cdn_tools   07070100000010000081B40000000000000000000000015FBBE8EE0000034A000000000000000000000000000000000000002500000000spacewalk-backend/cdn_tools/Makefile  TOP	= ..

# Specific stuff
SUBDIR	= cdn_tools
SUBDIRS = 
SPACEWALK_FILES	= __init__  constants  manifest \
            activation cdnsync repository common candlepin_api
SCRIPTS = cdn-sync

# check if we can build man pages
DOCBOOK = $(wildcard /usr/bin/docbook2man)

SGMLS	= $(wildcard *.sgml)
MANS	= $(patsubst %.sgml,%.8,$(SGMLS))

BINDIR	= /usr/bin
MANDIR	?= /usr/man

EXTRA_DIRS = $(MANDIR)/man8 $(BINDIR)

include $(TOP)/Makefile.defs

# install scripts
all :: $(SCRIPTS)
install :: $(SCRIPTS) $(PREFIX)/$(BINDIR)
	$(INSTALL_BIN) $(SCRIPTS) $(PREFIX)/$(BINDIR)

ifneq ($(DOCBOOK),)
# install man pages
all	:: $(MANS)
install :: $(MANS) $(PREFIX)/$(MANDIR)
	$(INSTALL_DATA) $(MANS) $(PREFIX)/$(MANDIR)/man8
endif


%.new : %
	sed -e 's|@@ROOT@@|$(ROOT)|g' <$* >$@

%.8 : %.sgml
	$(DOCBOOK) $<

clean ::
	@rm -fv $(MANS) manpage.* *.new

  07070100000011000081B40000000000000000000000015FBBE8EE00000031000000000000000000000000000000000000002800000000spacewalk-backend/cdn_tools/__init__.py   # Copyright (c) 2016 Red Hat, Inc.

__all__ = []
   07070100000012000081B40000000000000000000000015FBBE8EE0000287C000000000000000000000000000000000000002A00000000spacewalk-backend/cdn_tools/activation.py # Copyright (c) 2016--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import sys
import json

from spacewalk.cdn_tools import constants
from spacewalk.cdn_tools.candlepin_api import CandlepinApi
from spacewalk.cdn_tools.common import verify_mappings
from spacewalk.cdn_tools.manifest import Manifest, ManifestValidationError
from spacewalk.satellite_tools import satCerts
from spacewalk.satellite_tools.syncLib import log, log2
from spacewalk.server import rhnSQL
from spacewalk.server.importlib.backendOracle import SQLBackend
from spacewalk.server.importlib.channelImport import ChannelFamilyImport
from spacewalk.server.importlib.importLib import ChannelFamily, ContentSource, ContentSourceSsl
from spacewalk.server.importlib.contentSourcesImport import ContentSourcesImport
from spacewalk.server.rhnServer.satellite_cert import SatelliteCert


class Activation(object):
    """Class inserting channel families and SSL metadata into DB."""

    def __init__(self, manifest_path):
        rhnSQL.initDB()
        self.manifest = Manifest(manifest_path)
        self.sat5_cert = SatelliteCert()
        self.sat5_cert.load(self.manifest.get_satellite_certificate())

        verify_mappings()

        f = None
        # Channel families metadata
        try:
            try:
                f = open(constants.CHANNEL_FAMILY_MAPPING_PATH, 'r')
                self.families = json.load(f)
                f.close()
            except IOError:
                e = sys.exc_info()[1]
                log(1, "Ignoring channel mappings: %s" % e)
                self.families = {}
        finally:
            if f is not None:
                f.close()

        self.families_to_import = []

    @staticmethod
    def _remove_certificates():
        for description_prefix in (constants.CA_CERT_NAME,
                                   constants.CLIENT_CERT_PREFIX,
                                   constants.CLIENT_KEY_PREFIX):

            satCerts.delete_rhnCryptoKey_null_org(description_prefix)

    def _update_certificates(self):
        """Delete and insert certificates needed for syncing from CDN repositories."""

        # Remove all previously used certs/keys
        self._remove_certificates()

        # Read RHSM cert
        f = open(constants.CA_CERT_PATH, 'r')
        try:
            ca_cert = f.read()
        finally:
            if f is not None:
                f.close()

        if not satCerts.verify_certificate_dates(str(ca_cert)):
            log2(0, 0, "WARNING: '%s' certificate is not valid." % constants.CA_CERT_PATH, stream=sys.stderr)
        # Insert RHSM cert and certs from manifest into DB
        satCerts.store_rhnCryptoKey(
            constants.CA_CERT_NAME, ca_cert, None)

        for entitlement in self.manifest.get_all_entitlements():
            creds = entitlement.get_credentials()
            cert_name = constants.CLIENT_CERT_PREFIX + creds.get_id()
            key_name = constants.CLIENT_KEY_PREFIX + creds.get_id()
            if not satCerts.verify_certificate_dates(str(creds.get_cert())):
                log2(0, 0, "WARNING: '%s' certificate is not valid." % cert_name, stream=sys.stderr)
            satCerts.store_rhnCryptoKey(cert_name, creds.get_cert(), None)
            satCerts.store_rhnCryptoKey(key_name, creds.get_key(), None)

    def import_channel_families(self):
        """Insert channel family data into DB."""

        log(1, "Channel families in manifest: %d" % len(self.sat5_cert.channel_families))  # pylint: disable=E1101

        batch = []
        for cf in self.sat5_cert.channel_families:  # pylint: disable=E1101
            label = cf.name
            try:
                family = self.families[label]
                family_object = ChannelFamily()
                for k in list(family.keys()):
                    family_object[k] = family[k]
                family_object['label'] = label
                batch.append(family_object)
                self.families_to_import.append(label)
            except KeyError:
                # While channel mappings are not consistent with certificate generated on RHN...
                msg = ("WARNING: Channel family '%s' is provided by manifest but "
                       "was not found in cdn-sync mappings." % label)
                log2(0, 1, msg, stream=sys.stderr)

        log(1, "Channel families to import: %d" % len(batch))
        # Perform import
        backend = SQLBackend()
        importer = ChannelFamilyImport(batch, backend)
        importer.run()

    @staticmethod
    def _remove_repositories():
        """This method removes repositories obtained from manifest"""
        hdel_repos = rhnSQL.prepare("""
            delete from rhnContentSource where
            label like :prefix || '%%'
            and org_id is null
        """)
        hdel_repos.execute(prefix=constants.MANIFEST_REPOSITORY_DB_PREFIX)
        rhnSQL.commit()

    def _update_repositories(self):
        """Setup SSL credential to access repositories
           We do this in 2 steps:
           1. Fetching provided repositories from manifest - URL contains variables to substitute
           2. Assigning one certificate/key set to each repository"""

        # First delete all repositories from previously used manifests
        self._remove_repositories()

        backend = SQLBackend()
        type_id = backend.lookupContentSourceType('yum')

        # Lookup CA cert
        ca_cert = satCerts.lookup_cert(constants.CA_CERT_NAME, None)
        ca_cert_id = int(ca_cert['id'])

        content_sources_batch = {}
        for entitlement in self.manifest.get_all_entitlements():
            # Lookup SSL certificates and keys
            creds = entitlement.get_credentials()
            client_cert = satCerts.lookup_cert(constants.CLIENT_CERT_PREFIX +
                                               creds.get_id(), None)
            client_key = satCerts.lookup_cert(constants.CLIENT_KEY_PREFIX +
                                              creds.get_id(), None)
            client_cert_id = int(client_cert['id'])
            client_key_id = int(client_key['id'])
            content_source_ssl = ContentSourceSsl()
            content_source_ssl['ssl_ca_cert_id'] = ca_cert_id
            content_source_ssl['ssl_client_cert_id'] = client_cert_id
            content_source_ssl['ssl_client_key_id'] = client_key_id
            # Loop provided products
            for product in entitlement.get_products():
                repositories = product.get_repositories()
                for repository in repositories:
                    if repository not in content_sources_batch:
                        content_source = ContentSource()
                        content_source['label'] = constants.MANIFEST_REPOSITORY_DB_PREFIX + repository
                        content_source['source_url'] = repositories[repository]
                        content_source['org_id'] = None
                        content_source['type_id'] = type_id
                        content_source['ssl-sets'] = [content_source_ssl]
                        content_sources_batch[repository] = content_source
                    # There may be more SSL certs to one repository, append it
                    elif content_source_ssl not in content_sources_batch[repository]['ssl-sets']:
                        content_sources_batch[repository]['ssl-sets'].append(content_source_ssl)

        importer = ContentSourcesImport(list(content_sources_batch.values()), backend)
        importer.run()

    def activate(self):
        if self.manifest.check_signature():
            log(0, "Populating channel families...")
            self.import_channel_families()
            log(0, "Updating certificates...")
            self._update_certificates()
            log(0, "Updating manifest repositories...")
            self._update_repositories()
        else:
            raise ManifestValidationError("Manifest validation failed! Make sure the specified manifest is correct.")

    @staticmethod
    def deactivate():
        """Function to remove certificates and manifest repositories from DB"""
        rhnSQL.initDB()
        log(0, "Removing certificates...")
        Activation._remove_certificates()
        log(0, "Removing manifest repositories...")
        Activation._remove_repositories()

    @staticmethod
    def manifest_info(manifest_path):
        manifest = Manifest(manifest_path)
        log(0, "Name: %s" % manifest.get_name(), cleanYN=1)
        log(0, "UUID: %s" % manifest.get_uuid(), cleanYN=1)
        log(0, "Owner ID: %s" % manifest.get_ownerid(), cleanYN=1)
        log(0, "Satellite version: %s" % manifest.get_satellite_version(), cleanYN=1)
        log(0, "Created: %s" % manifest.get_created(), cleanYN=1)
        log(0, "API URL: %s" % manifest.get_api_url(), cleanYN=1)

    @staticmethod
    def download_manifest(old_manifest_path, http_proxy=None, http_proxy_username=None,
                          http_proxy_password=None):
        manifest = Manifest(old_manifest_path)
        candlepin_api = CandlepinApi(current_manifest=manifest, http_proxy=http_proxy,
                                     http_proxy_username=http_proxy_username,
                                     http_proxy_password=http_proxy_password)
        return candlepin_api.export_manifest()

    @staticmethod
    def refresh_manifest(old_manifest_path, http_proxy=None, http_proxy_username=None,
                         http_proxy_password=None):
        manifest = Manifest(old_manifest_path)
        candlepin_api = CandlepinApi(current_manifest=manifest, http_proxy=http_proxy,
                                     http_proxy_username=http_proxy_username,
                                     http_proxy_password=http_proxy_password)
        return candlepin_api.refresh_manifest()
07070100000013000081B40000000000000000000000015FBBE8EE00001F5A000000000000000000000000000000000000002D00000000spacewalk-backend/cdn_tools/candlepin_api.py  # Copyright (c) 2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import os
import sys
import tempfile

import requests

from spacewalk.cdn_tools.constants import CA_CERT_PATH
from uyuni.common.cli import getUsernamePassword
from spacewalk.common.rhnConfig import CFG
from spacewalk.satellite_tools.syncLib import log, log2


class CandlepinApi(object):
    """Class used to communicate with Candlepin API."""

    def __init__(self, current_manifest=None, username=None, password=None,
                 http_proxy=None, http_proxy_username=None, http_proxy_password=None):
        self.base_url = current_manifest.get_api_url()
        if CFG.CANDLEPIN_SERVER_API:
            log(0, "Overriding Candlepin server to: '%s'" % CFG.CANDLEPIN_SERVER_API)
            self.base_url = CFG.CANDLEPIN_SERVER_API

        if self.base_url.startswith('https'):
            self.protocol = 'https'
        elif self.base_url.startswith('http'):
            self.protocol = 'http'
        else:
            raise ValueError("Invalid protocol in URL: '%s'" % self.base_url)

        if not self.base_url.endswith('/'):
            self.base_url += '/'

        self.current_manifest = current_manifest

        # Authentication with upstream consumer certificate or with username and password
        if self.current_manifest and self.protocol == 'https' and not username:
            self.username = self.password = None
        else:
            log(0, "Candlepin login:")
            self.username, self.password = getUsernamePassword(username, password)

        self.http_proxy = http_proxy
        self.http_proxy_username = http_proxy_username
        self.http_proxy_password = http_proxy_password

    def _get_proxies(self):
        proxies = {}
        if self.http_proxy:
            auth = ""
            if self.http_proxy_username and self.http_proxy_password:
                auth = "%s:%s@" % (self.http_proxy_username, self.http_proxy_password)
            proxy_string = "http://%s%s" % (auth, self.http_proxy)
            proxies["http"] = proxy_string
            proxies["https"] = proxy_string
        return proxies

    def _write_cert(self):
        cert = None
        if self.current_manifest:
            credentials = self.current_manifest.get_consumer_credentials()
            fd, cert_file = tempfile.mkstemp(prefix="/tmp/cert-")
            fo = os.fdopen(fd, 'wb')
            fo.write(credentials.get_cert())
            fo.flush()
            fo.close()

            fd, key_file = tempfile.mkstemp(prefix="/tmp/key-")
            fo = os.fdopen(fd, 'wb')
            fo.write(credentials.get_key())
            fo.flush()
            fo.close()
            cert = (cert_file, key_file)
        return cert

    @staticmethod
    def _delete_cert(cert):
        if cert is not None:
            cert_file, key_file = cert
            if cert_file:
                os.unlink(cert_file)
            if key_file:
                os.unlink(key_file)

    def _call_api(self, url, params=None, method="get"):
        if self.protocol == 'https':
            verify = CA_CERT_PATH
        else:
            verify = False

        response = None
        if self.username is not None and self.password is not None:
            try:
                if method == "get":
                    response = requests.get(url, params=params, proxies=self._get_proxies(),
                                            auth=(self.username, self.password), verify=verify)
                elif method == "put":
                    response = requests.put(url, params=params, proxies=self._get_proxies(),
                                            auth=(self.username, self.password), verify=verify)
                else:
                    raise ValueError("Unsupported method: '%s'" % method)
            except requests.RequestException:
                e = sys.exc_info()[1]
                log2(0, 0, "ERROR: %s" % str(e), stream=sys.stderr)
        else:
            cert = self._write_cert()
            try:
                try:
                    if method == "get":
                        response = requests.get(url, params=params, proxies=self._get_proxies(),
                                                verify=verify, cert=cert)
                    elif method == "put":
                        response = requests.put(url, params=params, proxies=self._get_proxies(),
                                                verify=verify, cert=cert)
                    else:
                        raise ValueError("Unsupported method: '%s'" % method)
                except requests.RequestException:
                    e = sys.exc_info()[1]
                    log2(0, 0, "ERROR: %s" % str(e), stream=sys.stderr)
            finally:
                self._delete_cert(cert)
        return response

    def export_manifest(self, uuid=None, ownerid=None, satellite_version=None):
        """Performs export request to Candlepin API and saves exported manifest to target file.
           Can take required parameters from current manifest or override them with parameters of this method."""
        if uuid is None:
            if self.current_manifest:
                uuid = self.current_manifest.get_uuid()
            else:
                raise ValueError("Uuid is not known.")
        if ownerid is None:
            if self.current_manifest:
                ownerid = self.current_manifest.get_ownerid()
            else:
                raise ValueError("Ownerid is not known.")
        if satellite_version is None:
            if self.current_manifest:
                satellite_version = self.current_manifest.get_satellite_version()
            else:
                raise ValueError("Satellite version is not known.")

        url = "%s%s/export" % (self.base_url, uuid)
        params = {"ext": ["ownerid:%s" % ownerid, "version:%s" % satellite_version]}

        log(1, "URL: '%s'" % url)
        log(1, "Parameters: '%s'" % str(params))

        response = self._call_api(url, params=params, method="get")

        if response is not None:
            # pylint: disable=E1101
            if response.status_code == requests.codes.ok:
                fd, downloaded_manifest = tempfile.mkstemp(prefix="/tmp/manifest-", suffix=".zip")
                fo = os.fdopen(fd, 'wb')
                for chunk in response:
                    fo.write(chunk)
                fo.flush()
                fo.close()
                return downloaded_manifest
            else:
                log2(0, 0, "Status code: %s" % response.status_code, stream=sys.stderr)
                log2(0, 0, "Message: '%s'" % response.text, stream=sys.stderr)

        return None

    def refresh_manifest(self, uuid=None):
        if uuid is None:
            if self.current_manifest:
                uuid = self.current_manifest.get_uuid()
            else:
                raise ValueError("Uuid is not known.")

        url = "%s%s/certificates" % (self.base_url, uuid)

        log(1, "URL: '%s'" % url)

        response = self._call_api(url, method="put")

        if response is not None:
            # pylint: disable=E1101
            if response.status_code == requests.codes.ok or response.status_code == requests.codes.no_content:
                return True
            else:
                log2(0, 0, "Status code: %s" % response.status_code, stream=sys.stderr)
                log2(0, 0, "Message: '%s'" % response.text, stream=sys.stderr)

        return False
  07070100000014000081FD0000000000000000000000015FBBE8EE00002948000000000000000000000000000000000000002500000000spacewalk-backend/cdn_tools/cdn-sync  #!/usr/bin/python

import argparse
import sys
import os

from spacewalk.common.rhnConfig import CFG, initCFG
from uyuni.common.fileutils import cleanupAbsPath
from spacewalk.cdn_tools.common import CustomChannelSyncError, CdnMappingsLoadError, CountingPackagesError
from spacewalk.cdn_tools.cdnsync import CdnSync
from spacewalk.server import rhnSQL
from uyuni.common.usix import raise_with_tb
from rhn import rhnLockfile
from rhn.connections import idn_ascii_to_puny
from spacewalk.server.importlib.importLib import InvalidArchError, \
    InvalidChannelError, InvalidChannelFamilyError, MissingParentChannelError


def system_exit(code, msgs=None):
    """Exit with a code and optional message(s). Saved a few lines of code."""

    if msgs:
        if type(msgs) not in [type([]), type(())]:
            msgs = (msgs, )
        for msg in msgs:
            sys.stderr.write(str(msg) + '\n')
    sys.exit(code)


def process_commandline():
    """process the commandline, setting the CFG object"""

    initCFG('server.satellite')
    CFG.ENABLE_NVREA = 1
    parser = argparse.ArgumentParser()
    parser.add_argument("-l", "--list-channels", action="store_true", help="List channels available to sync.")
    parser.add_argument("-r", "--show-repos", action="store_true",
                        help="Show all repositories assigned to channels for debug purposes. Use together with "
                             "--list-channels or --cdn-certs.")
    parser.add_argument("-c", "--channel", action="append", help="Sync this channel only.")
    parser.add_argument("-m", "--mount-point", action="store", help="Source mount point for import from Content ISO")
    parser.add_argument("--consider-full", action="store_true",
                        help="Mount point will be considered to contain full channels.")
    parser.add_argument("-a", "--add-repo", action="append", help="Attach specified CDN repository to custom channel.")
    parser.add_argument("-d", "--delete-repo", action="append",
                        help="Delete specified CDN repository from custom channel.")
    parser.add_argument("--email", action="store_true", help="e-mail a report of what was synced/imported")
    parser.add_argument("--traceback-mail", action="store",
                        help="alternative email address(es) for sync output (--email option)")
    parser.add_argument("--no-packages", action="store_true", help="Do not sync packages.")
    parser.add_argument("--no-errata", action="store_true", help="Do not sync errata.")
    parser.add_argument("--no-kickstarts", action="store_true", help="Do not sync kickstart repositories.")
    parser.add_argument("--force-all-errata", action="store_true", help="Process metadata of all errata, "
                                                                        "not only missing.")
    parser.add_argument("--force-kickstarts", action="store_true", help="Overwrite kickstart files.")
    parser.add_argument("--clear-cache", action="store_true", help="Delete partially synced channels.")
    parser.add_argument('--http-proxy', action='store', help="alternative http proxy (hostname:port)")
    parser.add_argument('--http-proxy-username', action='store', help="alternative http proxy username")
    parser.add_argument('--http-proxy-password', action='store', help="alternative http proxy password")
    parser.add_argument('-p', '--print-configuration', action='store_true', help='print the configuration and exit')
    parser.add_argument('--count-packages', action='store_true', help="Count number of packages in all "
                        "repositories for every channel")
    parser.add_argument("--no-rpms", action="store_true", help="Do not keep RPMs on disk after DB import (debug only)")
    parser.add_argument("--batch-size", action="store", help="max. batch size for package import (debug only)")
    parser.add_argument("-v", "--verbose", action='count', help="Verbose output. Possible to accumulate: -vvv")
    parser.add_argument("--cdn-certs", action="store_true",
                        help="Print details about currently used SSL certificates for accessing CDN.")
    parser.add_argument("--list-eol", action="store_true",
                        help="List end-of-life info about (some) channels available to sync.")

    cmd_args = parser.parse_args()

    if cmd_args.print_configuration:
        CFG.show()
        sys.exit(0)

    if cmd_args.http_proxy:
        try:
            int(cmd_args.http_proxy.split(':')[1])
        except ValueError:
            system_exit(1, "Incorrect proxy port number: %s" % cmd_args.http_proxy.split(':')[1])
        CFG.set("HTTP_PROXY", idn_ascii_to_puny(cmd_args.http_proxy))
        CFG.set("HTTP_PROXY_USERNAME", cmd_args.http_proxy_username)
        CFG.set("HTTP_PROXY_PASSWORD", cmd_args.http_proxy_password)

    CFG.set("TRACEBACK_MAIL", cmd_args.traceback_mail or CFG.TRACEBACK_MAIL)

    if cmd_args.mount_point:
        cmd_args.mount_point = cleanupAbsPath(cmd_args.mount_point)
        if not os.path.isdir(cmd_args.mount_point):
            system_exit(1, "Invalid mount point: %s" % cmd_args.mount_point)

    if cmd_args.channel:
        cmd_args.channel = set(cmd_args.channel)

    if cmd_args.batch_size:
        try:
            batch_size = int(cmd_args.batch_size)
            if batch_size <= 0:
                raise ValueError()
        except ValueError:
            system_exit(1, "Invalid batch size: %s" % cmd_args.batch_size)

    return cmd_args


def getDbIssParent():
    rhnSQL.initDB()
    sql = "select label from rhnISSMaster where is_current_master = 'Y'"
    h = rhnSQL.prepare(sql)
    h.execute()
    row = h.fetchone_dict()
    if not row:
        return None
    return row['label']


if __name__ == '__main__':
    LOCK = None
    try:
        # quick check to see if you are a super-user.
        if os.getuid() != 0:
            sys.stderr.write("ERROR: must be root to execute\n")
            sys.exit(8)

        # acquire lock/check for other instances of cdn-sync
        #   i.e., lock against multiple instances of cdn-sync
        LOCK = rhnLockfile.Lockfile('/var/run/cdn-sync.pid')

        args = process_commandline()

        if CFG.get('disconnected') == 1:
            system_exit(1, 'ERROR: the Satellite server is installed in disconnected mode, cannot continue syncing '
                        'from CDN')

        if getDbIssParent() or (CFG.get('iss_parent') and CFG.get('disable_iss') == 0):
            parent = getDbIssParent()
            if not parent:
                parent = CFG.get('iss_parent')
            system_exit(1, 'ERROR: the Satellite server is registered to a parent Satellite "%s".\nTo sync content '
                        'from the parent Satellite via Inter-Satellite-Sync, please, use the "satellite-sync" command' %
                        parent)

        cdnsync = CdnSync(no_packages=args.no_packages, no_errata=args.no_errata,
                          no_rpms=args.no_rpms, no_kickstarts=args.no_kickstarts,
                          log_level=args.verbose, mount_point=args.mount_point,
                          consider_full=args.consider_full,
                          force_all_errata=args.force_all_errata,
                          force_kickstarts=args.force_kickstarts,
                          email=args.email, import_batch_size=args.batch_size)

        error_messages = []
        if args.list_channels:
            if args.count_packages:
                cdnsync.count_packages(channels=args.channel)
            cdnsync.print_channel_tree(repos=args.show_repos)
        elif args.count_packages:
            cdnsync.count_packages(channels=args.channel)
        elif args.clear_cache:
            cdnsync.clear_cache()
        elif args.cdn_certs:
            cdnsync.print_cdn_certificates_info(repos=args.show_repos)
        elif args.list_eol:
            cdnsync.print_eol_channel_list()
        elif args.add_repo or args.delete_repo:
            error_messages = cdnsync.setup_repos_and_sync(channels=args.channel, add_repos=args.add_repo,
                                                          delete_repos=args.delete_repo)
        else:
            error_messages = cdnsync.sync(channels=args.channel)

        cdnsync.send_email(additional_messages=error_messages)

        if error_messages:
            system_exit(1, error_messages)

        LOCK.release()

    except KeyboardInterrupt:
        system_exit(1, "\nProcess has been interrupted.")
    except SystemExit:
        e = sys.exc_info()[1]
        if LOCK:
            LOCK.release()
        sys.exit(e.code)
    except rhnLockfile.LockfileLockedException:
        system_exit(1, "SYNC ERROR: attempting to run more than one instance of cdn-sync. Exiting.")
    except CustomChannelSyncError:
        e = sys.exc_info()[1]
        if LOCK:
            LOCK.release()
        system_exit(13, ["ERROR: custom CDN repository sync failed: ", e])
    except (MissingParentChannelError, InvalidChannelFamilyError,
            InvalidChannelError, InvalidArchError):
        e = sys.exc_info()[1]
        if LOCK:
            LOCK.release()
        system_exit(1, "SYNC ERROR: %s. Exiting." % str(e))
    except rhnSQL.SQLError:
        e = sys.exc_info()[1]
        if LOCK:
            LOCK.release()
        system_exit(20, ["DATABASE ERROR: %s. " % str(e), "Check if your database is running."])
    except CdnMappingsLoadError:
        e = sys.exc_info()[1]
        system_exit(30, ["ERROR: %s" % str(e)])
    except IOError:
        e = sys.exc_info()[1]
        if LOCK:
            LOCK.release()
        # Broken pipe
        if e.errno != 32:
            raise_with_tb(Exception("SYNC ERROR: attempting to display as much information as possible\n %s" % str(e)),
                          sys.exc_info()[2])
    except CountingPackagesError:
        e = sys.exc_info()[1]
        if LOCK:
            LOCK.release()
        system_exit(20, "ERROR: Problem occurred during package counting: %s" % str(e))
    except EOFError:
        e = sys.exc_info()[0]
        if LOCK:
            LOCK.release()
        system_exit(40, "SYNC ERROR: Perhaps checksum_cache is corrupted? Remove /var/cache/rhn/reposync/checksum_cache and retry.\n%s" % str(e))

    except Exception:
        e = sys.exc_info()[1]
        if LOCK:
            LOCK.release()
        raise_with_tb(Exception("SYNC ERROR: attempting to display as much information as possible\n %s" % str(e)),
                      sys.exc_info()[2])
else:
    raise ImportError("module cannot be imported")
07070100000015000081B40000000000000000000000015FBBE8EE00003659000000000000000000000000000000000000002A00000000spacewalk-backend/cdn_tools/cdn-sync.sgml <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [
<!ENTITY RHNSAT "Red Hat Satellite Server" >
<!ENTITY CDNSYNC "Red Hat Satellite Incremental Synchronization Tool for Red Hat CDN repositories ">

]>
<refentry>

<RefMeta>
<RefEntryTitle>cdn-sync</RefEntryTitle><manvolnum>8</manvolnum>
<RefMiscInfo>Version 1.0.0</RefMiscInfo>
</RefMeta>

<RefNameDiv>
<RefName><command>cdn-sync</command></RefName>
<RefPurpose>
Incrementally synchronize an Red Hat Satellite's RPM repository with Red Hat's CDN RPM repository.
</RefPurpose>
</RefNameDiv>

<RefSynopsisDiv>
<Synopsis>
    <cmdsynopsis>
        <command>cdn-sync</command>
        <arg>options <replaceable>...</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-l</arg> <arg>--list-channels</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-r</arg> <arg>--show-repos</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-c<replaceable> CHANNEL</replaceable></arg>
        <arg>--channel=<replaceable>CHANNEL</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-m<replaceable> MOUNT_POINT</replaceable></arg>
        <arg>--mount-point=<replaceable>MOUNT_POINT</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--consider-full</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-p</arg> <arg>--print-configuration</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-a<replaceable> REPO</replaceable></arg>
        <arg>--add-repo=<replaceable>REPO</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-d<replaceable> REPO</replaceable></arg>
        <arg>--delete-repo=<replaceable>REPO</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--email</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--traceback-mail=<replaceable>EMAIL_ADDESS(ES)</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--no-rpms</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--no-packages</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--no-errata</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--no-kickstarts</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--force-all-errata</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--force-kickstarts</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--http-proxy<replaceable> HTTP_PROXY_HOSTNAME:PORT</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--http-proxy-username<replaceable> HTTP_PROXY_USERNAME</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--http-proxy-password<replaceable> HTTP_PROXY_PASSWORD</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--batch-size=<replaceable>BATCH_SIZE</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-h</arg> <arg>--help</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--count-packages</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--clear-cache</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-v</arg> <arg>--verbose</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--cdn-certs</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--list-eol</arg>
    </cmdsynopsis>
</Synopsis>
</RefSynopsisDiv>

<RefSect1><Title>Description</Title>
<para>
    The &CDNSYNC; (<emphasis>cdn-sync</emphasis>) synchronizes
    a &RHNSAT; with Red Hat's CDN servers.
</para>
<para>
    This tool enables a &RHNSAT; to update its database metadata and
    RPM packages with that of Red Hat. This action can be performed via
    the internet (ie. directly). To use this tool a &RHNSAT; must be
    registered to RHSM and must not be registered to another &RHNSAT;.
    For live content synchronizing via Inter-Satelite-Sync (ISS),
    or from local content on disk, please, use <emphasis>satellite-sync</emphasis>.
</para>
<para>
        <simplelist>
            <member>o channels: sync channel data</member>
        </simplelist>
        <simplelist>
            <member>o rpms: sync (fetch) rpms</member>
        </simplelist>
        <simplelist>
            <member>o packages: sync full package metadata for those rpms fetched successfully</member>
        </simplelist>
        <simplelist>
            <member>o errata: sync errata data</member>
        </simplelist>
        <simplelist>
            <member>o kickstarts: sync kickstart data</member>
        </simplelist>
</para>
</RefSect1>

<RefSect1><Title>Options</Title>
<variablelist>
    <varlistentry>
        <term>-h, --help</term>
        <listitem>
            <para>Display the help screen with a list of options.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--count-packages</term>
        <listitem>
            <para>Count number of packages in all repositories for every channel.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-l, --list-channels</term>
        <listitem>
            <para>list all available channels for import/syncing and exit. Output in format:</para>
            <para>STATUS NAME NUMBER_PACKAGES</para>
            <para>STATUS: 'p' = previously imported/synced channel, '.' = channel not yet imported/synced.</para>
            <para>NUMBER_PACKAGES: '?' = No CDN source provided to count number of packages, '0' = no packages
            in channel OR packages are not counted yet (it's necessary to run cdn-sync with --count-packages),
            number of packages.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-r, --show-repos</term>
        <listitem>
            <para>Show all repositories assigned to channels for debug purposes. Use together with
                  --list-channels or --cdn-certs.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-c, --channel<replaceable> CHANNEL</replaceable></term>
        <listitem>
            <para>process data for this channel only.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-m, --mount-point<replaceable> MOUNT_POINT</replaceable></term>
        <listitem>
            <para>Source mount point for import from Content ISO.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--consider-full</term>
        <listitem>
            <para>When this option is used, channels being synced from Content ISO mount point will be considered to be
            full channels. Any package in channel but not in the mounted ISO will be deleted. Without this option the
            Content ISO is interpreted as Incremental Content ISO. This option makes sense only together with --mount-point.
            Live sync is always considered as full sync.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-p, --print-configuration</term>
        <listitem>
            <para>print the current configuration and exit.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-a, --add-repo<replaceable> REPO</replaceable></term>
        <listitem>
            <para>Attach specified CDN repository to custom channel. Single custom channel has to be specified using
            --channel parameter. This parameter can be specified multiple times to attach multiple repositories.
            After repositories are attached, sync of channel is processed. On next run, channel can be synced directly
            using --channel parameter. Only CDN repositories not attached to channels provided by cdn-sync mappings
            can be attached to custom channels.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-d, --delete-repo<replaceable> REPO</replaceable></term>
        <listitem>
            <para>Delete specified CDN repository from custom channel. Single custom channel has to be specified using
            --channel parameter. This parameter can be specified multiple times to delete multiple repositories.
            After repositories are deleted, sync of channel is processed. On next run, channel can be synced directly
            using --channel parameter.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--email</term>
        <listitem>
            <para>e-mail a report of what was synced/imported (sent to whomever
            is considered the receiver of "traceback_mail").</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--traceback-mail=<replaceable>EMAIL_ADDRESS(ES)</replaceable></term>
        <listitem>
            <para>alternative email address(es) for all sync correspondence.
            Example: --traceback-mail="user1@example.com, user2@example.com".</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--no-rpms</term>
        <listitem>
            <para>do not keep downloaded RPMs on disk after DB import (debug only).</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--no-packages</term>
        <listitem>
            <para>do not process full package metadata.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--no-errata</term>
        <listitem>
            <para>do not process errata data.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--no-kickstarts</term>
        <listitem>
            <para>do not process kickstart data (provisioning feature).</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--force-all-errata</term>
        <listitem>
            <para>process metadata of all errata, not only missing.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--force-kickstarts</term>
        <listitem>
            <para>download and overwrite existing kickstart data.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--http-proxy<replaceable> HTTP_PROXY_HOSTNAME:PORT</replaceable></term>
        <listitem>
             <para>alternative http proxy address and port (hostname:port)</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--http-proxy-username<replaceable> HTTP_PROXY_USERNAME</replaceable></term>
        <listitem>
            <para>alternative http proxy username</para>
        </listitem>
    </varlistentry>

    <varlistentry>
        <term>--http-proxy-password<replaceable> HTTP_PROXY_PASSWORD</replaceable></term>
        <listitem>
            <para>alternative http proxy password</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--batch-size=<replaceable>BATCH_SIZE</replaceable></term>
        <listitem>
            <para>maximum batch size for package import</para>
            <para>This option should not be used except for debugging
            purposes. The most useful case being --batch-size=1 where the
            database import process each piece of meta-data one at a time,
            isolating any issues.</para>
            <para>WARNING: --batch-size=1 will dramatically slow down the
            sync process.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-v, --verbose</term>
        <listitem>
            <para>Verbose output. Possible to accumulate: -vvv.</para>
        </listitem>
    </varlistentry>

    <varlistentry>
        <term>--clear-cache</term>
        <listitem>
            <para>Delete partially synced channels.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--cdn-certs</term>
        <listitem>
            <para>Print details about currently used SSL certificates for accessing CDN.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--list-eol</term>
        <listitem>
            <para>List end-of-life info about (some) channels available to sync.</para>
        </listitem>
    </varlistentry>
</variablelist>
</RefSect1>

<RefSect1><Title>Configuration files</Title>
<variablelist>
    <varlistentry>
        <term>/etc/rhn/rhn.conf</term>
        <listitem>
            <variablelist>
                <varlistentry>
                    <term>server.satellite.reposync_download_threads = 5</term>
                    <listitem>
                        <para>Set maximum number of threads to be used for simultaneous downloads.</para>
                    </listitem>
                </varlistentry>
            </variablelist>
        </listitem>
    </varlistentry>
</variablelist>
</RefSect1>

<RefSect1><Title>Examples</Title>
<simplelist>
        <member><command>cdn-sync --count-packages</command></member>
        <member><command>cdn-sync --list-channels</command></member>
        <member><command>cdn-sync --list-channels --show-repos</command></member>
        <member><command>cdn-sync --channel rhel-i386-server-6</command></member>
        <member><command>cdn-sync # syncs all previously synced channels</command></member>
        <member><command>cdn-sync -c rhel-i386-server-6 -c rhel-i386-server-5</command></member>
        <member><command>cdn-sync -c my-custom-channel --add-repo /content/dist/rhel/server/6/6Server/x86_64/sat-tools/6.2/os</command></member>
        <member><command>cdn-sync -c my-custom-channel # syncs custom channel with all previously added CDN repositories</command></member>
        <member><command>cdn-sync -c my-custom-channel -d /content/dist/rhel/server/6/6Server/x86_64/sat-tools/6.2/os</command></member>
</simplelist>
</RefSect1>

<RefSect1><Title>See Also</Title>
<simplelist>
    <member>rhn-satellite-activate(8)</member>
    <member>rhnpush(8)</member>
    <member>spacewalk-repo-sync(8)</member>
</simplelist>
</RefSect1>

<RefSect1><Title>Authors</Title>
<simplelist>
    <member>Gennadii Altukhov <email>galt@redhat.com</email></member>
    <member>Jan Dobes <email>jdobes@redhat.com</email></member>
</simplelist>
</RefSect1>
</RefEntry>

<!--
vim: sw=4
-->
   07070100000016000081B40000000000000000000000015FBBE8EE0000AA14000000000000000000000000000000000000002700000000spacewalk-backend/cdn_tools/cdnsync.py    # Copyright (c) 2016--2018 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import json
import errno
import os
import sys
import fnmatch
from datetime import datetime, timedelta

from . import constants
from spacewalk.common.rhnConfig import CFG, initCFG, PRODUCT_NAME
from spacewalk.common import rhnLog
from spacewalk.server import rhnSQL
from spacewalk.server.rhnChannel import channel_info
from spacewalk.server.importlib.backendOracle import SQLBackend
from spacewalk.server.importlib.contentSourcesImport import ContentSourcesImport
from spacewalk.server.importlib.channelImport import ChannelImport
from spacewalk.server.importlib.productNamesImport import ProductNamesImport
from spacewalk.server.importlib.importLib import Channel, ChannelFamily, \
    ProductName, DistChannelMap, ReleaseChannelMap
from spacewalk.satellite_tools import reposync
from spacewalk.satellite_tools import contentRemove
from spacewalk.satellite_tools.download import ThreadedDownloader, ProgressBarLogger
from spacewalk.satellite_tools.satCerts import get_certificate_info, verify_certificate_dates
from spacewalk.satellite_tools.syncLib import log, log2disk, log2, initEMAIL_LOG, log2email, log2background
from spacewalk.satellite_tools.repo_plugins import yum_src

from .common import CustomChannelSyncError, CountingPackagesError, verify_mappings, human_readable_size
from .repository import CdnRepositoryManager, CdnRepositoryNotFoundError


class CdnSync(object):
    """Main class of CDN sync run."""

    log_path = '/var/log/rhn/cdnsync.log'

    def __init__(self, no_packages=False, no_errata=False, no_rpms=False, no_kickstarts=False,
                 log_level=None, mount_point=None, consider_full=False, force_kickstarts=False,
                 force_all_errata=False, email=False, import_batch_size=None):

        if log_level is None:
            log_level = 0
        self.log_level = log_level
        CFG.set('DEBUG', log_level)
        self.email = email
        if self.email:
            initEMAIL_LOG()
        rhnLog.initLOG(self.log_path, self.log_level)
        log2disk(0, "Command: %s" % str(sys.argv))

        rhnSQL.initDB()
        initCFG('server.satellite')

        self.cdn_repository_manager = CdnRepositoryManager(mount_point)
        self.no_packages = no_packages
        self.no_errata = no_errata
        self.no_rpms = no_rpms
        if self.no_packages and self.no_rpms:
            log(0, "Parameter --no-rpms has no effect.")
        self.no_kickstarts = no_kickstarts
        self.force_all_errata = force_all_errata
        self.force_kickstarts = force_kickstarts
        if self.no_kickstarts and self.force_kickstarts:
            log(0, "Parameter --force-kickstarts has no effect.")

        if mount_point:
            self.mount_point = "file://" + mount_point
            self.consider_full = consider_full
        else:
            self.mount_point = CFG.CDN_ROOT
            self.consider_full = True

        verify_mappings()

        f = None
        # try block in try block - this is hack for python 2.4 compatibility
        # to support finally
        try:
            try:
                # Channel families mapping to channels
                f = open(constants.CHANNEL_FAMILY_MAPPING_PATH, 'r')
                self.families = json.load(f)
                f.close()

                # Channel metadata
                f = open(constants.CHANNEL_DEFINITIONS_PATH, 'r')
                self.channel_metadata = json.load(f)
                f.close()

                # Dist/Release channel mapping
                f = open(constants.CHANNEL_DIST_MAPPING_PATH, 'r')
                self.channel_dist_mapping = json.load(f)
                f.close()

                # Kickstart metadata
                f = open(constants.KICKSTART_DEFINITIONS_PATH, 'r')
                self.kickstart_metadata = json.load(f)
                f.close()
            except IOError:
                e = sys.exc_info()[1]
                log(1, "Ignoring channel mappings: %s" % e)
                self.families = {}
                self.channel_metadata = {}
                self.channel_dist_mapping = {}
                self.kickstart_metadata = {}
        finally:
            if f is not None:
                f.close()

        # Map channels to their channel family
        self.channel_to_family = {}
        for family in self.families:
            for channel in self.families[family]['channels']:
                self.channel_to_family[channel] = family

        # Set already synced channels, entitled null-org channels and custom channels with associated
        # CDN repositories
        h = rhnSQL.prepare("""
            select distinct c.label, c.org_id
            from rhnChannelFamilyPermissions cfp inner join
                 rhnChannelFamily cf on cfp.channel_family_id = cf.id inner join
                 rhnChannelFamilyMembers cfm on cf.id = cfm.channel_family_id inner join
                 rhnChannel c on cfm.channel_id = c.id
            where c.org_id is null
              or (c.org_id is not null and 
                  exists (
                          select cs.id
                          from rhnContentSource cs inner join
                               rhnChannelContentSource ccs on ccs.source_id = cs.id
                          where ccs.channel_id = c.id
                            and cs.org_id is null
                         )
                 )
            order by c.org_id nulls first, label
        """)
        h.execute()
        channels = h.fetchall_dict() or []
        self.synced_channels = {}
        for channel in channels:
            # Custom channel repositories not available, don't mark as synced
            if channel['org_id']:
                repos = self.cdn_repository_manager.list_associated_repos(channel['label'])
                if not all([self.cdn_repository_manager.check_repository_availability(r) for r in repos]):
                    continue
            self.synced_channels[channel['label']] = channel['org_id']

        # Select available channel families from DB
        h = rhnSQL.prepare("""
            select distinct label
            from rhnChannelFamilyPermissions cfp inner join
                 rhnChannelFamily cf on cfp.channel_family_id = cf.id
            where cf.org_id is null
        """)
        h.execute()
        families = h.fetchall_dict() or []
        self.entitled_families = [f['label'] for f in families]
        self.import_batch_size = import_batch_size

    def _tree_available_channels(self):
        # collect all channel from available families
        all_channels = []
        channel_tree = {}
        # Not available parents of child channels
        not_available_channels = []
        for label in self.entitled_families:
            try:
                family = self.families[label]
            except KeyError:
                log2(2, 2, "WARNING: Can't find channel family in mappings: %s" % label, stream=sys.stderr)
                continue
            channels = [c for c in family['channels'] if c is not None]
            all_channels.extend(channels)

        # filter available channels
        all_channels = [x for x in all_channels if
                        self.cdn_repository_manager.check_channel_availability(x, self.no_kickstarts)]

        for base_channel in [x for x in all_channels if not self.channel_metadata[x]['parent_channel']]:
            channel_tree[base_channel] = []
        for child_channel in [x for x in all_channels if self.channel_metadata[x]['parent_channel']]:
            parent_channel = self.channel_metadata[child_channel]['parent_channel']
            # Parent not available, orphaned child channel
            if parent_channel not in channel_tree:
                channel_tree[parent_channel] = []
                not_available_channels.append(parent_channel)
            channel_tree[parent_channel].append(child_channel)

        return channel_tree, not_available_channels

    def _list_available_channels(self):
        channel_tree, not_available_channels = self._tree_available_channels()
        # Collect all channels
        channel_list = []
        for base_channel in channel_tree:
            channel_list.extend(channel_tree[base_channel])
            if base_channel not in not_available_channels:
                channel_list.append(base_channel)
        return channel_list

    def _can_add_repos(self, db_channel, repos):
        # Adding custom repositories to custom channel, need to check:
        # 1. Repositories availability - if there are SSL certificates for them
        # 2. Channel is custom
        # 3. Repositories are not already associated with any channels in mapping files
        if not db_channel or not db_channel['org_id']:
            log2(0, 0, "ERROR: Channel doesn't exist or is not custom.", stream=sys.stderr)
            return False
        # Repositories can't be part of any channel from mappings
        channels = []
        for repo in repos:
            channels.extend(self.cdn_repository_manager.list_channels_containing_repository(repo))
        if channels:
            log2(0, 0, "ERROR: Specified repositories can't be synced because they are part of following channels: %s" %
                 ", ".join(channels), stream=sys.stderr)
            return False
        # Check availability of repositories
        not_available = []
        for repo in repos:
            if not self.cdn_repository_manager.check_repository_availability(repo):
                not_available.append(repo)
        if not_available:
            log2(0, 0, "ERROR: Following repositories are not available: %s" % ", ".join(not_available),
                 stream=sys.stderr)
            return False
        return True

    def _is_channel_available(self, label):
        # Checking channel availability, it means either:
        # 1. Trying to sync custom channel - in this case, it has to have already associated CDN repositories,
        #    it's ensured by query populating synced_channels variable
        # 2. Trying to sync channel from mappings - it may not exists so we check requirements from mapping files
        db_channel = channel_info(label)
        if db_channel and db_channel['org_id']:
            # Custom channel doesn't have any null-org repositories assigned
            if label not in self.synced_channels:
                log2(0, 0, "ERROR: Custom channel '%s' doesn't contain any CDN repositories." % label,
                     stream=sys.stderr)
                return False
        else:
            if label not in self.channel_metadata:
                log2(1, 1, "WARNING: Channel '%s' not found in channel metadata mapping." % label, stream=sys.stderr)
                return False
            elif label not in self.channel_to_family:
                log2(0, 0, "ERROR: Channel '%s' not found in channel family mapping." % label, stream=sys.stderr)
                return False
            family = self.channel_to_family[label]
            if family not in self.entitled_families:
                log2(0, 0, "ERROR: Channel family '%s' containing channel '%s' is not entitled." % (family, label),
                     stream=sys.stderr)
                return False
            elif not self.cdn_repository_manager.check_channel_availability(label, self.no_kickstarts):
                log2(0, 0, "ERROR: Channel '%s' repositories are not available." % label, stream=sys.stderr)
                return False
        return True

    def _update_product_names(self, channels):
        backend = SQLBackend()
        batch = []

        for label in channels:
            channel = self.channel_metadata[label]
            if channel['product_label'] and channel['product_name']:
                product_name = ProductName()
                product_name['label'] = channel['product_label']
                product_name['name'] = channel['product_name']
                batch.append(product_name)

        importer = ProductNamesImport(batch, backend)
        importer.run()

    def _update_channels_metadata(self, channels):
        # First populate rhnProductName table
        self._update_product_names(channels)

        backend = SQLBackend()
        channels_batch = []
        content_sources_batch = []

        for label in channels:
            channel = self.channel_metadata[label]
            channel_object = Channel()
            for k in list(channel.keys()):
                channel_object[k] = channel[k]

            family_object = ChannelFamily()
            family_object['label'] = self.channel_to_family[label]

            channel_object['families'] = [family_object]
            channel_object['label'] = label
            channel_object['basedir'] = '/'

            # Backend expects product_label named as product_name
            # To have correct value in rhnChannelProduct and reference
            # to rhnProductName in rhnChannel
            channel_object['product_name'] = channel['product_label']

            dists = []
            releases = []

            # Distribution/Release channel mapping available
            if label in self.channel_dist_mapping:
                dist_map = self.channel_dist_mapping[label]
                for item in dist_map:
                    if item['eus_release']:
                        r = ReleaseChannelMap()
                        r['product'] = item['os']
                        r['version'] = item['release']
                        r['release'] = item['eus_release']
                        r['channel_arch'] = item['channel_arch']
                        releases.append(r)
                    else:
                        d = DistChannelMap()
                        for k in item:
                            d[k] = item[k]
                        dists.append(d)

            channel_object['dists'] = dists
            channel_object['release'] = releases

            sources = self.cdn_repository_manager.get_content_sources_import_batch(label, backend)
            content_sources_batch.extend(sources)
            channel_object['content-sources'] = sources

            # Set default channel access to private
            channel_object['channel_access'] = 'private'

            channels_batch.append(channel_object)

        importer = ContentSourcesImport(content_sources_batch, backend)
        importer.run()

        importer = ChannelImport(channels_batch, backend)
        importer.run()

    def _create_yum_repo(self, repo_source):
        repo_label = self.cdn_repository_manager.get_content_source_label(repo_source)
        try:
            keys = self.cdn_repository_manager.get_repository_crypto_keys(repo_source['relative_url'])
        except CdnRepositoryNotFoundError:
            keys = []
            log2(1, 1, "WARNING: Repository '%s' was not found." % repo_source['relative_url'], stream=sys.stderr)
        if keys:
            (ca_cert_file, client_cert_file, client_key_file) = reposync.write_ssl_set_cache(
                keys[0]['ca_cert'], keys[0]['client_cert'], keys[0]['client_key'])
        else:
            (ca_cert_file, client_cert_file, client_key_file) = (None, None, None)
            log2(1, 1, "WARNING: No valid SSL certificates were found for repository '%s'."
                 % repo_source['relative_url'], stream=sys.stderr)
        return yum_src.ContentSource(self.mount_point + str(repo_source['relative_url']),
                                     str(repo_label), org=None, no_mirrors=True,
                                     ca_cert_file=ca_cert_file, client_cert_file=client_cert_file,
                                     client_key_file=client_key_file)

    def _sync_channel(self, channel):
        excluded_urls = []
        kickstart_trees = []

        if channel in self.kickstart_metadata:
            kickstart_trees = self.kickstart_metadata[channel]
            excluded_urls.extend(self.cdn_repository_manager.excluded_urls)

        if self.no_kickstarts:
            kickstart_repos = self.cdn_repository_manager.get_content_sources_kickstart(channel)
            excluded_urls.extend([x['relative_url'] for x in kickstart_repos])

        log(0, "======================================")
        log(0, "| Channel: %s" % channel)
        log(0, "======================================")

        # Print note if channel is already EOL
        if self._is_channel_eol(channel):
            log(0, "NOTE: This channel reached end-of-life on %s." %
                datetime.strptime(self.channel_metadata[channel]['eol'], "%Y-%m-%d %H:%M:%S").strftime("%Y-%m-%d"))

        log(0, "Sync of channel started.")
        log2disk(0, "Please check 'cdnsync/%s.log' for sync log of this channel." % channel, notimeYN=True)
        sync = reposync.RepoSync(channel,
                                 repo_type="yum",
                                 url=None,
                                 fail=False,
                                 filters=False,
                                 no_packages=self.no_packages,
                                 no_errata=self.no_errata,
                                 sync_kickstart=(not self.no_kickstarts),
                                 force_all_errata=self.force_all_errata,
                                 force_kickstart=self.force_kickstarts,
                                 latest=False,
                                 metadata_only=self.no_rpms,
                                 excluded_urls=excluded_urls,
                                 strict=self.consider_full,
                                 log_dir="cdnsync",
                                 log_level=self.log_level,
                                 check_ssl_dates=True,
                                 force_null_org_content=True)
        sync.set_ks_tree_type('rhn-managed')
        if self.import_batch_size:
            sync.set_import_batch_size(self.import_batch_size)
        if kickstart_trees:
            # Assuming all trees have same install type
            sync.set_ks_install_type(kickstart_trees[0]['ks_install_type'])
        sync.set_urls_prefix(self.mount_point)
        return sync.sync()

    def sync(self, channels=None):
        # If no channels specified, sync already synced channels
        if not channels:
            channels = set(self.synced_channels)

        # Check channel availability before doing anything
        not_available = set()
        available = set()
        all_channel_list = None
        for channel in channels:
            # Try to expand wildcards in channel labels
            if '*' in channel or '?' in channel or '[' in channel:
                if all_channel_list is None:
                    all_channel_list = self._list_available_channels() + [c for c in self.synced_channels
                                                                          if self.synced_channels[c]]
                expanded = fnmatch.filter(all_channel_list, channel)
                log(2, "Expanding channel '%s' to: %s" % (channel, ", ".join(expanded)))
                if expanded:
                    for expanded_channel in expanded:
                        if not self._is_channel_available(expanded_channel):
                            not_available.add(expanded_channel)
                        else:
                            available.add(expanded_channel)
                else:
                    not_available.add(channel)
            elif not self._is_channel_available(channel):
                not_available.add(channel)
            else:
                available.add(channel)

        channels = available

        error_messages = []

        # if we have not_available channels log the error immediately
        if not_available:
            msg = "ERROR: these channels either do not exist or are not available for synchronization:\n  " + \
                  "\n  ".join(not_available)
            error_messages.append(msg)

        # BZ 1434913 - let user know if system is not activated if no available channels
        if not available:
            error_messages.extend(self._msg_array_if_not_activated())

        # Need to update channel metadata
        self._update_channels_metadata([ch for ch in channels if ch in self.channel_metadata])
        # Make sure custom channels are properly connected with repos
        for channel in channels:
            if channel in self.synced_channels and self.synced_channels[channel]:
                self.cdn_repository_manager.assign_repositories_to_channel(channel)

        reposync.clear_ssl_cache()

        # Finally, sync channel content
        total_time = timedelta()
        for channel in channels:
            cur_time, failed_packages = self._sync_channel(channel)
            if failed_packages < 0:
                error_messages.append("Problems occurred during syncing channel %s. Please check "
                                      "/var/log/rhn/cdnsync/%s.log for the details\n" % (channel, channel))
            if failed_packages > 0:
                error_messages.append("%d packages in channel %s failed to sync. Please check "
                                      "/var/log/rhn/cdnsync/%s.log for the details\n" % (failed_packages, channel,
                                                                                         channel))
            total_time += cur_time
            # Switch back to cdnsync log
            rhnLog.initLOG(self.log_path, self.log_level)
            log2disk(0, "Sync of channel completed.")

        log(0, "Total time: %s" % str(total_time).split('.')[0])

        return error_messages

    def setup_repos_and_sync(self, channels=None, add_repos=None, delete_repos=None):
        # Fix format of relative url
        if add_repos:
            repos = set()
            for repo in add_repos:
                repo = repo.replace(CFG.CDN_ROOT, '')
                repo_dirs = self.cdn_repository_manager.repository_tree.normalize_url(repo)
                repo = os.path.join('/', '/'.join(repo_dirs))
                repos.add(repo)
            add_repos = list(repos)
        if delete_repos:
            repos = set()
            for repo in delete_repos:
                repo = repo.replace(CFG.CDN_ROOT, '')
                repo_dirs = self.cdn_repository_manager.repository_tree.normalize_url(repo)
                repo = os.path.join('/', '/'.join(repo_dirs))
                repos.add(repo)
            delete_repos = list(repos)
        # We need single custom channel
        if not channels or len(channels) > 1:
            raise CustomChannelSyncError("Single custom channel needed.")
        channel = list(channels)[0]
        db_channel = channel_info(channel)
        if add_repos and not self._can_add_repos(db_channel, add_repos):
            raise CustomChannelSyncError("Unable to attach requested repositories to this channel.")
        # Add custom repositories to custom channel
        changed = self.cdn_repository_manager.assign_repositories_to_channel(channel, delete_repos=delete_repos,
                                                                             add_repos=add_repos)
        # Add to synced channels and sync if there are any changed repos
        if changed and channel not in self.synced_channels:
            self.synced_channels[channel] = db_channel['org_id']
        return self.sync(channels=channels)

    def count_packages(self, channels=None):
        start_time = datetime.now()
        reposync.clear_ssl_cache()
        # Both entitled channels and custom channels with null-org repositories.
        channel_list = self._list_available_channels()
        if not channel_list:
            error_messages = self._msg_array_if_not_activated()
            if error_messages:
                log(0, "\n".join(error_messages))
                sys.exit(1)
        channel_list.extend([c for c in self.synced_channels if self.synced_channels[c]])

        # Only some channels specified by parameter
        if channels:
            new_channel_list = []
            for channel in channels:
                new_channel_list.extend(fnmatch.filter(channel_list, channel))
            channel_list = list(set(new_channel_list))

        log(0, "Number of channels: %d" % len(channel_list))

        # Prepare repositories
        repo_tree = {}
        repository_count = 0
        for channel in channel_list:
            sources = self.cdn_repository_manager.get_content_sources(channel)
            # Custom channel
            if not sources:
                repos = self.cdn_repository_manager.list_associated_repos(channel)
                sources = []
                for index, repo in enumerate(sorted(repos)):
                    repo_label = "%s-%d" % (channel, index)
                    sources.append({'relative_url': repo, 'pulp_repo_label_v2': repo_label})
            repository_count += len(sources)
            repo_tree[channel] = sources
        log(0, "Number of repositories: %d" % repository_count)

        downloader = ThreadedDownloader()
        for channel in repo_tree:
            for source in repo_tree[channel]:
                yum_repo = self._create_yum_repo(source)
                params = {}
                yum_repo.set_download_parameters(params, "repodata/repomd.xml",
                                                 os.path.join(yum_repo.repo.basecachedir,
                                                              yum_repo.name, "repomd.xml.new"))
                downloader.add(params)

        progress_bar = ProgressBarLogger("Downloading repomd:  ", repository_count)
        downloader.set_log_obj(progress_bar)
        # Overwrite existing files
        downloader.set_force(True)
        log2background(0, "Downloading repomd started.")
        downloader.run()
        log2background(0, "Downloading repomd finished.")

        progress_bar = ProgressBarLogger("Comparing repomd:    ", len(repo_tree))
        to_download_count = 0
        repo_tree_to_update = {}
        log2background(0, "Comparing repomd started.")

        is_missing_repomd = False
        for channel in repo_tree:
            cdn_repodata_path = os.path.join(constants.CDN_REPODATA_ROOT, channel)
            packages_num_path = os.path.join(cdn_repodata_path, "packages_num")
            packages_size_path = os.path.join(cdn_repodata_path, "packages_size")

            sources = repo_tree[channel]
            yum_repos = [self._create_yum_repo(source) for source in sources]

            # check all repomd files were downloaded
            for yum_repo in yum_repos:
                new_repomd = os.path.join(yum_repo.repo.basecachedir, yum_repo.name, "repomd.xml.new")
                if not os.path.isfile(new_repomd):
                    is_missing_repomd = True

            # packages_num file exists and all cached repomd files are up to date => skip
            if os.path.isfile(packages_num_path) and os.path.isfile(packages_size_path) and all(
                    [x.repomd_up_to_date() for x in yum_repos]):
                progress_bar.log(True, None)
                continue

            update_channel = False
            for yum_repo in yum_repos:
                # use new repomd
                new_repomd = os.path.join(yum_repo.repo.basecachedir, yum_repo.name, "repomd.xml.new")
                if os.path.isfile(new_repomd):
                    update_channel = True
                    os.rename(new_repomd,
                              os.path.join(yum_repo.repo.basecachedir, yum_repo.name, "repomd.xml"))
                else:
                    # it wasn't downloaded
                    continue

                for path, checksum_pair in yum_repo.get_metadata_paths():
                    params = {}
                    yum_repo.set_download_parameters(params, path,
                                                     os.path.join(yum_repo.repo.basecachedir, yum_repo.name,
                                                                  os.path.basename(path)),
                                                     checksum_type=checksum_pair[0], checksum_value=checksum_pair[1])
                    downloader.add(params)
                    to_download_count += 1

            # If there is at least one repo with new repomd, pass through this channel
            if update_channel:
                repo_tree_to_update[channel] = sources

            progress_bar.log(True, None)
        log2background(0, "Comparing repomd finished.")

        progress_bar = ProgressBarLogger("Downloading metadata:", to_download_count)
        downloader.set_log_obj(progress_bar)
        downloader.set_force(False)
        log2background(0, "Downloading metadata started.")
        downloader.run()
        log2background(0, "Downloading metadata finished.")

        progress_bar = ProgressBarLogger("Counting packages:   ", len(repo_tree_to_update))
        log2background(0, "Counting packages started.")
        for channel in repo_tree_to_update:
            cdn_repodata_path = os.path.join(constants.CDN_REPODATA_ROOT, channel)
            packages_num_path = os.path.join(cdn_repodata_path, "packages_num")
            packages_size_path = os.path.join(cdn_repodata_path, "packages_size")

            sources = repo_tree_to_update[channel]
            yum_repos = [self._create_yum_repo(source) for source in sources]

            packages = {}
            for yum_repo in yum_repos:
                for pkg in yum_repo.raw_list_packages():
                    nvrea = str(pkg)
                    packages[nvrea] = pkg.packagesize

            # create directory for repo data if it doesn't exist
            try:
                os.makedirs(cdn_repodata_path)
            except OSError:
                exc = sys.exc_info()[1]
                if exc.errno == errno.EEXIST and os.path.isdir(cdn_repodata_path):
                    pass
                else:
                    raise
            f_num_out = open(packages_num_path, 'w')
            f_size_out = open(packages_size_path, 'w')
            try:
                f_num_out.write(str(len(packages)))
                f_size_out.write(str(sum(packages.values())))
            finally:
                if f_num_out is not None:
                    f_num_out.close()
                if f_size_out is not None:
                    f_size_out.close()
            # Delete cache to save space
            for yum_repo in yum_repos:
                yum_repo.clear_cache(keep_repomd=True)
            progress_bar.log(True, None)
        log2background(0, "Counting packages finished.")

        end_time = datetime.now()
        log(0, "Total time: %s" % str(end_time - start_time).split('.')[0])
        if is_missing_repomd:
            raise CountingPackagesError("Cannot download some repomd.xml files. "
                                        "Please, check /var/log/rhn/cdnsync.log for details")

    def _channel_line_format(self, channel, longest_label):
        if self._is_channel_eol(channel):
            eol_status = "EOL"
        else:
            eol_status = ""
        if channel in self.synced_channels:
            sync_status = 'p'
        else:
            sync_status = '.'
        try:
            packages_number = open(constants.CDN_REPODATA_ROOT + '/' + channel + "/packages_num", 'r').read()
        # pylint: disable=W0703
        except Exception:
            packages_number = '?'

        try:
            packages_size = open(constants.CDN_REPODATA_ROOT + '/' + channel + "/packages_size", 'r').read()
            packages_size = human_readable_size(int(packages_size))
        # pylint: disable=W0703
        except Exception:
            packages_size = '?B'

        packages_size = "(%s)" % packages_size
        space = " "
        offset = longest_label - len(channel)
        space += " " * offset

        return "%3s %s %s%s%6s packages %9s" % (eol_status, sync_status, channel, space,
                                                packages_number, packages_size)

    def _is_channel_eol(self, channel):
        if channel in self.channel_metadata:
            if 'eol' in self.channel_metadata[channel] and self.channel_metadata[channel]['eol']:
                if datetime.now() > datetime.strptime(self.channel_metadata[channel]['eol'], "%Y-%m-%d %H:%M:%S"):
                    return True
        return False

    def _print_unmapped_channels(self):
        unmapped_channels = [ch for ch in self.synced_channels if not self.synced_channels[ch]
                             and ch not in self.channel_metadata]
        if unmapped_channels:
            log(0, "Previously synced channels not available to update from CDN:")
            for channel in sorted(unmapped_channels):
                log(0, "    p %s" % channel)

    def print_channel_tree(self, repos=False):
        channel_tree, not_available_channels = self._tree_available_channels()

        if not channel_tree:
            error_messages = self._msg_array_if_not_activated()
            if not error_messages:
                log(0, "WARNING: No available channels from channel mappings were found. "
                       "Is %s package installed?" % constants.MAPPINGS_RPM_NAME)
            else:
                log(0, "\n".join(error_messages))
                sys.exit(1)

        available_base_channels = [x for x in sorted(channel_tree) if x not in not_available_channels]
        custom_cdn_channels = [ch for ch in self.synced_channels if self.synced_channels[ch]]
        longest_label = len(max(available_base_channels + custom_cdn_channels +
                                [i for l in list(channel_tree.values()) for i in l] + [""], key=len))

        log(0, "p = previously imported/synced channel")
        log(0, ". = channel not yet imported/synced")
        log(0, "? = package count not available (try to run cdn-sync --count-packages)")
        log(0, "EOL = channel reached end-of-life")

        log(0, "Entitled base channels:")
        if not available_base_channels:
            log(0, "      NONE")
        for channel in available_base_channels:
            log(0, "%s" % self._channel_line_format(channel, longest_label))
            if repos:
                sources = self.cdn_repository_manager.get_content_sources(channel)
                paths = [s['relative_url'] for s in sources]
                for path in sorted(paths):
                    log(0, "        %s" % path)

        log(0, "Entitled child channels:")
        if not (any([channel_tree[ch] for ch in channel_tree])):
            log(0, "      NONE")
        # print information about child channels
        for channel in sorted(channel_tree):
            # Print only if there are any child channels
            if channel_tree[channel]:
                log(0, "%s:" % channel)
                for child in sorted(channel_tree[channel]):
                    log(0, "%s" % self._channel_line_format(child, longest_label))
                    if repos:
                        sources = self.cdn_repository_manager.get_content_sources(child)
                        paths = [s['relative_url'] for s in sources]
                        for path in sorted(paths):
                            log(0, "        %s" % path)

        # Not-null org_id channels
        log(0, "Custom channels syncing from CDN:")
        if not custom_cdn_channels:
            log(0, "      NONE")
        for channel in sorted(custom_cdn_channels):
            log(0, "%s" % self._channel_line_format(channel, longest_label))
            if repos:
                paths = self.cdn_repository_manager.list_associated_repos(channel)
                for path in sorted(paths):
                    log(0, "        %s" % path)

        # Previously synced null-org channels not available in cdn-sync-mappings
        self._print_unmapped_channels()

    def clear_cache(self):
        # Clear packages outside channels from DB and disk
        log(0, "Cleaning imported packages outside channels.")
        contentRemove.delete_outside_channels(None)
        if os.path.isdir(constants.PACKAGE_STAGE_DIRECTORY):
            log(0, "Cleaning package stage directory.")
            for pkg in os.listdir(constants.PACKAGE_STAGE_DIRECTORY):
                os.unlink(os.path.join(constants.PACKAGE_STAGE_DIRECTORY, pkg))
        log(0, "Cleaning orphaned CDN repositories in DB.")
        self.cdn_repository_manager.cleanup_orphaned_repos()

    @staticmethod
    def _get_cdn_certificate_keys_and_certs():
        h = rhnSQL.prepare("""
            SELECT ck.id, ck.description, ck.key
            FROM rhnCryptoKeyType ckt,
                 rhnCryptoKey ck
            WHERE ckt.label = 'SSL'
              AND ckt.id = ck.crypto_key_type_id
              AND ck.description LIKE 'CDN_%'
              AND ck.org_id is NULL
            ORDER BY ck.description
        """)
        h.execute()
        data = []
        while True:
            row = h.fetchone_dict()
            if row is None:
                break
            row['key'] = rhnSQL.read_lob(row['key'])
            data.append(row)
        return data

    def print_cdn_certificates_info(self, repos=False):
        keys = self._get_cdn_certificate_keys_and_certs()
        if not keys:
            log2(0, 0, "No SSL certificates were found. Is your %s activated for CDN?"
                 % PRODUCT_NAME, stream=sys.stderr)
            sys.exit(1)

        for key in keys:
            log(0, "======================================")
            log(0, "| Certificate/Key: %s" % key['description'])
            log(0, "======================================")
            if constants.CA_CERT_NAME == key['description'] or constants.CLIENT_CERT_PREFIX in key['description']:
                if not verify_certificate_dates(str(key['key'])):
                    log(0, "WARNING: This certificate is not valid.")
                cn, serial_number, not_before, not_after = get_certificate_info(str(key['key']))
                log(0, "Common name:   %s" % str(cn))
                log(0, "Serial number: %s" % str(serial_number))
                log(0, "Valid from:    %s" % str(not_before))
                log(0, "Valid to:      %s" % str(not_after))
            if constants.CLIENT_CERT_PREFIX in key['description']:
                manager = CdnRepositoryManager(client_cert_id=int(key['id']))
                self.cdn_repository_manager = manager
                log(0, "Provided channels:")
                channel_tree, not_available_channels = self._tree_available_channels()
                if not channel_tree:
                    log(0, "    NONE")
                for base_channel in sorted(channel_tree):
                    if base_channel not in not_available_channels:
                        log(0, "    * %s" % base_channel)
                    elif channel_tree[base_channel]:
                        log(0, "    * %s (only child channels provided)" % base_channel)
                    for child_channel in sorted(channel_tree[base_channel]):
                        log(0, "        * %s" % child_channel)
                if repos:
                    log(0, "Provided repositories:")
                    provided_repos = self.cdn_repository_manager.list_provided_repos(key['id'])
                    for repo in sorted(provided_repos):
                        log(0, "    %s" % repo)
            log(0, "")

    def print_eol_channel_list(self):
        available_channels = self._list_available_channels()

        # Filter only channels with EOL date defined
        eol_channels = {}
        for channel in available_channels:
            if 'eol' in self.channel_metadata[channel] and self.channel_metadata[channel]['eol']:
                eol_channels[channel] = datetime.strptime(self.channel_metadata[channel]['eol'], "%Y-%m-%d %H:%M:%S")

        if eol_channels:
            longest_label = len(max(eol_channels, key=len))
        else:
            longest_label = 0

        already_eol_channels = []
        notyet_eol_channels = []

        # Split into 2 channel groups based on current date
        for channel in eol_channels:
            if datetime.now() > eol_channels[channel]:
                already_eol_channels.append(channel)
            else:
                notyet_eol_channels.append(channel)

        # Print these channel groups, sorted by date
        def print_channel_line(ch):
            if ch in self.synced_channels:
                sync_status = 'p'
            else:
                sync_status = '.'
            space = " "
            offset = longest_label - len(ch)
            space += " " * offset
            log(0, "    %s %s%s%s" % (sync_status, channel, space, eol_channels[channel].strftime("%Y-%m-%d")))

        log(0, "p = previously imported/synced channel")
        log(0, ". = channel not yet imported/synced")
        log(0, "Channels reached end-of-life already:")
        if not already_eol_channels:
            log(0, "      NONE")
        for channel in sorted(already_eol_channels, key=lambda channel: eol_channels[channel]):
            print_channel_line(channel)
        log(0, "Channels not reached end-of-life yet:")
        if not notyet_eol_channels:
            log(0, "      NONE")
        for channel in sorted(notyet_eol_channels, key=lambda channel: eol_channels[channel]):
            print_channel_line(channel)

        # Previously synced null-org channels not available in cdn-sync-mappings
        self._print_unmapped_channels()

    def _msg_array_if_not_activated(self):
        error_messages = []
        keys = self._get_cdn_certificate_keys_and_certs()
        if not keys:
            error_messages.append("ERROR: Your %s is not activated for CDN\n"
                                  "(to see details about currently used SSL certificates for accessing CDN:"
                                  " /usr/bin/cdn-sync --cdn-certs)" % PRODUCT_NAME)
        else:
            found_valid_key = False
            for key in keys:
                if not found_valid_key:
                    if (constants.CA_CERT_NAME == key['description']
                            or constants.CLIENT_CERT_PREFIX in key['description']):
                        if verify_certificate_dates(str(key['key'])):
                            found_valid_key = True
            if not found_valid_key:
                error_messages.append("ERROR: Your %s has no valid SSL certificates for accessing CDN\n"
                                      "(to see details about currently used SSL certificates for accessing CDN:"
                                      " /usr/bin/cdn-sync --cdn-certs)" % PRODUCT_NAME)
        return error_messages

    # Append additional messages and send email
    def send_email(self, additional_messages):
        if self.email:
            if additional_messages:
                log2email(0, '\n'.join(additional_messages), cleanYN=1, notimeYN=1)
            reposync.send_mail(sync_type="CDN")
07070100000017000081B40000000000000000000000015FBBE8EE0000060D000000000000000000000000000000000000002600000000spacewalk-backend/cdn_tools/common.py # Copyright (c) 2016--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

from uyuni.common import fileutils
from . import constants


def verify_mappings():
    args = ['rpm', '-q', constants.MAPPINGS_RPM_NAME]
    ret = fileutils.rhn_popen(args)
    # Package installed, exitcode is 0
    if not ret[0]:
        args = ['rpm', '-V', constants.MAPPINGS_RPM_NAME]
        ret = fileutils.rhn_popen(args)
        if ret[0]:
            raise CdnMappingsLoadError("CDN mappings changed on disk. Please re-install '%s' package."
                                       % constants.MAPPINGS_RPM_NAME)


# Up to terabytes, should be enough
def human_readable_size(file_size):
    for count in ['B', 'K', 'M', 'G']:
        if file_size < 1024.0:
            return "%3.1f%s" % (file_size, count)
        file_size /= 1024.0
    return "%3.1f%s" % (file_size, 'T')


class CdnMappingsLoadError(Exception):
    pass


class CustomChannelSyncError(Exception):
    pass


class CountingPackagesError(Exception):
    pass
   07070100000018000081B40000000000000000000000015FBBE8EE00000640000000000000000000000000000000000000002900000000spacewalk-backend/cdn_tools/constants.py  # Copyright (c) 2016--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

"""
Constant values for Satellite CDN sync.
"""

# How are CDN SSL items named in rhnCryptoKey table.
CA_CERT_NAME = "CDN-CA-CERT"
CLIENT_CERT_PREFIX = "CDN-CLIENT-CERT-"
CLIENT_KEY_PREFIX = "CDN-CLIENT-KEY-"
# Repository URL contains variables, from manifest
MANIFEST_REPOSITORY_DB_PREFIX = "manifest_"

CA_CERT_PATH = "/etc/rhsm/ca/redhat-uep.pem"
CANDLEPIN_CA_CERT_DIR = "/etc/rhn/candlepin-certs"

MAPPINGS_RPM_NAME = "cdn-sync-mappings"
CHANNEL_DEFINITIONS_PATH = "/usr/share/rhn/cdn-sync/channels.json"
CHANNEL_FAMILY_MAPPING_PATH = "/usr/share/rhn/cdn-sync/families.json"
CHANNEL_DIST_MAPPING_PATH = "/usr/share/rhn/cdn-sync/dist_map.json"
CONTENT_SOURCE_MAPPING_PATH = "/usr/share/rhn/cdn-sync/rhn_cdn_mappings.json"
KICKSTART_DEFINITIONS_PATH = "/usr/share/rhn/cdn-sync/kickstart.json"
KICKSTART_SOURCE_MAPPING_PATH = "/usr/share/rhn/cdn-sync/kickstart_cdn_mappings.json"

CDN_REPODATA_ROOT = "/var/cache/rhn/cdnsync"
PACKAGE_STAGE_DIRECTORY = "/var/satellite/redhat/NULL/stage"
07070100000019000081B40000000000000000000000015FBBE8EE00003574000000000000000000000000000000000000002800000000spacewalk-backend/cdn_tools/manifest.py   # Copyright (c) 2016--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import sys

try:
    import io as cStringIO
except ImportError:
    import cStringIO

import json
import zipfile
import os
from M2Crypto import X509

from spacewalk.satellite_tools.syncLib import log2
from spacewalk.server.rhnServer.satellite_cert import SatelliteCert

from . import constants


class Manifest(object):
    """Class containing relevant data from RHSM manifest."""

    SIGNATURE_NAME = "signature"
    INNER_ZIP_NAME = "consumer_export.zip"
    ENTITLEMENTS_PATH = "export/entitlements"
    CERTIFICATE_PATH = "export/extensions"
    PRODUCTS_PATH = "export/products"
    CONSUMER_INFO = "export/consumer.json"
    META_INFO = "export/meta.json"
    UPSTREAM_CONSUMER_PATH = "export/upstream_consumer"

    def __init__(self, zip_path):
        self.all_entitlements = []
        self.manifest_repos = {}
        self.sat5_certificate = None
        self.satellite_version = None
        self.consumer_credentials = None
        self.uuid = None
        self.name = None
        self.ownerid = None
        self.api_url = None
        self.web_url = None
        self.created = None
        # Signature and signed data
        self.signature = None
        self.data = None
        # Open manifest from path
        top_zip = None
        inner_zip = None
        inner_file = None

        # normalize path
        zip_path = os.path.abspath(os.path.expanduser(zip_path))
        try:
            top_zip = zipfile.ZipFile(zip_path, 'r')
            # Fetch inner zip file into memory
            try:
                # inner_file = top_zip.open(zip_path.split('.zip')[0] + '/' + self.INNER_ZIP_NAME)
                inner_file = top_zip.open(self.INNER_ZIP_NAME)
                self.data = inner_file.read()
                inner_file_data = cStringIO.StringIO(self.data)
                signature_file = top_zip.open(self.SIGNATURE_NAME)
                self.signature = signature_file.read()
                # Open the inner zip file
                try:
                    inner_zip = zipfile.ZipFile(inner_file_data)
                    self._extract_consumer_info(inner_zip)
                    self._load_entitlements(inner_zip)
                    self._extract_certificate(inner_zip)
                    self._extract_meta_info(inner_zip)
                    self._extract_consumer_credentials(inner_zip)
                finally:
                    if inner_zip is not None:
                        inner_zip.close()
            finally:
                if inner_file is not None:
                    inner_file.close()
        finally:
            if top_zip is not None:
                top_zip.close()

    def _extract_certificate(self, zip_file):
        files = zip_file.namelist()
        certificates_names = []
        for f in files:
            if f.startswith(self.CERTIFICATE_PATH) and f.endswith(".xml"):
                certificates_names.append(f)
        if len(certificates_names) >= 1:
            # take only first file
            cert_file = zip_file.open(certificates_names[0])  # take only first file
            self.sat5_certificate = cert_file.read().strip()
            cert_file.close()
            # Save version too
            sat5_cert = SatelliteCert()
            sat5_cert.load(self.sat5_certificate)
            self.satellite_version = getattr(sat5_cert, 'satellite-version')
        else:
            raise MissingSatelliteCertificateError("Satellite Certificate was not found in manifest.")

    def _fill_product_repositories(self, zip_file, product):
        product_file = zip_file.open(self.PRODUCTS_PATH + '/' + str(product.get_id()) + '.json')
        product_data = json.load(product_file)
        product_file.close()
        try:
            for content in product_data['productContent']:
                content = content['content']
                product.add_repository(content['label'], content['contentUrl'])
        except KeyError:
            log2(0, 0, "ERROR: Cannot access required field in product '%s'" % product.get_id(), stream=sys.stderr)
            raise

    def _load_entitlements(self, zip_file):
        files = zip_file.namelist()
        entitlements_files = []
        for f in files:
            if f.startswith(self.ENTITLEMENTS_PATH) and f.endswith(".json"):
                entitlements_files.append(f)

        if len(entitlements_files) >= 1:
            self.all_entitlements = []
            for entitlement_file in entitlements_files:
                entitlements = zip_file.open(entitlement_file)
                # try block in try block - this is hack for python 2.4 compatibility
                # to support finally
                try:
                    try:
                        data = json.load(entitlements)

                        # Extract credentials
                        certs = data['certificates']
                        if len(certs) != 1:
                            raise IncorrectEntitlementsFileFormatError(
                                "Single certificate in entitlements file '%s' is expected, found: %d"
                                % (entitlement_file, len(certs)))
                        cert = certs[0]
                        credentials = Credentials(data['id'], cert['cert'], cert['key'])

                        # Extract product IDs
                        products = []
                        provided_products = data['pool']['providedProducts'] or []
                        derived_provided_products = data['pool']['derivedProvidedProducts'] or []
                        product_ids = [provided_product['productId'] for provided_product
                                       in provided_products + derived_provided_products]
                        for product_id in set(product_ids):
                            product = Product(product_id)
                            self._fill_product_repositories(zip_file, product)
                            products.append(product)

                        # Skip entitlements not providing any products
                        if products:
                            entitlement = Entitlement(products, credentials)
                            self.all_entitlements.append(entitlement)
                    except KeyError:
                        log2(0, 0, "ERROR: Cannot access required field in file '%s'" % entitlement_file,
                             stream=sys.stderr)
                        raise
                finally:
                    entitlements.close()
        else:
            refer_url = "%s%s" % (self.web_url, self.uuid)
            if not refer_url.startswith("http"):
                refer_url = "https://" + refer_url
            raise IncorrectEntitlementsFileFormatError(
                "No subscriptions were found in manifest.\n\nPlease refer to %s for setting up subscriptions."
                % refer_url)

    def _extract_consumer_info(self, zip_file):
        files = zip_file.namelist()
        found = False
        for f in files:
            if f == self.CONSUMER_INFO:
                found = True
                break
        if found:
            consumer_info = zip_file.open(self.CONSUMER_INFO)
            try:
                try:
                    data = json.load(consumer_info)
                    self.uuid = data['uuid']
                    self.name = data['name']
                    self.ownerid = data['owner']['key']
                    self.api_url = data['urlApi']
                    self.web_url = data['urlWeb']
                except KeyError:
                    log2(0, 0, "ERROR: Cannot access required field in file '%s'" % self.CONSUMER_INFO,
                         stream=sys.stderr)
                    raise
            finally:
                consumer_info.close()
        else:
            raise MissingConsumerInfoError()

    def _extract_meta_info(self, zip_file):
        files = zip_file.namelist()
        found = False
        for f in files:
            if f == self.META_INFO:
                found = True
                break
        if found:
            meta_info = zip_file.open(self.META_INFO)
            try:
                try:
                    data = json.load(meta_info)
                    self.created = data['created']
                except KeyError:
                    log2(0, 0, "ERROR: Cannot access required field in file '%s'" % self.META_INFO, stream=sys.stderr)
                    raise
            finally:
                meta_info.close()
        else:
            raise MissingMetaInfoError()

    def _extract_consumer_credentials(self, zip_file):
        files = zip_file.namelist()
        consumer_credentials = []
        for f in files:
            if f.startswith(self.UPSTREAM_CONSUMER_PATH) and f.endswith(".json"):
                consumer_credentials.append(f)

        if len(consumer_credentials) == 1:
            upstream_consumer = zip_file.open(consumer_credentials[0])
            try:
                try:
                    data = json.load(upstream_consumer)
                    self.consumer_credentials = Credentials(data['id'], data['cert'], data['key'])
                except KeyError:
                    log2(0, 0, "ERROR: Cannot access required field in file '%s'" % consumer_credentials[0],
                         stream=sys.stderr)
                    raise
            finally:
                upstream_consumer.close()
        else:
            raise IncorrectCredentialsError(
                "ERROR: Single upstream consumer certificate expected, found %d." % len(consumer_credentials))

    def get_all_entitlements(self):
        return self.all_entitlements

    def get_satellite_certificate(self):
        return self.sat5_certificate

    def get_satellite_version(self):
        return self.satellite_version

    def get_consumer_credentials(self):
        return self.consumer_credentials

    def get_name(self):
        return self.name

    def get_uuid(self):
        return self.uuid

    def get_ownerid(self):
        return self.ownerid

    def get_api_url(self):
        return self.api_url

    def get_created(self):
        return self.created

    def check_signature(self):
        if self.signature and self.data:
            certs = os.listdir(constants.CANDLEPIN_CA_CERT_DIR)
            # At least one certificate has to match
            for cert_name in certs:
                cert_file = None
                try:
                    try:
                        cert_file = open(constants.CANDLEPIN_CA_CERT_DIR + '/' + cert_name, 'r')
                        cert = X509.load_cert_string(cert_file.read())
                    except (IOError, X509.X509Error):
                        continue
                finally:
                    if cert_file is not None:
                        cert_file.close()
                pubkey = cert.get_pubkey()
                pubkey.reset_context(md='sha256')
                pubkey.verify_init()

                pubkey.verify_update(self.data)
                if pubkey.verify_final(self.signature):
                    return True
        return False


class Entitlement(object):
    def __init__(self, products, credentials):
        if products and credentials:
            self.products = products
            self.credentials = credentials
        else:
            raise IncorrectEntitlementError()

    def get_products(self):
        return self.products

    def get_credentials(self):
        return self.credentials


class Credentials(object):
    def __init__(self, identifier, cert, key):
        if identifier:
            self.id = identifier
        else:
            raise IncorrectCredentialsError(
                "ERROR: ID of credentials has to be defined"
            )

        if cert and key:
            self.cert = cert
            self.key = key
        else:
            raise IncorrectCredentialsError(
                "ERROR: Trying to create object with cert = %s and key = %s"
                % (cert, key)
            )

    def get_id(self):
        return self.id

    def get_cert(self):
        return self.cert

    def get_key(self):
        return self.key


class Product(object):
    def __init__(self, identifier):
        try:
            self.id = int(identifier)
        except ValueError:
            raise IncorrectProductError(
                "ERROR: Invalid product id: %s" % identifier
            )
        self.repositories = {}

    def get_id(self):
        return self.id

    def get_repositories(self):
        return self.repositories

    def add_repository(self, label, url):
        self.repositories[label] = url


class IncorrectProductError(Exception):
    pass


class IncorrectEntitlementError(Exception):
    pass


class IncorrectCredentialsError(Exception):
    pass


class IncorrectEntitlementsFileFormatError(Exception):
    pass


class MissingSatelliteCertificateError(Exception):
    pass


class ManifestValidationError(Exception):
    pass


class MissingConsumerInfoError(Exception):
    pass


class MissingMetaInfoError(Exception):
    pass
0707010000001A000081B40000000000000000000000015FBBE8EE00004FBD000000000000000000000000000000000000002A00000000spacewalk-backend/cdn_tools/repository.py # Copyright (c) 2016--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import os
import sys
import json

from spacewalk.server import rhnSQL
from spacewalk.server.importlib.backendOracle import SQLBackend
from spacewalk.server.importlib.contentSourcesImport import ContentSourcesImport
from spacewalk.satellite_tools.satCerts import verify_certificate_dates
from spacewalk.satellite_tools.syncLib import log, log2
from spacewalk.server.importlib.importLib import ContentSource, ContentSourceSsl

from . import constants


class CdnRepositoryManager(object):
    """Class managing CDN repositories, connected channels etc."""

    def __init__(self, local_mount_point=None, client_cert_id=None):
        rhnSQL.initDB()
        self.local_mount_point = local_mount_point
        self.repository_tree = CdnRepositoryTree()
        self._populate_repository_tree(client_cert_id=client_cert_id)
        self.excluded_urls = []

        f = None
        try:
            try:
                # Channel to repositories mapping
                f = open(constants.CONTENT_SOURCE_MAPPING_PATH, 'r')
                self.content_source_mapping = json.load(f)
                f.close()

                # Channel to kickstart repositories mapping
                f = open(constants.KICKSTART_SOURCE_MAPPING_PATH, 'r')
                self.kickstart_source_mapping = json.load(f)
                f.close()

                # Kickstart metadata
                f = open(constants.KICKSTART_DEFINITIONS_PATH, 'r')
                self.kickstart_metadata = json.load(f)
                f.close()
            except IOError:
                e = sys.exc_info()[1]
                log(1, "Ignoring channel mappings: %s" % e)
                self.content_source_mapping = {}
                self.kickstart_source_mapping = {}
                self.kickstart_metadata = {}
        finally:
            if f is not None:
                f.close()

        self.__init_repository_to_channels_mapping()

    # Map repositories to channels
    def __init_repository_to_channels_mapping(self):
        self.repository_to_channels = {}
        for channel in self.content_source_mapping:
            for source in self.content_source_mapping[channel]:
                relative_url = source['relative_url']
                if relative_url in self.repository_to_channels:
                    self.repository_to_channels[relative_url].append(channel)
                else:
                    self.repository_to_channels[relative_url] = [channel]

        for channel in self.kickstart_metadata:
            for tree in self.kickstart_metadata[channel]:
                tree_label = tree['ks_tree_label']
                if tree_label in self.kickstart_source_mapping:
                    relative_url = self.kickstart_source_mapping[tree_label][0]['relative_url']
                    if relative_url in self.repository_to_channels:
                        self.repository_to_channels[relative_url].append(channel)
                    else:
                        self.repository_to_channels[relative_url] = [channel]

    def _populate_repository_tree(self, client_cert_id=None):
        sql = """
            select cs.label, cs.source_url, csssl.ssl_ca_cert_id,
                   csssl.ssl_client_cert_id, csssl.ssl_client_key_id
            from rhnContentSource cs inner join
                 rhnContentSourceSsl csssl on cs.id = csssl.content_source_id
            where cs.org_id is null
              and cs.label like :prefix || '%%'
        """
        # Create repository tree containing only repositories provided from single client certificate
        if client_cert_id:
            sql += " and csssl.ssl_client_cert_id = :client_cert_id"
        query = rhnSQL.prepare(sql)
        query.execute(prefix=constants.MANIFEST_REPOSITORY_DB_PREFIX, client_cert_id=client_cert_id)
        rows = query.fetchall_dict() or []
        cdn_repositories = {}
        # Loop all rows from DB
        for row in rows:
            label = row['label']
            if label in cdn_repositories:
                cdn_repository = cdn_repositories[label]
            else:
                cdn_repository = CdnRepository(label, row['source_url'])
                cdn_repositories[label] = cdn_repository

            # Append SSL cert, key set to repository
            ssl_set = CdnRepositorySsl(row['ssl_ca_cert_id'], row['ssl_client_cert_id'], row['ssl_client_key_id'])
            cdn_repository.add_ssl_set(ssl_set)

        # Add populated repository to tree
        for cdn_repository in list(cdn_repositories.values()):
            self.repository_tree.add_repository(cdn_repository)

    def get_content_sources_regular(self, channel_label, source=False):
        if channel_label in self.content_source_mapping:
            return [x for x in self.content_source_mapping[channel_label]
                    if source or x['pulp_content_category'] != "source"]
        else:
            return []

    def get_content_sources_kickstart(self, channel_label):
        repositories = []
        if channel_label in self.kickstart_metadata:
            for tree in self.kickstart_metadata[channel_label]:
                tree_label = tree['ks_tree_label']
                if tree_label in self.kickstart_source_mapping:
                    # One tree comes from one repo, one repo for each tree is in the mapping,
                    # in future there may be multiple repos for one tree and we will need to select
                    # correct repo
                    repository = self.kickstart_source_mapping[tree_label][0]
                    repository['ks_tree_label'] = tree_label
                    repositories.append(repository)
                else:
                    log2(1, 1, "WARNING: Can't find repository for kickstart tree in mappings: %s"
                         % tree_label, stream=sys.stderr)
        return repositories

    def get_content_sources(self, channel_label, source=False):
        sources = self.get_content_sources_regular(channel_label, source=source)
        kickstart_sources = self.get_content_sources_kickstart(channel_label)
        return sources + sorted(kickstart_sources)

    def check_channel_availability(self, channel_label, no_kickstarts=False):
        """Checks if all repositories for channel are available."""
        if no_kickstarts:
            sources = self.get_content_sources_regular(channel_label)
        else:
            sources = self.get_content_sources(channel_label)

        # No content, no channel
        if not sources:
            return False

        for source in sources:
            if not self.check_repository_availability(source['relative_url'], channel_label=channel_label):
                if source.get('ks_tree_label', None):
                    # don't fail if kickstart is missing, just warn (bz1626797)
                    log2(0, 0, "WARNING: kickstart tree '%s' is unavailable" % source['ks_tree_label'],
                         stream=sys.stderr)
                    self.excluded_urls.append(source['relative_url'])
                else:
                    return False
        return True

    def check_repository_availability(self, relative_url, channel_label=None):
        try:
            crypto_keys = self.get_repository_crypto_keys(relative_url)
        except CdnRepositoryNotFoundError:
            log2(1, 1, "ERROR: No SSL certificates were found for repository '%s'" % relative_url, stream=sys.stderr)
            return False

        # Check SSL certificates
        if not crypto_keys:
            if channel_label:
                log2(1, 1, "ERROR: No valid SSL certificates were found for repository '%s'"
                           " required for channel '%s'." % (relative_url, channel_label), stream=sys.stderr)
            else:
                log2(1, 1, "ERROR: No valid SSL certificates were found for repository '%s'." % relative_url,
                     stream=sys.stderr)
            return False

        # Try to look for repomd file
        if self.local_mount_point and not os.path.isfile(os.path.join(
                self.local_mount_point, relative_url[1:], "repodata/repomd.xml")):
            return False

        return True

    def get_content_sources_import_batch(self, channel_label, backend, repos=None):
        batch = []

        # No custom repos specified, look into channel mappings
        if not repos:
            sources = self.get_content_sources(channel_label)
            for source in sources:
                if 'ks_tree_label' in source:
                    content_source = self._create_content_source_obj(source['ks_tree_label'],
                                                                     source['relative_url'], backend)
                else:
                    content_source = self._create_content_source_obj(source['pulp_repo_label_v2'],
                                                                     source['relative_url'], backend)
                batch.append(content_source)
        # We want to sync not-mapped repositories
        else:
            for index, repo in enumerate(repos):
                repo_label = "%s-%d" % (channel_label, index)
                content_source = self._create_content_source_obj(repo_label, repo, backend)
                batch.append(content_source)

        return batch

    def _create_content_source_obj(self, label, source_url, backend):
        type_id = backend.lookupContentSourceType('yum')
        content_source = ContentSource()
        content_source['label'] = label
        content_source['source_url'] = source_url
        content_source['org_id'] = None
        content_source['type_id'] = type_id
        content_source['ssl-sets'] = []
        repository = self.repository_tree.find_repository(source_url)
        for ssl_set in repository.get_ssl_sets():
            content_source_ssl = ContentSourceSsl()
            content_source_ssl['ssl_ca_cert_id'] = ssl_set.get_ca_cert()
            content_source_ssl['ssl_client_cert_id'] = ssl_set.get_client_cert()
            content_source_ssl['ssl_client_key_id'] = ssl_set.get_client_key()
            content_source['ssl-sets'].append(content_source_ssl)
        return content_source

    def get_repository_crypto_keys(self, url):
        repo = self.repository_tree.find_repository(url)
        crypto_keys = []
        for ssl_set in repo.get_ssl_sets():
            keys = ssl_set.get_crypto_keys(check_dates=True)
            if keys:
                crypto_keys.append(keys)
        return crypto_keys

    def assign_repositories_to_channel(self, channel_label, delete_repos=None, add_repos=None):
        backend = SQLBackend()
        self.unlink_all_repos(channel_label, custom_only=True)
        repos = self.list_associated_repos(channel_label)
        changed = 0
        if delete_repos:
            for to_delete in delete_repos:
                if to_delete in repos:
                    repos.remove(to_delete)
                    log(0, "Removing repository '%s' from channel." % to_delete)
                    changed += 1
                else:
                    log2(0, 0, "WARNING: Repository '%s' is not attached to channel." % to_delete, stream=sys.stderr)
        if add_repos:
            for to_add in add_repos:
                if to_add not in repos:
                    repos.append(to_add)
                    log(0, "Attaching repository '%s' to channel." % to_add)
                    changed += 1
                else:
                    log2(0, 0, "WARNING: Repository '%s' is already attached to channel." % to_add, stream=sys.stderr)

        # If there are any repositories intended to be attached to channel
        if repos:
            content_sources_batch = self.get_content_sources_import_batch(
                channel_label, backend, repos=sorted(repos))
            for content_source in content_sources_batch:
                content_source['channels'] = [channel_label]
                importer = ContentSourcesImport(content_sources_batch, backend)
                importer.run()
        else:
            # Make sure everything is unlinked
            self.unlink_all_repos(channel_label)
        return changed

    @staticmethod
    def unlink_all_repos(channel_label, custom_only=False):
        sql = """
            delete from rhnChannelContentSource ccs
            where ccs.channel_id = (select id from rhnChannel where label = :label)
        """
        if custom_only:
            sql += """
                and ccs.source_id in (select id from rhnContentSource where id = ccs.source_id and org_id is not null)
            """
        h = rhnSQL.prepare(sql)
        h.execute(label=channel_label)
        rhnSQL.commit()

    @staticmethod
    def list_associated_repos(channel_label):
        h = rhnSQL.prepare("""
                select cs.source_url
                from rhnChannel c inner join
                     rhnChannelContentSource ccs on c.id = ccs.channel_id inner join
                     rhnContentSource cs on ccs.source_id = cs.id
                where c.label = :label
                  and cs.org_id is null
            """)
        h.execute(label=channel_label)
        paths = [r['source_url'] for r in h.fetchall_dict() or []]
        return paths

    @staticmethod
    def list_provided_repos(crypto_key_id):
        h = rhnSQL.prepare("""
                select cs.source_url
                from rhnContentSource cs inner join
                     rhnContentSourceSsl csssl on cs.id = csssl.content_source_id
                where cs.label like :prefix || '%%'
                  and csssl.ssl_client_cert_id = :client_cert_id
            """)
        h.execute(prefix=constants.MANIFEST_REPOSITORY_DB_PREFIX, client_cert_id=crypto_key_id)
        paths = [r['source_url'] for r in h.fetchall_dict() or []]
        return paths

    @staticmethod
    def cleanup_orphaned_repos():
        h = rhnSQL.prepare("""
            delete from rhnContentSource cs
            where cs.org_id is null
              and cs.label not like :prefix || '%%'
              and not exists (select channel_id from rhnChannelContentSource where source_id = cs.id)
        """)
        h.execute(prefix=constants.MANIFEST_REPOSITORY_DB_PREFIX)
        rhnSQL.commit()

    @staticmethod
    def get_content_source_label(source):
        if 'pulp_repo_label_v2' in source:
            return source['pulp_repo_label_v2']
        elif 'ks_tree_label' in source:
            return source['ks_tree_label']
        else:
            raise InvalidContentSourceType()

    def list_channels_containing_repository(self, relative_path):
        if relative_path in self.repository_to_channels:
            return self.repository_to_channels[relative_path]
        else:
            return []


class CdnRepositoryTree(object):
    """Class representing activated CDN repositories in tree structure.
       Leafs contains CdnRepository instances.
       Allows us to match direct CDN URLs without variables (coming from mapping)
       to CDN URLs with variables (coming from manifest and having SSL keys/certs assigned)"""

    VARIABLES = ['$releasever', '$basearch']

    def __init__(self):
        self.root = {}

    def add_repository(self, repository):
        """Add new CdnRepository to tree."""

        url = repository.get_url()
        path = [x for x in url.split('/') if x]
        node = self.root
        for part in path[:-1]:
            if part not in node:
                node[part] = {}
            node = node[part]
        # Save repository into leaf
        node[path[-1]] = repository

    def _browse_node(self, node, keys):
        """Recursive function going through tree."""
        # Return leaf
        is_leaf = not isinstance(node, dict)
        if is_leaf and not keys:
            return node
        elif (is_leaf and keys) or (not is_leaf and not keys):
            raise CdnRepositoryNotFoundError()
        step = keys[0]
        to_check = [x for x in list(node.keys()) if x in self.VARIABLES or x == step]
        # Remove first step in path, create new list
        next_keys = keys[1:]

        # Check all available paths
        for key in to_check:
            try:
                # Try to get next node and run this function recursively
                next_node = node[key]
                return self._browse_node(next_node, next_keys)
            # From here
            except KeyError:
                pass
            # From recurrent call
            except CdnRepositoryNotFoundError:
                pass

        raise CdnRepositoryNotFoundError()

    @staticmethod
    def normalize_url(url):
        """Splits repository URL, removes redundant characters and returns list with directory names."""
        path = []
        for part in url.split('/'):
            if part == '..':
                if path:
                    del path[-1]
                else:
                    # Can't go upper in directory structure, keep it in path
                    path.append(part)
            elif part and part != '.':
                path.append(part)

        return path

    def find_repository(self, url):
        """Finds matching repository in tree.
           url is relative CDN url - e.g. /content/dist/rhel/server/6/6Server/x86_64/os"""
        node = self.root
        try:
            path = self.normalize_url(url)
            found = self._browse_node(node, path)
        except CdnRepositoryNotFoundError:
            raise CdnRepositoryNotFoundError("ERROR: Repository '%s' was not found." % url)

        return found


class CdnRepositoryNotFoundError(Exception):
    pass


class InvalidContentSourceType(Exception):
    pass


class CdnRepository(object):
    """Class representing CDN repository."""

    def __init__(self, label, url):
        self.label = label
        self.url = url
        self.ssl_sets = []

    # CdnRepositorySsl instance
    def add_ssl_set(self, ssl_set):
        self.ssl_sets.append(ssl_set)

    def get_ssl_sets(self):
        return self.ssl_sets

    def get_label(self):
        return self.label

    def get_url(self):
        return self.url


class CdnRepositorySsl(object):
    """Class representing single SSL certificate, key set for single CDN repository"""

    def __init__(self, ca_cert, client_cert, client_key):
        self.ca_cert = int(ca_cert)
        self.client_cert = int(client_cert)
        self.client_key = int(client_key)

    def get_ca_cert(self):
        return self.ca_cert

    def get_client_cert(self):
        return self.client_cert

    def get_client_key(self):
        return self.client_key

    def get_crypto_keys(self, check_dates=False):
        ssl_query = rhnSQL.prepare("""
            select description, key, org_id from rhnCryptoKey where id = :id
        """)
        keys = {}
        ssl_query.execute(id=self.ca_cert)
        row = ssl_query.fetchone_dict()
        keys['ca_cert'] = (str(row['description']), str(row['key']), row['org_id'])
        ssl_query.execute(id=self.client_cert)
        row = ssl_query.fetchone_dict()
        keys['client_cert'] = (str(row['description']), str(row['key']), row['org_id'])
        ssl_query.execute(id=self.client_key)
        row = ssl_query.fetchone_dict()
        keys['client_key'] = (str(row['description']), str(row['key']), row['org_id'])

        # Check if SSL certificates are usable
        if check_dates:
            failed = 0
            for key in (keys['ca_cert'], keys['client_cert']):
                if not verify_certificate_dates(key[1]):
                    log(1, "WARNING: Problem with dates in certificate '%s'. "
                           "Please check validity of this certificate." % key[0])
                    failed += 1
            if failed:
                return {}
        return keys
   0707010000001B000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000001900000000spacewalk-backend/common  0707010000001C000081B40000000000000000000000015FBBE8EE00000461000000000000000000000000000000000000002200000000spacewalk-backend/common/Makefile # Makefile for spacewalk backend
#

# what is the backend top dir
TOP     = ..

# Specific stuff
SUBDIR  = common
SPACEWALK_FILES	=   __init__ \
	    apache \
            byterange \
            rhnApache \
            rhnCache \
            rhnConfig \
            rhnException \
            rhnFlags \
            rhnLog \
            rhnMail \
            rhnRepository \
            rhnTB \
            rhnTranslate \
            RPC_Base \
            suseLib \
            repo

SCRIPTS = spacewalk-cfg-get

# check if we can build man pages
DOCBOOK = $(wildcard /usr/bin/docbook2man)

SGMLS   = $(wildcard *.sgml)
MANS    = $(patsubst %.sgml,%.8,$(SGMLS))

BINDIR  = /usr/bin
MANDIR  ?= /usr/man

EXTRA_DIRS = $(MANDIR)/man8 $(BINDIR)

include $(TOP)/Makefile.defs

# install scripts
all :: $(SCRIPTS)
install :: $(SCRIPTS) $(PREFIX)/$(BINDIR)
	$(INSTALL_BIN) $(SCRIPTS) $(PREFIX)/$(BINDIR)

ifneq ($(DOCBOOK),)
# install man pages
all     :: $(MANS)
install :: $(MANS) $(PREFIX)/$(MANDIR)
	$(INSTALL_DATA) $(MANS) $(PREFIX)/$(MANDIR)/man8
endif

%.8 : %.sgml
	$(DOCBOOK) $<

clean :: 
	@rm -fv $(MANS) manpage.*

   0707010000001D000081B40000000000000000000000015FBBE8EE00000379000000000000000000000000000000000000002500000000spacewalk-backend/common/RPC_Base.py  #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

# Base XML-RPC class handler


class RPC_Base:

    def __init__(self):
        self.functions = []

    # retrieve a function handler
    def get_function(self, function):
        if function in self.functions:
            return getattr(self, function)
        return None
   0707010000001E000081B40000000000000000000000015FBBE8EE00000386000000000000000000000000000000000000002500000000spacewalk-backend/common/__init__.py  #
# Copyright (c) 2008--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# Initialization file for the common module
#


# try to figure out if we're running under Apache or not
try:
    from spacewalk.common.rhnApache import rhnApache
    import _apache
except ImportError:
    # no _apache available, not running under apache/mod_python
    pass

__all__ = []
  0707010000001F000081B40000000000000000000000015FBBE8EE000007F7000000000000000000000000000000000000002300000000spacewalk-backend/common/apache.py    #
# Copyright (c) 2010--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

# constants meant to match the apache.py module of mod_python

HTTP_CONTINUE = 100
HTTP_SWITCHING_PROTOCOLS = 101
HTTP_PROCESSING = 102
HTTP_OK = 200
HTTP_CREATED = 201
HTTP_ACCEPTED = 202
HTTP_NON_AUTHORITATIVE = 203
HTTP_NO_CONTENT = 204
HTTP_RESET_CONTENT = 205
HTTP_PARTIAL_CONTENT = 206
HTTP_MULTI_STATUS = 207
HTTP_MULTIPLE_CHOICES = 300
HTTP_MOVED_PERMANENTLY = 301
HTTP_MOVED_TEMPORARILY = 302
HTTP_SEE_OTHER = 303
HTTP_NOT_MODIFIED = 304
HTTP_USE_PROXY = 305
HTTP_TEMPORARY_REDIRECT = 307
HTTP_BAD_REQUEST = 400
HTTP_UNAUTHORIZED = 401
HTTP_PAYMENT_REQUIRED = 402
HTTP_FORBIDDEN = 403
HTTP_NOT_FOUND = 404
HTTP_METHOD_NOT_ALLOWED = 405
HTTP_NOT_ACCEPTABLE = 406
HTTP_PROXY_AUTHENTICATION_REQUIRED = 407
HTTP_REQUEST_TIME_OUT = 408
HTTP_CONFLICT = 409
HTTP_GONE = 410
HTTP_LENGTH_REQUIRED = 411
HTTP_PRECONDITION_FAILED = 412
HTTP_REQUEST_ENTITY_TOO_LARGE = 413
HTTP_REQUEST_URI_TOO_LARGE = 414
HTTP_UNSUPPORTED_MEDIA_TYPE = 415
HTTP_RANGE_NOT_SATISFIABLE = 416
HTTP_EXPECTATION_FAILED = 417
HTTP_UNPROCESSABLE_ENTITY = 422
HTTP_LOCKED = 423
HTTP_FAILED_DEPENDENCY = 424
HTTP_INTERNAL_SERVER_ERROR = 500
HTTP_NOT_IMPLEMENTED = 501
HTTP_BAD_GATEWAY = 502
HTTP_SERVICE_UNAVAILABLE = 503
HTTP_GATEWAY_TIME_OUT = 504
HTTP_VERSION_NOT_SUPPORTED = 505
HTTP_VARIANT_ALSO_VARIES = 506
HTTP_INSUFFICIENT_STORAGE = 507
HTTP_NOT_EXTENDED = 510
REMOTE_DOUBLE_REV = 3
OK = REQ_PROCEED = 0
DONE = -2
DECLINED = REQ_NOACTION = -1
 07070100000020000081B40000000000000000000000015FBBE8EE00000C63000000000000000000000000000000000000002600000000spacewalk-backend/common/byterange.py #
# Copyright (c) 2008--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

import re
import sys

# common module
from uyuni.common.usix import raise_with_tb
from spacewalk.common.rhnLog import log_debug
from spacewalk.common.rhnException import rhnException

# pylint: disable=W0710

# Parses the HTTP header value and stores in the flags  a list of (start, end)
# tuples that are more pythonic than the RFC semantics


def parse_byteranges(byterange_header, file_size=None):
    log_debug(4, "Parsing byte range", byterange_header)
    regexp = re.compile(r"^bytes\s*=\s*(.*)$")
    mo = regexp.match(byterange_header)
    if not mo:
        raise InvalidByteRangeException

    arr = mo.groups()[0].split(",")
    regexp = re.compile(r"^([^-]*)-([^-]*)$")

    if len(arr) > 1:
        # We don't support very fancy byte ranges yet
        raise UnsatisfyableByteRangeException

    mo = regexp.match(arr[0])
    if not mo:
        # Invalid byterange
        raise InvalidByteRangeException
    try:
        start, end = list(map(_str2int, mo.groups()))
    except ValueError:
        # Invalid
        raise_with_tb(InvalidByteRangeException, sys.exc_info()[2])
    if start is not None:
        if start < 0:
            # Invalid
            raise InvalidByteRangeException
        if file_size is not None:
            if start >= file_size:
                raise UnsatisfyableByteRangeException
        if end is not None:
            if start > end:
                # Invalid
                raise InvalidByteRangeException
            end = end + 1
        else:
            if file_size:
                end = file_size
    else:
        # No start specified
        if end is None:
            # Invalid
            raise InvalidByteRangeException
        if end <= 0:
            # Invalid
            raise InvalidByteRangeException
        if file_size:
            if end > file_size:
                raise UnsatisfyableByteRangeException
            start = file_size - end
            end = file_size
        else:
            start = -end
            end = None

    byteranges = (start, end)

    log_debug(4, "Request byterange", byteranges)
    return byteranges


def _str2int(val):
    val = val.strip()
    if val == "":
        return None

    return int(val)


def get_content_range(start, end, total_length=None):
    if total_length is None:
        total_length = "*"
    end = end - 1
    content_range = "bytes %d-%d/%s" % (start, end, total_length)
    return content_range


class InvalidByteRangeException(rhnException):
    pass


class UnsatisfyableByteRangeException(rhnException):
    pass
 07070100000021000081B40000000000000000000000015FBBE8EE00004045000000000000000000000000000000000000002100000000spacewalk-backend/common/repo.py  """
Repository tools
"""
# coding: utf-8
import typing
import http
import os
import zlib
import lzma
import tempfile
import subprocess
from urllib import parse
import hashlib
from collections import namedtuple

import requests

# pylint:disable=W0612,W0212,C0301

SPACEWALK_LIB = '/var/lib/spacewalk'
SPACEWALK_GPG_HOMEDIR = os.path.join(SPACEWALK_LIB, 'gpgdir')


class GeneralRepoException(Exception):
    """
    Dpkg repository exception
    """


class DpkgRepo:
    """
    Dpkg repository detection.
    The repositories in Debian world have several layouts,
    such as "flat", classic tree, PPA etc.
    """
    PKG_GZ = "Packages.gz"
    PKG_XZ = "Packages.xz"
    PKG_RW = "Packages"

    class ReleaseEntry:  # pylint: disable=W0612,R0903
        """
        Release file entry
        """
        class Checksum:  # pylint: disable=R0903
            """
            Checksums of the Release file
            """
            md5: str = ""
            sha1: str = ""
            sha256: str = ""
            sha384: str = ""
            sha512: str = ""

        def __init__(self, size: int, uri: str):
            self.checksum = DpkgRepo.ReleaseEntry.Checksum()
            self.size = size
            self.uri = uri

    class EntryDict(dict):
        """
        Parsed release container.
        """
        def __init__(self, repo: "DpkgRepo"):
            super().__init__()
            self.__repo = repo

        def get(self, key: typing.Any) -> typing.Optional[typing.Any]:  # type: ignore
            """
            Automatically update key if the repo is flat.

            :param key:
            :return:
            """
            if not self.__repo.is_flat():
                key = "/".join(parse.urlparse(self.__repo._url).path.strip("/").split("/")[-2:] + [key])
            return self[key]

    def __init__(self, url: str, proxies: dict = None, gpg_verify: bool = True):
        self._url = url
        self._flat_checked: typing.Optional[int] = None
        self._flat: bool = False
        self._pkg_index: typing.Tuple[str, bytes] = ("", b"", )
        self._release = DpkgRepo.EntryDict(self)
        self.proxies = proxies
        self.gpg_verify = gpg_verify

    def append_index_file(self, index_file: str) -> str:
        """
        Append an index file, such as Packages.gz or Packagex.xz etc
        to the given URL, if it does not contains any.

        :param index_file: string
        :return: url string
        """
        p_url = parse.urlparse(self._url)
        path = p_url.path
        if not path.endswith(index_file):
            if index_file in path:
                raise GeneralRepoException("URL has already {} mentioned in it.".format(index_file))
            path = os.path.join(path.rstrip("/"), index_file)

        return parse.urlunparse((p_url.scheme, p_url.netloc, path, p_url.params, p_url.query, p_url.fragment,))

    def get_pkg_index_raw(self) -> typing.Tuple[str, bytes]:
        """
        Get Packages.gz or Packages.xz or Packages content, raw.

        :return: bytes of the content
        """
        if self._pkg_index[0] == "":
            for cnt_fname in [DpkgRepo.PKG_GZ, DpkgRepo.PKG_XZ, DpkgRepo.PKG_RW]:
                packages_url = self.append_index_file(cnt_fname)
                if packages_url.startswith("file://"):
                    with open(packages_url.replace("file://", ""), "rb") as f:
                        self._pkg_index = cnt_fname, f.read()
                        break
                    # TODO: Add logging in error case!
                else:
                    resp = requests.get(packages_url, proxies=self.proxies)
                    if resp.status_code == http.HTTPStatus.OK:
                        self._pkg_index = cnt_fname, resp.content
                        break
                    resp.close()

        return self._pkg_index

    def decompress_pkg_index(self) -> str:
        """
        Find and return contents of Packages.gz file.

        :raises GeneralRepoException if the Packages.gz file cannot be found.
        :return: string
        """
        fname, cnt_data = self.get_pkg_index_raw()
        try:
            if fname == DpkgRepo.PKG_GZ:
                cnt_data = zlib.decompress(cnt_data, 0x10 + zlib.MAX_WBITS)
            elif fname == DpkgRepo.PKG_XZ:
                cnt_data = lzma.decompress(cnt_data)
        except (zlib.error, lzma.LZMAError) as exc:
            raise GeneralRepoException(exc)
        except Exception as exc:
            raise GeneralRepoException("Unhandled exception occurred while decompressing {}: {}".format(fname, exc))

        return cnt_data.decode("utf-8")

    def _parse_release_index(self, release: str) -> "EntryDict":
        """
        Parse release index to a structure.

        :param release: decoded content of the Release file
        :return: dictionary
        """
        # Length of hexadecimal representation for each checksum algorithm
        LEN_MD5 = 128 // 4
        LEN_SHA1 = 160 // 4
        LEN_SHA256 = 256 // 4
        LEN_SHA384 = 384 // 4
        LEN_SHA512 = 512 // 4
        Entry = namedtuple("Entry", "checksum, size, path")
        for line in release.split(os.linesep):
            try:
                entry = Entry._make(
                    filter(None, line.strip().replace("\t", " ").split(" "))
                )
                int(entry.checksum, 0x10) # assert entry.checksum is hexadecimal
                rel_entry = DpkgRepo.ReleaseEntry(int(entry.size), entry.path)
            except (TypeError, ValueError):
                continue

            if len(entry.checksum) in (
                LEN_MD5,
                LEN_SHA1,
                LEN_SHA256,
                LEN_SHA384,
                LEN_SHA512,
            ):
                self._release.setdefault(rel_entry.uri, rel_entry)
                if len(entry.checksum) == LEN_MD5:
                    self._release[rel_entry.uri].checksum.md5 = entry.checksum
                elif len(entry.checksum) == LEN_SHA1:
                    self._release[rel_entry.uri].checksum.sha1 = entry.checksum
                elif len(entry.checksum) == LEN_SHA256:
                    self._release[rel_entry.uri].checksum.sha256 = entry.checksum
                elif len(entry.checksum) == LEN_SHA384:
                    self._release[rel_entry.uri].checksum.sha384 = entry.checksum
                elif len(entry.checksum) == LEN_SHA512:
                    self._release[rel_entry.uri].checksum.sha512 = entry.checksum

        return self._release


    def _has_valid_gpg_signature(self, uri: str, response=None) -> bool:
        """
        Validate GPG signature of Release file.

        :return: bool
        """
        process = None
        uri = uri.replace("file://", "")
        if not response:
            # There is no response, so this is a local path.
            if os.access(os.path.join(uri, "InRelease"), os.R_OK):
                release_file = os.path.join(uri, "InRelease")
                process = subprocess.Popen(
                    ["gpg", "--verify", "--homedir", SPACEWALK_GPG_HOMEDIR, release_file],
                    stdout=subprocess.DEVNULL,
                    stderr=subprocess.DEVNULL,
                )
                out = process.wait(timeout=90)
            elif os.access(os.path.join(uri, "Release"), os.R_OK):
                release_file = os.path.join(uri, "Release")
                release_signature_file = os.path.join(uri, "Release.gpg")
                if os.access(release_signature_file, os.R_OK):
                    process = subprocess.Popen(
                        ["gpg", "--verify", "--homedir", SPACEWALK_GPG_HOMEDIR,
                        release_signature_file, release_file],
                        stdout=subprocess.DEVNULL,
                        stderr=subprocess.DEVNULL,
                    )
                    out = process.wait(timeout=90)
                else:
                    raise GeneralRepoException("Signature file for GPG check could not be accessed: {}".format(release_signature_file))
            else:
                raise GeneralRepoException("No release file found: {}".format(uri))
        else:
            # There is a response, so we are dealing with a URL.
            if parse.urlparse(response.url).path.endswith("InRelease"):
                process = subprocess.Popen(
                    ["gpg", "--verify", "--homedir", SPACEWALK_GPG_HOMEDIR],
                    stdin=subprocess.PIPE,
                    stdout=subprocess.DEVNULL,
                    stderr=subprocess.DEVNULL,
                )
                out = process.communicate(response.content, timeout=90)
            else:
                signature_response = requests.get(self._get_parent_url(response.url, 1, "Release.gpg"), proxies=self.proxies)
                if signature_response.status_code != http.HTTPStatus.OK:
                    return False
                else:
                    temp_release_file = tempfile.NamedTemporaryFile()
                    temp_release_file.write(response.content)
                    temp_release_file.seek(0)
                    temp_signature_file = tempfile.NamedTemporaryFile()
                    temp_signature_file.write(signature_response.content)
                    temp_signature_file.seek(0)
                    process = subprocess.Popen(
                        ["gpg", "--verify", "--homedir", SPACEWALK_GPG_HOMEDIR,
                        temp_signature_file.name, temp_release_file.name],
                        stdout=subprocess.DEVNULL,
                        stderr=subprocess.DEVNULL,
                    )
                    out = process.wait(timeout=90)

        if process.returncode == 0:
            return True
        else:
            return False


    def get_release_index(self) -> typing.Dict[str, "DpkgRepo.ReleaseEntry"]:
        """
        Find and return contents of Release file.

        InRelease file take precedence over Release file if both exist.
        In either case the file must be signed with a GPG key. The signature is
        verified before the content is parsed.

        :raises GeneralRepoException if the Release file cannot be found or the GPG signature can't be verified.
        :return: string
        """
        if self._url.startswith("file://"):
            return self._get_release_index_from_file()
        else:
            return self._get_release_index_from_http()


    def _get_release_index_from_file(self) -> typing.Dict[str, "DpkgRepo.ReleaseEntry"]:
        # InRelease files take precedence per uyuni-rfc 00057-deb-repo-sync-gpg-check
        local_path = self._url.replace("file://", "")
        release_file = None
        if os.access(self._get_parent_url(local_path, 2, "InRelease"), os.R_OK):
            release_file = self._get_parent_url(local_path, 2, "InRelease")
            self._flat = False
        elif os.access(self._get_parent_url(local_path, 2, "Release"), os.R_OK):
            release_file = self._get_parent_url(local_path, 2, "InRelease")
            self._flat = False
        else:
            self._flat = True
        self._flat_checked = 1

        # Repo format is not flat
        if not self.is_flat():
            if self.gpg_verify and not self._has_valid_gpg_signature(local_path):
                raise GeneralRepoException("GPG verfication failed: {}".format(release_file))
            try:
                with open(release_file, "rb") as f:
                    self._release = self._parse_release_index(f.read().decode("utf-8"))
            except IOError:
                raise GeneralRepoException("IOError while accessing file: {}".format(release_file))

        # Repo format is flat
        else:
            if os.access(self._get_parent_url(local_path, 0, "InRelease"), os.R_OK):
                release_file = self._get_parent_url(local_path, 0, "InRelease")
            elif os.access(self._get_parent_url(local_path, 0, "Release"), os.R_OK):
                release_file = self._get_parent_url(local_path, 0, "Release")
            else:
                raise GeneralRepoException("No release file found in {}".format(self._get_parent_url(local_path, 0)))

            try:
                with open(release_file, "rb") as f:
                    release_file_content = f.read().decode("utf-8")
                    if self.gpg_verify and not self._has_valid_gpg_signature(local_path):
                        raise GeneralRepoException("GPG verfication failed: {}".format(release_file))
                    self._release = self._parse_release_index(release_file_content)
            except IOError:
                raise GeneralRepoException("IOError while accessing file: {}".format(release_file))

        return self._release

    def _get_release_index_from_http(self) -> typing.Dict[str, "DpkgRepo.ReleaseEntry"]:
        # InRelease files take precedence per uyuni-rfc 00057-deb-repo-sync-gpg-check
        resp = requests.get(self._get_parent_url(self._url, 2, "InRelease"), proxies=self.proxies)
        if resp.status_code != http.HTTPStatus.OK:
            resp = requests.get(self._get_parent_url(self._url, 2, "Release"), proxies=self.proxies)
        
        try:
            if resp.status_code not in [
                http.HTTPStatus.NOT_FOUND,
                http.HTTPStatus.OK,
                http.HTTPStatus.FORBIDDEN,
            ]:
                raise GeneralRepoException(
                    "HTTP error {} occurred while connecting to the URL".format(resp.status_code)
                )

            self._flat = resp.status_code in [http.HTTPStatus.NOT_FOUND, http.HTTPStatus.FORBIDDEN]
            self._flat_checked = 1

            if not self.is_flat() and self.gpg_verify and not self._has_valid_gpg_signature(resp.url, resp):
                raise GeneralRepoException("GPG verfication failed: {}".format(resp.url))

            self._release = self._parse_release_index(resp.content.decode("utf-8"))

            if not self._release and self.is_flat():
                resp = requests.get(self._get_parent_url(self._url, 0, "InRelease"), proxies=self.proxies)
                if resp.status_code != http.HTTPStatus.OK:
                    resp = requests.get(self._get_parent_url(self._url, 0, "Release"), proxies=self.proxies)

                if resp.status_code == http.HTTPStatus.OK:
                    if self.gpg_verify and not self._has_valid_gpg_signature(resp.url, resp):
                        raise GeneralRepoException("GPG verfication failed: {}".format(resp.url))
                    self._release = self._parse_release_index(resp.content.decode("utf-8"))
        finally:
            resp.close()

        return self._release

    @staticmethod
    def _get_parent_url(url, depth=1, add_path=""):
        """
        Get parent url from the given one.

        :param url: an url
        :return: parent url
        """
        p_url = parse.urlparse(url)
        p_path = p_url.path.rstrip("/").split("/")
        if depth:
            p_path = p_path[:-depth]

        return parse.urlunparse(parse.ParseResult(scheme=p_url.scheme, netloc=p_url.netloc,
                                                  path="/".join(p_path + add_path.strip("/").split("/")) or "/",
                                                  params=p_url.params, query=p_url.query, fragment=p_url.fragment))

    def is_flat(self) -> bool:
        """
        Detect if the repository has flat format.

        :return:
        """
        if self._flat_checked is None:
            self.get_release_index()

        return bool(self._flat)

    def verify_packages_index(self) -> bool:
        """
        Verify Packages index with the best available checksum algorithm.

        :return: result (boolean)
        """
        name, data = self.get_pkg_index_raw()

        # If there are no packages in the repo, return True
        if (name, data) == ("", b"",):
           return True

        entry = self.get_release_index().get(name)
        if entry is None:
            return False

        result = False
        for algorithm in ("sha512", "sha384", "sha256", "sha1", "md5"):
            entry_checksum = getattr(entry.checksum, algorithm, None)
            if entry_checksum:
                result = getattr(hashlib, algorithm)(data).hexdigest() == entry_checksum
                break
            else:
                continue

        return result
   07070100000022000081B40000000000000000000000015FBBE8EE00002184000000000000000000000000000000000000002600000000spacewalk-backend/common/rhnApache.py #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# Code for the shared apache handler class inherited by the
# Spacewalk Proxy and server.
#

# system module imports
import time


# global module imports
from rhn.UserDictCase import UserDictCase


# Now local module imports
from spacewalk.common import rhnFlags
from spacewalk.common import apache
from spacewalk.common.rhnLog import log_debug, log_error, log_setreq
from spacewalk.common.rhnTranslate import cat


class rhnApache:

    """ Shared rhnApache class: rhnApache classes in proxy and server inherit
        this class.

        Shared apache handler code: headerParserHandler,
                                handler (defined in class that inherits this),
                                cleanupHandler.
    """
    _lang_catalog = "common"

    def __init__(self):
        self.lang = "C"
        self.domain = None
        self.clientVersion = 0
        self.proxyVersion = None
        self.start_time = 0

    ###
    # HANDLERS, in the order which they are called
    ###

    def headerParserHandler(self, req):
        """
        after a request has been received, first thing we do is to create the
        input object
        """
        # pylint: disable=R0911

        log_setreq(req)
        log_debug(3)
        self.start_time = time.time()
        # Decline if this is a subrequest:
        if req.main:
            return apache.DECLINED
        log_debug(4, req.method, req.path_info, req.headers_in)

        # Clear the global flags.
        rhnFlags.reset()
        # Init the transport options.
        rhnFlags.set('outputTransportOptions', UserDictCase())
        # Init the session token dictionary.
        rhnFlags.set("AUTH_SESSION_TOKEN", UserDictCase())

        ret = self._init_request_processor(req)
        if ret != apache.OK:
            return ret

        ret = self._set_client_info(req)
        if ret != apache.OK:
            return ret

        # Check the protocol version
        if req.proto_num < 1001:
            # HTTP protocols prior to 1.1 close the connection
            rhnFlags.get('outputTransportOptions')["Connection"] = "close"

        ret = self._set_proxy_info(req)
        if ret != apache.OK:
            return ret

        # Need to run _set_other first, since _set_lang needs RoodDir set
        ret = self._set_other(req)
        if ret != apache.OK:
            return ret

        ret = self._set_lang(req)
        if ret != apache.OK:
            return ret

        return apache.OK

    def _set_client_info(self, req):
        # Figure out the client version
        clientVersionHeader = 'X-RHN-Client-Version'
        if clientVersionHeader in req.headers_in:
            # Useful to have it as a separate variable, to see it in a
            # traceback report
            clientVersion = req.headers_in[clientVersionHeader]
            self.clientVersion = int(clientVersion)
        # NOTE: x-client-version is really the cgiwrap xmlrpc API version
        #       NOT the RHN client version... but it works if nothing else
        #       does.
        elif 'X-Client-Version' in req.headers_in:
            clientVersion = req.headers_in['X-Client-Version']
            self.clientVersion = int(clientVersion)
        else:
            self.clientVersion = 0

        # Make sure the client version gets set in the headers.
        rhnFlags.get('outputTransportOptions')[clientVersionHeader] = str(
            self.clientVersion)
        return apache.OK

    def _set_proxy_info(self, req):
        """ Spacewalk Proxy stuff. """
        proxyVersion = 'X-RHN-Proxy-Version'
        if proxyVersion in req.headers_in:
            self.proxyVersion = req.headers_in[proxyVersion]
        # Make sure the proxy version gets set in the headers.
        rhnFlags.get('outputTransportOptions')[proxyVersion] = str(
            self.proxyVersion)
        # Make sure the proxy auth-token gets set in global flags.
        if 'X-RHN-Proxy-Auth' in req.headers_in:
            rhnFlags.set('X-RHN-Proxy-Auth',
                         req.headers_in['X-RHN-Proxy-Auth'])
        return apache.OK

    def _set_lang(self, req):
        """ determine what language the client prefers """
        if "Accept-Language" in req.headers_in:
            # RFC 2616 #3.10: case insensitive
            lang = req.headers_in["Accept-Language"].lower()
        else:
            lang = "C"
        self.setlang(lang, self._lang_catalog)

        return apache.OK

    @staticmethod
    def _set_other(_req):
        return apache.OK

    def _init_request_processor(self, req):
        # first, make sure we only allow certain methods
        if req.method == "GET":
            # This is a request from a cache/client, so verify the signature,
            # system_id, and expiration exist and push into rhnFlags.
            token = self._setSessionToken(req.headers_in)
            if token is None:
                return apache.HTTP_METHOD_NOT_ALLOWED
            return apache.OK

        elif req.method == "POST":
            return apache.OK

        elif req.method == "HEAD":
            # We should only receive this type of request from ourself.
            return apache.OK

        log_error("Unknown HTTP method", req.method)
        return apache.HTTP_METHOD_NOT_ALLOWED

    @staticmethod
    def _cleanup_request_processor():
        return apache.OK

    def handler(self, req):
        """
        a handler - not doing much for the common case, but called from
        classes that inherit this one.
        """
        log_debug(3)
        # Set the lang in the output headers
        if self.lang != "C":
            req.headers_out["Content-Language"] = self.getlang()

        log_debug(4, "URI", req.unparsed_uri)
        log_debug(4, "CONFIG", req.get_config())
        log_debug(4, "OPTIONS", req.get_options())
        log_debug(4, "HEADERS", req.headers_in)
        return apache.OK

    def cleanupHandler(self, _req):
        """
        clean up this session
        """
        log_debug(3)
        self.lang = "C"
        self.clientVersion = self.proxyVersion = 0
        # clear the global flags
        rhnFlags.reset()
        timer(self.start_time)
        return self._cleanup_request_processor()

    @staticmethod
    def logHandler(_req):
        """
        A dummy log function
        """
        log_debug(3)
        return apache.OK

    def setlang(self, lang, domain):
        """
        An entry point for setting the language for the current sesstion
        """
        self.lang = lang
        self.domain = domain
        cat.set(domain=domain)
        # If the language presented by the client does not exist, the
        # translation object falls back to printing the original string, which
        # is pretty much the same as translating to en
        cat.setlangs(self.lang)
        log_debug(3, self.lang, self.domain)

    @staticmethod
    def getlang():
        """
        And another lang function to produce the list of languages we're
        handling
        """
        return "; ".join(cat.getlangs())

    @staticmethod
    def _setSessionToken(headers):
        """ Pushes token into rhnFlags. If doesn't exist, returns None.
            Pull session token out of the headers and into rhnFlags.
        """
        log_debug(3)
        token = UserDictCase()
        if 'X-RHN-Server-Id' in headers:
            token['X-RHN-Server-Id'] = headers['X-RHN-Server-Id']
        else:
            # This has to be here, or else we blow-up.
            return None
        prefix = "x-rhn-auth"
        tokenKeys = [x for x in list(headers.keys()) if x[:len(prefix)].lower() == prefix]
        for k in tokenKeys:
            token[k] = headers[k]

        rhnFlags.set("AUTH_SESSION_TOKEN", token)
        return token


def timer(last):
    """
    a lame timer function for pretty logs
    """
    if not last:
        return 0
    log_debug(2, "Request served in %.2f sec" % (time.time() - last, ))
    return 0
07070100000023000081B40000000000000000000000015FBBE8EE000031D5000000000000000000000000000000000000002500000000spacewalk-backend/common/rhnCache.py  # Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

# This module implements a simple object caching system using shelves
# stored in files on the file system
#

import os
import gzip
try:
    #  python 2
    import cPickle
except ImportError:
    #  python3
    import pickle as cPickle
import fcntl
import sys
from stat import ST_MTIME
from errno import EEXIST

from uyuni.common.rhnLib import timestamp

from uyuni.common.usix import raise_with_tb
from uyuni.common.fileutils import makedirs, setPermsPath

# this is a constant I'm not too happy about but one way or another we have
# to reserve our own shared memory space.
CACHEDIR = "/var/cache/rhn"


def cleanupPath(path):
    """take ~taw/../some/path/$MOUNT_POINT/blah and make it sensible."""
    if path is None:
        return None
    return os.path.normpath(
        os.path.expanduser(
            os.path.expandvars(path)))

# build a filename for storing the key - eventually this is going to get
# more compelx as we observe issues


def _fname(name):
    fname = "%s/%s" % (CACHEDIR, name)
    return cleanupPath(fname)


def _unlock(fd):
    try:
        fcntl.lockf(fd, fcntl.LOCK_UN)
    except IOError:
        # If LOCK is not relinquished try flock,
        # its usually more forgiving.
        fcntl.flock(fd, fcntl.LOCK_UN)

# The following functions expose this module as a dictionary


def get(name, modified=None, raw=None, compressed=None, missing_is_null=1):
    cache = __get_cache(raw, compressed)

    if missing_is_null:
        cache = NullCache(cache)

    return cache.get(name, modified)


def set(name, value, modified=None, raw=None, compressed=None,
        user='root', group='root', mode=int('0755', 8)):
    # pylint: disable=W0622
    cache = __get_cache(raw, compressed)

    cache.set(name, value, modified, user, group, mode)


def has_key(name, modified=None):
    cache = Cache()
    return cache.has_key(name, modified)


def delete(name):
    cache = Cache()
    cache.delete(name)


def __get_cache(raw, compressed):
    cache = Cache()
    if compressed:
        cache = CompressedCache(cache)
    if not raw:
        cache = ObjectCache(cache)

    return cache


class UnreadableFileError(Exception):
    pass


def _safe_create(fname, user, group, mode):
    """ This function returns a file descriptor for the open file fname
        If the file is already there, it is truncated
        otherwise, all the directories up to it are created and the file is created
        as well.
    """

    # There can be race conditions between the moment we check for the file
    # existence and when we actually create it, so retry if something fails
    tries = 5
    while tries:
        tries = tries - 1
        # we're really picky about what can we do
        if os.access(fname, os.F_OK):  # file exists
            if not os.access(fname, os.R_OK | os.W_OK):
                raise UnreadableFileError()

            fd = os.open(fname, os.O_WRONLY | os.O_TRUNC)
            # We're done
            return fd

        # If directory does not exist, attempt to create it
        dirname = os.path.dirname(fname)
        if not os.path.isdir(dirname):
            try:
                #os.makedirs(dirname, 0755)
                makedirs(dirname, mode, user, group)
            except OSError:
                e = sys.exc_info()[1]
                # There is a window between the moment we check the disk and
                # the one we try to create the directory
                # We double-check the file existance here
                if not (e.errno == EEXIST and os.path.isdir(dirname)):
                    # If the exception was thrown on a parent dir
                    # check the subdirectory to go through next loop.
                    if os.path.isdir(e.filename):
                        continue
                    # Pass exception through
                    raise
            except:
                # Pass exception through
                raise
        # If we got here, it means the directory exists

        # file does not exist, attempt to create it
        # we pass most of the exceptions through
        try:
            fd = os.open(fname, os.O_WRONLY | os.O_CREAT | os.O_EXCL, int('0644', 8))
        except OSError:
            e = sys.exc_info()[1]
            # The file may be already there
            if e.errno == EEXIST and os.access(fname, os.F_OK):
                # Retry
                continue
            # Pass exception through
            raise
        # If we got here, the file is created, so break out of the loop
        setPermsPath(fname, user, group, mode)
        return fd

    # Ran out of tries; something is fishy
    # (if we manage to create or truncate the file, we've returned from the
    # function already)
    raise RuntimeError("Attempt to create file %s failed" % fname)


class LockedFile(object):

    def __init__(self, name, modified=None, user='root', group='root',
                 mode=int('0755', 8)):
        if modified:
            self.modified = timestamp(modified)
        else:
            self.modified = None

        self.fname = _fname(name)
        self.fd = self.get_fd(name, user, group, mode)

        self.closed = False

    def close(self):
        if not self.closed:
            self.close_fd()

            _unlock(self.fd.fileno())
            self.fd.close()
            self.closed = True

    def get_fd(self, name, user, group, mode):
        raise NotImplementedError

    def close_fd(self):
        raise NotImplementedError

    def __getattr__(self, x):
        return getattr(self.fd, x)


class ReadLockedFile(LockedFile):

    def get_fd(self, name, _user, _group, _mode):
        if not os.access(self.fname, os.R_OK):
            raise KeyError(name)
        fd = open(self.fname, "rb")

        fcntl.lockf(fd.fileno(), fcntl.LOCK_SH)

        if self.modified:
            if os.fstat(fd.fileno())[ST_MTIME] != self.modified:
                fd.close()
                raise KeyError(name)

        return fd

    def close_fd(self):
        pass


class WriteLockedFile(LockedFile):

    def get_fd(self, name, user, group, mode):
        try:
            fd = _safe_create(self.fname, user, group, mode)
        except UnreadableFileError:
            raise_with_tb(OSError("cache entry exists, but is not accessible: %s" % \
                name), sys.exc_info()[2])

        # now we have the fd open, lock it
        fcntl.lockf(fd, fcntl.LOCK_EX)
        return os.fdopen(fd, 'wb')

    def close_fd(self):
        # Set the file's mtime if necessary
        self.flush()
        if self.modified:
            os.utime(self.fname, (self.modified, self.modified))


class Cache:

    def __init__(self):
        pass

    def get(self, name, modified=None):
        fd = self.get_file(name, modified)

        s = fd.read()
        fd.close()

        if sys.version_info[0] >= 3 and isinstance(s, bytes):

            try:
               s = s.decode('utf8')
            except:
               s = s.decode('latin-1')
        return s

    def set(self, name, value, modified=None, user='root', group='root',
            mode=int('0755', 8)):
        fd = self.set_file(name, modified, user, group, mode)

        if sys.version_info[0] >= 3 and isinstance(value, str):
            value = value.encode('utf8')

        fd.write(value)
        fd.close()

    @staticmethod
    def has_key(name, modified=None):
        fname = _fname(name)
        if modified is not None:
            modified = timestamp(modified)
        if not os.access(fname, os.R_OK):
            return False
        # the file exists, so os.stat should not raise an exception
        statinfo = os.stat(fname)
        if modified is not None and statinfo[ST_MTIME] != modified:
            return False
        return True

    @staticmethod
    def delete(name):
        fname = _fname(name)
        # test for valid entry
        if not os.access(fname, os.R_OK):
            raise KeyError("Invalid cache key for delete: %s" % name)
        # now can we delete it?
        if not os.access(fname, os.W_OK):
            raise OSError("Read-Only access for cache entry: %s" % name)
        os.unlink(fname)

    @staticmethod
    def get_file(name, modified=None):
        fd = ReadLockedFile(name, modified)
        return fd

    @staticmethod
    def set_file(name, modified=None, user='root', group='root',
                 mode=int('0755', 8)):
        fd = WriteLockedFile(name, modified, user, group, mode)
        return fd


class ClosingZipFile(object):

    """ Like a GzipFile, but close closes both files. """

    def __init__(self, mode, io):
        self.zipfile = gzip.GzipFile(None, mode, 5, io)
        self.rawfile = io

    def close(self):
        self.zipfile.close()
        self.rawfile.close()

    def __getattr__(self, x):
        return getattr(self.zipfile, x)


class CompressedCache:

    def __init__(self, cache):
        self.cache = cache

    def get(self, name, modified=None):
        fd = self.get_file(name, modified)
        try:
            value = fd.read()
        except (ValueError, IOError, gzip.zlib.error):
            # Some gzip error
            # poking at gzip.zlib may not be such a good idea
            fd.close()
            raise_with_tb(KeyError(name), sys.exc_info()[2])
        fd.close()

        return value

    def set(self, name, value, modified=None, user='root', group='root',
            mode=int('0755', 8)):
        # Since most of the data is kept in memory anyway, don't bother to
        # write it to a temp file at this point
        f = self.set_file(name, modified, user, group, mode)
        f.write(value)
        f.close()

    def has_key(self, name, modified=None):
        return self.cache.has_key(name, modified)

    def delete(self, name):
        self.cache.delete(name)

    def get_file(self, name, modified=None):
        compressed_file = self.cache.get_file(name, modified)
        return ClosingZipFile('rb', compressed_file)

    def set_file(self, name, modified=None, user='root', group='root',
                 mode=int('0755', 8)):
        io = self.cache.set_file(name, modified, user, group, mode)

        f = ClosingZipFile('wb', io)
        return f


class ObjectCache:

    def __init__(self, cache):
        self.cache = cache

    def get(self, name, modified=None):
        pickled = self.cache.get(name, modified)

        try:
            if sys.version_info[0] >= 3 and isinstance(pickled, str):
                 pickled = pickled.encode('latin-1')
            return cPickle.loads(pickled)
        except cPickle.UnpicklingError:
            raise_with_tb(KeyError(name), sys.exc_info()[2])

    def set(self, name, value, modified=None, user='root', group='root',
            mode=int('0755', 8)):
        pickled = cPickle.dumps(value, -1)
        self.cache.set(name, pickled, modified, user, group, mode)

    def has_key(self, name, modified=None):
        return self.cache.has_key(name, modified)

    def delete(self, name):
        self.cache.delete(name)

    @staticmethod
    def get_file(*_args):
        raise RuntimeError("Getting a file descriptor for an object makes no sense.")


class NullCache:

    """ A cache that returns None rather than raises a KeyError. """

    def __init__(self, cache):
        self.cache = cache

    def get(self, name, modified=None):
        try:
            return self.cache.get(name, modified)
        except KeyError:
            return None

    def set(self, name, value, modified=None, user='root', group='root',
            mode=int('0755', 8)):
        self.cache.set(name, value, modified, user, group, mode)

    def has_key(self, name, modified=None):
        return self.cache.has_key(name, modified)

    def delete(self, name):
        self.cache.delete(name)

    def get_file(self, name, modified=None):
        try:
            return self.cache.get_file(name, modified)
        except KeyError:
            return None

    def set_file(self, name, modified=None, user='root', group='root',
                 mode=int('0755', 8)):
        return self.cache.set_file(name, modified, user, group, mode)
   07070100000024000081B40000000000000000000000015FBBE8EE00004FAB000000000000000000000000000000000000002600000000spacewalk-backend/common/rhnConfig.py #
# Copyright (c) 2008--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import os
import sys
import glob
import stat
import re

from rhn.UserDictCase import UserDictCase
from uyuni.common.usix import raise_with_tb

# bare-except and broad-except
# pylint: disable=W0702,W0703

_CONFIG_ROOT = '/etc/rhn'
_CONFIG_FILE = '%s/rhn.conf' % _CONFIG_ROOT
_CONFIG_DEFAULTS_ROOT = '/usr/share/rhn/config-defaults'


def warn(*args):
    """
    Function used for debugging purposes
    """
    sys.stderr.write("CONFIG PARSE WARNING: %s\n" % " ".join(map(str, args)))


class ConfigParserError(Exception):

    """
    Exception class we're using to expose fatal errors
    """
    pass


# TODO: need to be able to specify "" component and parse all files in
#       the directory and form a _complete_ mapping structure.
#       Or, if that is too difficult, take in a list of components...
class RHNOptions:

    """ Main options class
        The basic idea is to share the important pieces of information - the
        component and the configuration tree - across all instances of this
        class.
    """

    def __init__(self, component=None, root=None, filename=None):
        self.__component = None
        # Defaults for each option, keyed on tuples
        self.__defaults = {}
        # Parsed config file, keyed on tuples
        self.__parsedConfig = {}
        # Dictionary used as a cache (to avoid looking up options all over the
        # place). Keyed on strings (component names)
        self.__configs = {}
        # Last modification date for the config file
        self.__timestamp = 0
        # NOTE: root: root directory location of config files.
        self.root = None
        self.filename = None
        self.init(component, root, filename)

    def init(self, component, root=None, filename=None):
        """
        Visible function, so that we can re-init the object without
        losing the reference to it
        """
        if root is None:
            root = _CONFIG_ROOT
        self.filename = filename
        if self.filename is None:
            self.filename = _CONFIG_FILE
        self.setComponent(component)
        self.root = root

    def setComponent(self, comp):
        if not comp:
            comp = ()
        self.__component = comp

    def getComponent(self):
        return self.__component

    def is_initialized(self):
        return (self.__component is not None) and \
            self.__component in self.__configs

    def modifiedYN(self):
        """returns last modified time diff if rhn.conf has changed."""

        try:
            si = os.stat(self.filename)
        except OSError:
            e = sys.exc_info()[1]
            if e[0] == 13: #Error code 13 - Permission denied
                sys.stderr.write("ERROR: must be root to execute\n")
            else:
                sys.stderr.write("ERROR: " + self.filename + " is not accesible\n")
            sys.exit(e[0])
        lm = si[stat.ST_MTIME]
        # should always be positive, but a non-zero result is still
        # indication that the file has changed.
        return lm - self.__timestamp

    def updateLastModified(self, timeDiff=None):
        """ update the last modified time of the rhn.conf file. """
        if timeDiff is None:
            timeDiff = self.modifiedYN()
        self.__timestamp = self.__timestamp + timeDiff

    def parse(self):
        """
        This function parses the config file, if needed, and populates
        the configuration cache self.__configs
        """
        # Speed up the most common case
        timeDiff = self.modifiedYN()
        if not timeDiff and self.is_initialized():
            # Nothing to do: the config file did not change and we already
            # have the config cached
            return
        else:
            # if the timestamp changed, clear the list of cached configs
            # and retain the new timestamp
            self.updateLastModified(timeDiff)
            self.__configs.clear()  # cache cleared

        # parse the defaults.
        self._parseDefaults(allCompsYN=0)

        # Now that we parsed the defaults, we parse the multi-key
        # self.filename configuration (ie, /etc/rhn/rhn.conf)
        self.__parsedConfig = parse_file(self.filename)

        # And now generate and cache the current component
        self.__merge()

    def _parseDefaults(self, allCompsYN=0):
        """ Parsing of the /usr/share/rhn/config-defaults/*.conf (or equivalent)
        Make sure we have all the needed default config files loaded
        We store the defaults in a dictionary, keyed on the component tuple
        """
        comps = parse_comps(self.__component)
        if allCompsYN:
            comps = getAllComponents_tuples()
        for comp in comps:
            if comp in self.__defaults:
                # We already have it loaded
                # XXX: Should we do timestamp checking for this one too?
                continue
            # Create the config file name
            conffile = "%s/rhn.conf" % (_CONFIG_DEFAULTS_ROOT)
            if comp:
                conffile = "%s/rhn_%s.conf" % (_CONFIG_DEFAULTS_ROOT,
                                               '_'.join(comp))
            # if the file is not there (or can't be read), skip
            if not os.access(conffile, os.R_OK):
                warn("File not found or can't be read", conffile)
                continue
            # store this default set of values
            _dict = parse_file(conffile, single_key=1)
            # the parsed file is keyed by component, but for a config
            # file containing only single keys we know the component
            # is going to be () and we need to override it with
            # whatever we're parsing now in the self.__defaults table
            def_dict = {}
            for k in list(_dict[()].keys()):
                # we extract just the values and dump the line number
                # from the (values,linno) tuples which is the hash
                # value for _dict[()][k]
                def_dict[k] = _dict[()][k][0]
            self.__defaults[comp] = def_dict

    def keys(self):
        self.__check()
        return list(self.__configs[self.__component].keys())

    def has_key(self, key):
        self.__check()
        return key in self.__configs[self.__component]

    def values(self):
        self.__check()
        return list(self.__configs[self.__component].values())

    def items(self):
        self.__check()
        return list(self.__configs[self.__component].items())

    def set(self, key, value):
        self.__check()
        self.__configs[self.__component][key] = value
    __setitem__ = set

    def show(self):
        self.__check()
        # display the configuration read from the file(s) and exit
        vals = list(self.__configs[self.__component].items())
        vals.sort(key=lambda a: a[0])
        for k, v in vals:
            if v is None:
                v = ""
            print(("%-20s = %s" % (k, v)))

    # polymorphic methods

    def __getattr__(self, key):
        """fetch option you want in a self.DEBUG kind of syntax
           (can force component selection)

        e.g.: say for example we have an option proxy.debug = 5
              stored in the dictionary. proxy just says that only proxy
              can access this option. So for this exmple,
              self.__component is proxy.
               cfg = RHNOptions("proxy")
               print cfg.DEBUG ---> yields 5
        """
        self.__check()
        # For some reason, before the migration to python3, the code
        # used all attribute names in capital letters, and it worked
        # while for python3 it is failing. Adding .lower() since
        # otherwise changing the mentions to config parameters
        # all over the code, would take ages
        if key.lower() not in self.__configs[self.__component]:
            raise AttributeError(key)
        return self.__configs[self.__component][key.lower()]
    __getitem__ = __getattr__

    def get(self, key, default=None):
        ret = default
        if key in self.__configs[self.__component]:
            ret = self.__configs[self.__component][key]
        return ret

    def __str__(self):
        s = "Uninitialized"
        if self.__component and self.__component in self.__configs:
            s = str(self.__configs[self.__component])
        return "<RHNOptions instance at %s: %s>" % (id(self), s)
    __repr__ = __str__

    # private methods

    def __check(self):
        if not self.is_initialized():
            raise ConfigParserError("Uninitialized config for component",
                                    self.__component)

    def __merge(self, component=None):
        """
        merge the config options between the default comp dictionaries
        and the file we're parsing now
        """
        # Caches this component's configuration options
        if component is None:
            component = self.__component

        opts = UserDictCase()
        comps = parse_comps(component)
        for comp in comps:
            if comp not in self.__defaults:
                warn('key not found in config default dict', comp)
                continue
            opts.update(self.__defaults[comp])

        # Now load the specific stuff, and perform syntax checking too
        for comp in comps:
            if comp not in self.__parsedConfig:
                # No such entry in the config file
                continue
            for key, (values, _lineno_) in list(self.__parsedConfig[comp].items()):
                # we don't really want to force every item in the
                # config file to have a default value first. If we do,
                # uncomment this section
                # if not opts.has_key(key): # Unknown keyword
                #    warn("Warning: in file %s, line %s: unknown "
                #        "option name `%s'" % (self.filename, lineno, key))
                #    continue
                opts[key] = values
        # and now save it
        self.__configs[component] = opts

    # protected/test methods

    def getDefaults(self):
        """returns the __defaults dict (dictionary of parsed defaults).
        """
        self.__check()
        return self.__defaults

    def _getParsedConfig(self):
        """returns the __parsedConfig dict (dictionary of parsed
           /etc/rhn/rhn.conf file).
        """
        self.__check()
        return self.__parsedConfig

    def _getConfigs(self):
        """returns the __configs dict (dictionary of the merged options
           keyed by component.
        """
        self.__check()
        return self.__configs

    def showall(self):
        from pprint import pprint
        print("__defaults: dictionary of parsed defaults.")
        pprint(self.__defaults)
        print("")
        print("__parsedConfig: dictionary of parsed /etc/rhn/rhn.conf file.")
        pprint(self.__parsedConfig)
        print("")
        print("__configs: dictionary of the merged options keyed by component.")
        pprint(self.__configs)


def parse_comps(component):
    """
    Splits a component name (a.b.c) into a list of tuples that can be
    joined together to determine a config file name
    Eg. a.b.c --> [(), ('a',), ('a','b'), ('a','b','c')]
    """
    # Split the component name on '.'
    if not component:
        return [()]
    comps = [c.lower() for c in component.split('.')]
    # Now generate the prefixes for this component
    return [tuple(comps[:i]) for i in range(len(comps) + 1)]


def parse_line(line):
    """
    Parse a config line...
    Returns a tuple (keys, values), or (None, None) if we don't care
    about this line
    """
    varSeparator = '.'
    optSeparator = ','

    def sanitize_value(key, val):
        """
        attempt to convert a string value to the proper type
        """
        converTable = {'proxy.http_proxy_username': str,
                       'proxy.http_proxy_password': str,
                       'server.satellite.http_proxy_username': str,
                       'server.satellite.http_proxy_password': str,
                       'server.satellite.rhn_parent': str,
                       'db_name': str,
                       'db_user': str,
                       'db_password': str,
                       'db_host': str,
                       'server.susemanager.mirrcred_user': str,
                       'server.susemanager.mirrcred_pass': str}
        val = val.strip()

        if converTable.get(key):
            try:
                val = converTable.get(key)(val)
            except ValueError:
                pass
        else:
            try:
                val = int(val)  # make int if can.
            except ValueError:
                try:
                    val = float(val)  # make float if can.
                except ValueError:
                    pass
        if val == '':  # Empty strings treated as None
            val = None
        return val

    # Skip empty and comment-only lines
    if re.match(r'[ \t]*(#|$)', line):
        return (None, None)

    # now split it into keys and values. We allow for max one
    # split/cut (the first one)
    (keys, vals) = [c.strip() for c in line.split('=', 1)]

    # extract the keys, convert to lowercase
    keys = keys.lower()
    if not keys:
        raise ConfigParserError("Missing Key = expression")

    # extract the values, preserving case
    if not vals:
        keys = keys.split(varSeparator)
        return (keys, None)
    # split and sanitize
    vals = list(map(sanitize_value, [keys] * len(vals.split(optSeparator)),
                    vals.split(optSeparator)))
    if len(vals) == 1:
        # Single value
        vals = vals[0]
    keys = keys.split(varSeparator)
    # and now return our findings
    return (keys, vals)


def parse_file(filename, single_key=0):
    """
    parse a config file (read it in, parse its lines)
    """
    lines = read_file(filename)
    # the base case, an empty tuple component, is always present.
    ret = {(): {}}
    lineno = 0
    # okay, read the file, parse the lines one by one
    for line in lines:
        # lineno is 1-based
        lineno = lineno + 1
        try:
            (keys, values) = parse_line(line)
        except:
            raise_with_tb(ConfigParserError("Parse Error: <%s:%s>: '%s'" % (
                filename, lineno, line)), sys.exc_info()[2])
        if keys is None:  # We don't care about this line
            continue
        # now process the parsed line
        if single_key and len(keys) > 1:
            # Error, we should not have more than one key in the this
            # config file
            #            raise ConfigParserError("Parse Error: <%s:%s>: too many keys"
            #              % (filename, lineno))
            # let's fix the faulty config=file setup...
            # XXX: needs more testing!!! (2003-04-17)
            del keys[:-1]
        # Store this line in a dictionary filled by component
        comp = tuple(keys[:-1])
        key = keys[-1]
        if comp not in ret:
            # Don't make it a UserDictCase since we know exactly we
            # already used string.lower
            ret[comp] = {}
        ret[comp][key] = (values, lineno)
    return ret


def read_file(filename):
    """
    reads a text config file and returns its lines in a list
    """
    try:
        with open(filename, 'r') as configfile:
            return configfile.readlines()
    except (IOError, OSError):
        e = sys.exc_info()[1]
        raise_with_tb(ConfigParserError("Can not read config file", filename, e.args[1]), sys.exc_info()[2])


def getAllComponents_tree(defaultDir=None):
    """Figure out all components and return them in a tree-like structure

    {'server', {'server.app':{},
                'server.satellite':{},
                'server.applet':{}, 'server.bugzilla':{},
                'server.iss':{}, 'server.xmlrpc':{}, 'server.xp':{}},
     'web': {},
     'tools': {}}

    NOTE: this was begging for recursion... I avoided that like the plague
    """

    if defaultDir is None:
        defaultDir = _CONFIG_DEFAULTS_ROOT
    comps = glob.glob('%s/*.conf' % defaultDir)
    compTree = {}
    for comp in comps:
        comp = os.path.basename(comp)
        comp = comp[:comp.find('.')]       # left of .conf
        parts = comp.split('_')[1:]        # strip off that rhn_
        if not parts:
            continue
        d = compTree
        for i in range(len(parts)):
            key = '.'.join(parts[:i + 1])
            if key not in d:
                d[key] = {}
            d = d[key]
    return compTree


def getAllComponents(defaultDir=None, compsTree=None):
    """recursively flattens the results of getAllComponents_tree returning
       a list of all components"""

    if compsTree is None:
        compsTree = getAllComponents_tree(defaultDir)
    l = []
    for k, v in list(compsTree.items()):
        l.extend(getAllComponents(None, v))
        l.append(k)
    return l


def getAllComponents_tuples(defaultDir=None):
    """returns a list of ALL components in the tuple-ified format:
       E.g., [(), ('a',), ('a','b'), ('a','b','c'), ...]
    """
    comps = getAllComponents(defaultDir)
    d = {}
    for comp in comps:
        for c in parse_comps(comp):
            d[c] = None
    return list(d.keys())


CFG = RHNOptions()


def initCFG(component=None, root=None, filename=None):
    """
    Main entry point here
    """
    # NOTE: root: root directory location of config files.
    CFG.init(component, root, filename)
    CFG.parse()

try:
    ALL_CFG = RHNOptions('')
    ALL_CFG.parse()
    PRODUCT_NAME = ALL_CFG.PRODUCT_NAME
except ConfigParserError:
    PRODUCT_NAME = "SUSE Manager"


def isUyuni():
    return (PRODUCT_NAME == "Uyuni")

def runTest():
    print("Test script:")
    import pprint
    print("Component tree of all installed components:")
    pprint.pprint(getAllComponents_tree())
    print("")
    test_cfg = RHNOptions(sys.argv[1])
#    test_cfg = RHNOptions('server.app')
#    test_cfg = RHNOptions('proxy.broker')
#    test_cfg = RHNOptions('proxy.redirect', _CONFIG_ROOT)
#    test_cfg = RHNOptions('proxy.redirect', '/tmp')
#    test_cfg.filename = 'empty.conf'
    test_cfg.parse()
    print("=============== the object's repr ================================")
    print(test_cfg)
    print("=============== the object's defaults ============================")
    pprint.pprint(test_cfg.getDefaults())
    print("=============== an erronous lookup example =======================")
    print("testing __getattr__")
    try:
        print((test_cfg.lkasjdfxxxxxxxxxxxxxx))
    except AttributeError:
        e = sys.exc_info()[1]
        print(('Testing: "AttributeError: %s"' % e))
    print("")
    print("=============== the object's merged settings ======================")
    test_cfg.show()
    print("=============== dump of all relevant dictionaries =================")
    test_cfg.showall()
    print("===================================================================")


#------------------------------------------------------------------------------
# Usage:  rhnConfig.py [ { get | list } component [ key ] ]
#    No args assumes test mode.


if __name__ == "__main__":
    do_list = 0
    comp_arg = None
    key_arg = None

    if len(sys.argv) == 4 and sys.argv[1] == "get":
        comp_arg = sys.argv[2]
        key_arg = sys.argv[3]
    elif len(sys.argv) == 3 and sys.argv[1] == "list":
        comp_arg = sys.argv[2]
        do_list = 1
    else:
        # Assume test mode.
        runTest()
        sys.exit(1)

    cfg = RHNOptions(comp_arg)
    cfg.parse()

    if do_list:
        cfg.show()
    else:
        print((cfg.get(key_arg)))
 07070100000025000081B40000000000000000000000015FBBE8EE0000364F000000000000000000000000000000000000002900000000spacewalk-backend/common/rhnException.py  #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import sys
try:
    #  python 2
    import xmlrpclib
except ImportError:
    #  python3
    import xmlrpc.client as xmlrpclib  # pylint: disable=F0401

try:
    #  python 2
    from cStringIO import StringIO
except ImportError:
    #  python3
    from io import StringIO


# What other rhn modules we need
from spacewalk.common.rhnConfig import PRODUCT_NAME
from spacewalk.common.rhnTranslate import _
from spacewalk.common import rhnFlags


# default template values for error messages
templateValues = {
    'hostname': 'example.com',
}


# This array translates exception codes into meaningful messages
# for the eye of the beholder
# DOMAINS:
#   0-999:     Red Hat client/client-like interaction errors
#   1000-1999: Proxy specific interaction errors
#   2000-2999: Red Hat Satellite specific interation errors

FaultArray = {
    # 0-999: Red Hat client/client-like interaction errors:
    1: _("This does not appear to be a valid username."),
    2: _("Invalid username and password combination."),
    3: _("This login is already taken, or the password is incorrect."),
    4: _("Permission denied."),
    6: _("Object not found."),
    8: _("Invalid System Digital ID."),
    9: _("Invalid System Credentials."),
    10: _("Could not retrieve user data from database."),
    11: _("Valid username required."),
    12: _("Valid password required."),
    13: _("Minimum username length violation."),
    14: _("Minimum password length violation."),
    15: _("The username contains invalid characters."),
    17: _("File not found."),
    19: _("Architecture and OS version combination is not supported."),
    20: _("Could not retrieve system data from database."),
    21: _("Invalid arguments passed to function."),
    22: _("Unable to retrieve requested entry."),
    23: _("Could not update database entry."),
    24: _("Unsupported server architecture."),
    28: _("""
     The anonymous server functionality is no longer available.

     Please re-register this system by running mgr_register as root.
     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do
     or login at https://%(hostname)s, and from the "Overview" tab,
     select "Subscription Management" to enable the service for this system.
     """),
    29: _("Record not available in the database."),
    30: _("Invalid value for entry."),
    31: _("""
     This system does not have a valid entitlement for SUSE Manager.
     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do
     or login at https://%(hostname)s, and from the "Overview" tab,
     select "Subscription Management" to enable the service for this system.
     """),
    32: _("Channel error"),
    33: _("Client session token is invalid."),
    34: _("Client session token has expired."),
    35: _("You are not authorized to retrieve the requested object."),
    36: _("Invalid action"),
    37: _("You are not allowed to perform administrative tasks \
on this system."),
    38: _("The system is already subscribed to the specified channel."),
    39: _("The system is not currently subscribed to the specified channel."),
    40: _("The specified channel does not exist."),
    41: _("Invalid channel version."),
    43: _("""
     User group membership limits exceeded.

     The current settings for your account do not allow you to add another
     user account. Please check with the organization administrator for your
     account if the maximum number of users allowed to subscribe to server needs
     to be changed.
     """),
    44: _("""
     System group membership limits exceeded.

     The current settings for your account do not allow you to add another
     system profile. Please check with the organization administrator for your
     account for modifying the maximum number of system profiles that can be
     subscribed to your account.
     """),
    45: _("""
     Invalid architecture.

     The architecture of the package is not supported by
     """ + PRODUCT_NAME),
    47: _("""Invalid RPM header"""),
    48: _("""
    This system is already registered as a Salt Minion. If you want to register it as a traditional client
    please delete it first via the web UI or API and then register it using the traditional tools.
    """),
    # For the uploading tools
    50: _("Invalid information uploaded to the server"),
    53: _("Error uploading network interfaces configuration."),
    54: _("""
     Package Upload Failed due to uniqueness constraint violation.
     Make sure the package does not have any duplicate dependencies or
     does not already exists on the server
     """),
    55: _("""
     The --force mgrpush option is disabled on this server.
     Please contact your SUSE Manager administrator for more help.
     """),

    # 60-70: token errors
    60: _("""
     The activation token specified could not be found on the server.
     Please retry with a valid key.
     """),
    61: _("Too many systems registered using this registration token"),
    62: _("Token contains invalid, obsoleted or insufficient settings"),
    63: _("Conflicting activation tokens"),

    # 70-80: channel subscription errors
    70: _("""
     No matching base channel found for your system.
     """),
    71: _("""
     You do not have subscription permission to the designated channel.
     Please refer to your organization's channel or organization
     administrators for further details.
     """),
    72: _("""You can not unsubscribe from base channel."""),
    73: _("""SUSE Manager or Proxy channel can not be subscribed."""),

    # 80-90: server group errors
    80: _("There was an error while trying to join the system to its groups"),

    # 90-100: entitlement errors
    90: _("Unable to entitle system"),

    # 100-109: e-mail and uuid related faults
    100: _("Maximum e-mail length violation."),
    105: _("This system has been previously registered."),
    106: _("Invalid username"),

    # 140-159 applet errors
    140: _("Unable to look up server"),

    # 160-179: OSAD errors
    160: _("Required argument is missing"),

    # 600-699: RHEL5+ EN errors
    601: _("No entitlement information tied to hardware"),
    602: _("Installation number is not entitling"),

    # 700-799: Additional user input verification errors.
    700: _("Maximum username length violation"),
    701: _("Maximum password length violation"),
    702: _("This user has read only API access. Action denied."),

    800: _("System Name cannot be less than 1 character"),

    # 1000-1999: Proxy specific errors:
    # issued by a Proxy to the client
    1000: _("SUSE Manager Proxy error."),
    1001: _("SUSE Manager Proxy unable to login."),
    # issued by a SUSE Manager Server/Satellite to the proxy
    1002: _("""
     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server
     in the database.
     """),
    1003: _("SUSE Manager Proxy session token is invalid."),
    1004: _("SUSE Manager Proxy session token has expired."),


    # 2000-2999: Red Hat Satellite specific errors:
    2001: _(PRODUCT_NAME + """
      user creation is not allowed via mgr_register;
     please contact your sysadmin to have your account created.
     """),
    2004: _("""
     This SUSE Manager server is not allowed to use Inter Server Sync on this server
     """),
    2005: _("""
     Inter Server Sync is disabled on this SUSE Manager Server.
     """),

    # 3000-3999: XML dumper errors:
    3000: _("Invalid datatype passed"),
    3001: _("Unable to retrieve channel"),
    3003: _("Unable to retrieve package"),
    3005: _("Unable to retrieve erratum"),
    3007: _("File is missing"),
    3008: _("Function retrieval error"),
    3009: _("Function execution error"),
    3010: _("Missing version string"),
    3011: _("Invalid version string"),
    3012: _("Mismatching versions"),
    3013: _("Invalid channel version"),
    3015: _("No comps file for channel"),
    3016: _("Unable to retrieve comps file"),

    # 4000 - 4999: config management errors
    4002: _("Configuration action missing"),
    4003: _("File too large"),
    4004: _("File contains binary data"),
    4005: _("Configuration channel is not empty"),
    4006: _("Permission error"),
    4007: _("Content missing for configuration file"),
    4008: _("Template delimiters not specified"),
    4009: _("Configuration channel does not exist"),
    4010: _("Configuration channel already exists"),
    4011: _("File missing from configuration channel"),
    4012: _("Different revision of this file is uploaded"),
    4013: _("File already uploaded to configuration channel"),
    4014: _("File size exceeds remaining quota space"),
    4015: _("Full path of file must be specified"),
    4016: _("Invalid revision number"),
    4017: _("Cannot compare files of different file type"),

    # 5000 - 5999: client content uploading errors
    # 5000 - 5099: crash reporting errors
    5000: _("Crash information is invalid or incomplete"),
    5001: _("Crash file information is invalid or incomplete"),
    5002: _("Error composing crash directory path"),
    5003: _("Error composing crash file path"),
    5004: _("Invalid content encoding"),
    5005: _("Invalid crash name"),
    5006: _("Crash reporting is disabled for this organization"),
    # 5100 - 5199: scap results reporting error
    5101: _("SCAP results file transfer is invalid or incomplete"),
    5102: _("Error composing directory path for detailed SCAP results"),
    5103: _("Error composing file path for detailed SCAP results"),
    5104: _("Invalid content encoding"),
}


class rhnException(Exception):

    """
    This is the generic exception class we raise in the code when we want to
    abort program execution and send a "500 Internal Server Error" message back
    to the client.
    """

    def __init__(self, *args):
        Exception.__init__(self, *args)
        self.args = args

    def __repr__(self):
        """
        String representation of this object.
        """
        s = StringIO()
        s.write("\nInternal code error. Information available:\n")
        for a in self.args:
            s.write("  %s\n" % (a, ))

        return s.getvalue()


class redirectException(Exception):

    """
    pkilambi:This is the exception class we raise when we decide to
    issue a redirect functions in apacheRequest will catch it and
    transform it into a redirect path string
    """

    def __init__(self, redirectpath=""):
        Exception.__init__(self)
        self.path = redirectpath

    def __str__(self):
        """
        Object in string format.
        """
        return repr(self.path)


Explain = _("""
     An error has occurred while processing your request. If this problem
     persists please enter a bug report at scc.suse.com.
     If you choose to submit the bug report, please be sure to include
     details of what you were trying to do when this error occurred and
     details on how to reproduce this problem.
""")


class rhnFault(Exception):

    """
    This is a data exception class that is raised when we detect bad data.
    The higher level functions in apacheServer will catch it and transform it
    into an XMLRPC fault message that gets passed back to the client without
    aborting the current execution of the process (well, we abort, but we don't
    mail a traceback because this is the type of error we can handle - think
    user authentication).
    """

    def __init__(self, err_code=0, err_text="", explain=1):
        self.code = err_code
        self.text = err_text
        self.explain = explain
        self.arrayText = ''
        if self.code and self.code in FaultArray:
            self.arrayText = FaultArray[self.code]
        Exception.__init__(self, self.code, self.text, self.arrayText)

    def __repr__(self):
        """
        String representation of this object.
        """
        return "<rhnFault class (code = %s, text = '%s')>" % (self.code,
                                                              self.text)

    def getxml(self):

        # see if there were any template strings loaded from the db,
        # {label:value}
        templateOverrides = rhnFlags.get('templateOverrides')

        # update the templateValues in the module
        if templateOverrides:
            for label in list(templateOverrides.keys()):
                # only care about values we've defined defaults for...
                if label in templateValues:
                    templateValues[label] = templateOverrides[label]

        s = StringIO()
        s.write("\n")
        if self.text:
            s.write(_("Error Message:\n    %s\n") % self.text.strip())
        if self.code:
            s.write(_("Error Class Code: %s\n") % self.code)
        if self.arrayText:
            cinfo = self.arrayText % templateValues
            s.write(_("Error Class Info: %s\n") % cinfo.rstrip())
        if self.explain:
            s.write(_("Explanation: %s") % Explain)
        if not self.code:
            return xmlrpclib.Fault(1, s.getvalue())
        return xmlrpclib.Fault(-self.code, s.getvalue())


class rhnNotFound(Exception):

    """ Raised when we want return 404 Not Found """
    pass

if __name__ == "__main__":
    print("You can not run this module by itself")
    sys.exit(-1)
 07070100000026000081B40000000000000000000000015FBBE8EE00000576000000000000000000000000000000000000002500000000spacewalk-backend/common/rhnFlags.py  # Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# Small class that handles a global flags structure. the globale dictionary
# used to hold the flags gets initialized on demand
#

__F = {}


def set(name, value=1):
    """
    set value
    """
    # pylint: disable=W0622,W0602
    global __F
    if not name:
        return None
    name = name.lower()
    __F[name] = value
    return None


def get(name):
    """
    get value
    """
    if not name:
        return None
    name = name.lower()
    return __F.get(name)


def test(name):
    """
    test value
    """
    if not name:
        return 0
    name = name.lower()
    return (name in __F) and __F[name]


def reset():
    """
    reset all
    """
    __F.clear()


def all():
    """
    return all flags in a dict
    """
    # pylint: disable=W0622
    return __F
  07070100000027000081B40000000000000000000000015FBBE8EE0000210E000000000000000000000000000000000000002300000000spacewalk-backend/common/rhnLog.py    # rhnLog.py                                            - Logging functions.
#------------------------------------------------------------------------------
# This module contains the necessary functions for producing log messages to
# stderr, stdout or a specified filename. Used by all server-side code.
#
# USAGE: For general purposes, simply import the log_debug function and use it
#        as log_debug(min_level, *args)
#
# NOTE ON LOG LEVELS (rough descriptions):
# 1 - generally for 1 line log items and/or of relative importance
# 2 - shorter multi-line log items
# 3 - longer multi-line log items and/or of lesser importance
# 4 - excessive stuff
# 5 - really excessive stuff
#
#------------------------------------------------------------------------------
#
# Copyright (c) 2008--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

# system module imports
import os
import sys
import traceback
import time
import fcntl
import atexit
from uyuni.common.fileutils import getUidGid
from uyuni.common.rhnLib import isSUSE

LOG = None

# helper function to format the current time in the log format


def log_time():
    if time.daylight:
        # altzone provides the DST-corrected time
        tz_offset = time.altzone
    else:
        # DST is not in effect
        tz_offset = time.timezone
    # Unfortunately, -3601 / 3600 == 2
    # Also, tz_offset's sign is reverted: it is positive west of GMT
    if tz_offset < 0:
        sign = '+'
    else:
        sign = '-'
    hours, secs = divmod(abs(tz_offset), 3600)
    mins = secs / 60

    tz_offset_string = " %s%02d:%02d" % (sign, hours, mins)
    t = time.strftime("%Y/%m/%d %H:%M:%S", time.localtime(time.time()))
    return t + tz_offset_string

# function for setting the close-on-exec flag


def set_close_on_exec(fd):
    s = fcntl.fcntl(fd, fcntl.F_GETFD)
    fcntl.fcntl(fd, fcntl.F_SETFD, s | fcntl.FD_CLOEXEC)

# pylint: disable=W0702

# Init the log


def initLOG(log_file="stderr", level=0):
    global LOG

    # check if it already setup
    if LOG is not None:
        # We already have a logging object
        if log_file is None or LOG.file == log_file:
            # Keep the same logging object, change only the log level
            LOG.level = level
            return
        # We need a different type, so destroy the old one
        LOG = None
    elif log_file is None:
        log_file = "/dev/null"

    # attempt to create the path to the log file if neccessary
    log_path = os.path.dirname(log_file)
    if log_file not in ('stderr', 'stdout') \
            and log_path and not os.path.exists(os.path.dirname(log_file)):
        log_stderr("WARNING: log path not found; attempting to create %s" %
                   log_path, sys.exc_info()[:2])

        # fetch uid, gid so we can do a "chown ..."
        if isSUSE():
            apache_uid, apache_gid = getUidGid('wwwrun', 'www')
        else:
            apache_uid, apache_gid = getUidGid('apache', 'apache')

        try:
            os.makedirs(log_path)
            if os.getuid() == 0:
                os.chown(log_path, apache_uid, 0)
            else:
                os.chown(log_path, apache_uid, apache_gid)
        except:
            log_stderr("ERROR: unable to create log file path %s" % log_path,
                       sys.exc_info()[:2])
            return

    # At this point, LOG is None and log_file is not None
    # Get a new LOG
    LOG = rhnLog(log_file, level)
    return 0

# Convenient macro-type debugging function


def log_debug(level, *args):
    # Please excuse the style inconsistencies.
    if LOG and LOG.level >= level:
        LOG.logMessage(*args)

# Dump some information to stderr.


def log_stderr(*args):
    pid = os.getpid()
    for arg in args:
        sys.stderr.write("SUSE Manager %s %s: %s\n" % (
            pid, log_time(), arg))
    sys.stderr.flush()

# Convenient error logging function


def log_error(*args):
    if not args:
        return
    if LOG:
        LOG.logMessage("ERROR", *args)
    # log to stderr too
    log_stderr(str(args))

# Log a string with no extra info.


def log_clean(level, msg):
    if LOG and LOG.level >= level:
        LOG.writeToLog(msg)

# set the request object for the LOG so we don't have to expose the
# LOG object externally


def log_setreq(req):
    if LOG:
        LOG.set_req(req)

# The base log class


class rhnLog:

    def __init__(self, log_file, level):
        self.level = level
        self.log_info = "0.0.0.0: "
        self.file = log_file
        self.pid = os.getpid()
        self.real = 0
        if self.file in ["stderr", "stdout"]:
            self.fd = getattr(sys, self.file)
            self.log_info = ""
            return

        newfileYN = 0
        if not os.path.exists(self.file):
            newfileYN = 1  # just used for the chown/chmod

        # else, open it as a real file, with locking and stuff
        try:
            # try to open it in line buffered mode
            self.fd = open(self.file, "a", 1)
            set_close_on_exec(self.fd)
            if newfileYN:
                if isSUSE():
                    apache_uid, apache_gid = getUidGid('wwwrun', 'www')
                else:
                    apache_uid, apache_gid = getUidGid('apache', 'apache')
                if os.getuid() == 0:
                    os.chown(self.file, apache_uid, 0)
                else:
                    os.chown(self.file, apache_uid, apache_gid)
                os.chmod(self.file, int('0660', 8))
        except:
            log_stderr("ERROR LOG FILE: Couldn't open log file %s" % self.file,
                       sys.exc_info()[:2])
            self.file = "stderr"
            self.fd = sys.stderr
        else:
            self.real = 1

    # Main logging method.
    def logMessage(self, *args):
        tbStack = traceback.extract_stack()
        callid = len(tbStack) - 3
        module = ''
        try:    # So one can debug from the commandline.
            module = tbStack[callid][0]
            arr = module.split('/')
            if len(arr) > 1:
                lastDir = arr[-2] + "/"
            else:
                lastDir = ""
            filename = arr[-1]
            filename = filename[:filename.rindex('.')]
            module = lastDir + filename
            del lastDir
        except:
            module = ''

        msg = "%s%s.%s" % (self.log_info, module, tbStack[callid][2])
        if args:
            msg = "%s%s" % (msg, repr(args))
        self.writeMessage(msg)

    # send a message to the log file w/some extra data (time stamp, etc).
    def writeMessage(self, msg):
        if self.real:
            msg = "%s %d %s" % (log_time(), self.pid, msg)
        else:
            msg = "%s %s" % (log_time(), msg)
        self.writeToLog(msg)

    # send a message to the log file.
    def writeToLog(self, msg):
        # this is for debugging in case of errors
        # fd = self.fd # no-op, but useful for dumping the current data
        self.fd.write("%s\n" % msg)

    # Reinitialize req info if req has changed.
    def set_req(self, req=None):
        remoteAddr = '0.0.0.0'
        if req:
            if "X-Forwarded-For" in req.headers_in:
                remoteAddr = req.headers_in["X-Forwarded-For"]
            else:
                remoteAddr = req.connection.remote_ip
        self.log_info = "%s: " % (remoteAddr, )

    # shutdown the log
    def __del__(self):
        if self.real:
            self.fd.close()
        self.level = self.log_info = None
        self.pid = self.file = self.real = self.fd = None


def _exit():
    global LOG
    if LOG:
        del LOG
        LOG = None

atexit.register(_exit)


#------------------------------------------------------------------------------
if __name__ == "__main__":
    print("You can not run this module by itself")
    sys.exit(-1)
#------------------------------------------------------------------------------
  07070100000028000081B40000000000000000000000015FBBE8EE000007EE000000000000000000000000000000000000002400000000spacewalk-backend/common/rhnMail.py   #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# this module implements the send mail support
#

import os
import smtplib

from rhn.connections import idn_puny_to_unicode

from spacewalk.common.rhnConfig import CFG, PRODUCT_NAME
from uyuni.common.stringutils import to_string

# check if the headers have the minimum required fields


def __check_headers(h):
    if not isinstance(h, type({})):
        # does not look like a dictionary
        h = {}
    if "Subject" not in h:
        h["Subject"] = "%s System Mail From %s" % (PRODUCT_NAME,
                                                   idn_puny_to_unicode(os.uname()[1]))
    if "To" not in h:
        to = CFG.TRACEBACK_MAIL
    else:
        to = h["To"]
    if "Content-Type" not in h:
        h["Content-Type"] = "text/plain; charset=utf-8"
    if isinstance(to, (type([]), type(()))):
        toaddrs = to
        to = ', '.join(to)
    else:
        toaddrs = to.split(',')
    h["To"] = to
    return [h, toaddrs]

# check the headers for sanity cases and send the mail


def send(headers, body, sender=None):
    (headers, toaddrs) = __check_headers(headers)
    if sender is None:
        sender = headers["From"]
    joined_headers = ''
    for h in list(headers.keys()):
        joined_headers += "%s: %s\n" % (h, headers[h])

    server = smtplib.SMTP('localhost')
    msg = "%s\n%s\n" % (to_string(joined_headers), to_string(body))
    server.sendmail(sender, toaddrs, msg)
    server.quit()
  07070100000029000081B40000000000000000000000015FBBE8EE000027B8000000000000000000000000000000000000002A00000000spacewalk-backend/common/rhnRepository.py #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

import os
import stat
try:
    #  python 2
    import cStringIO
except ImportError:
    #  python3
    import io as cStringIO
import sys
from rhn import rpclib

from uyuni.common import usix
from uyuni.common import rhn_rpm
from uyuni.common.rhnLib import rfc822time

# local imports
from spacewalk.common import rhnFlags
from spacewalk.common.rhnLog import log_debug
from spacewalk.common.rhnException import rhnException, rhnFault, rhnNotFound
from spacewalk.common.RPC_Base import RPC_Base

# bare-except and broad-except
# pylint: disable=W0702,W0703

class Repository(RPC_Base):

    """ Shared repository class, inherited by both the proxy and server specific
        Repository classes.
    """

    def __init__(self, channelName=None):
        log_debug(2, channelName)
        RPC_Base.__init__(self)
        self.channelName = channelName
        # Default visible functions.
        self.compress_headers = 1
        self.functions = [
            'getPackage',
            'getPackageHeader',
            'getPackageSource',
            'i18n',
            'content',
            'installation_xml',
            'media_1'
        ]

    def set_compress_headers(self, val):
        self.compress_headers = val

    def __del__(self):
        self.channelName = None
        self.functions = None

    def getPackagePath(self, pkgFilename, redirect=0):
        """Returns the path to a package.
           OVERLOAD this in server and proxy rhnRepository.
           I.e.: they construct the path differently.
        """
        # pylint: disable=R0201,W0613
        raise rhnException("This function should be overloaded.")

    @staticmethod
    def getPackagePathNVRA(_nvra):
        """OVERLOAD this in server and proxy rhnRepository.
           I.e.: they construct the path differently.
        """
        raise rhnException("This function should be overloaded.")

    def getSourcePackagePath(self, _pkgFilename):
        """Returns the path to a package.
           OVERLOAD this in server and proxy rhnRepository.
           I.e.: they construct the path differently.
        """
        # pylint: disable=R0201
        raise rhnException("This function should be overloaded.")

    def getPackage(self, pkgFilename, *args):
        """ Get rpm package. """
        log_debug(3, pkgFilename)
        if args:
            pkg_spec = [pkgFilename] + list(args)
        else:
            pkg_spec = pkgFilename

        redirectsSupported = 0

        # If we are talking to a proxy, determine whether it's a version that
        # supports redirects.
        proxyVersionString = rhnFlags.get('x-rhn-proxy-version')
        if proxyVersionString:
            redirectsSupported = 1
        else:
            # Must be a client.  We'll determine the redirect capability via
            # the x-rhn-transport-capability header instead.
            transport_cap = rhnFlags.get('x-rhn-transport-capability')
            if transport_cap:
                transport_cap_list = transport_cap.split('=')
                redirectsSupported = transport_cap_list[0] == 'follow-redirects' and int(transport_cap_list[1]) >= 2

        if redirectsSupported:
            log_debug(3, "Client supports redirects.")
            filePath = self.getPackagePath(pkg_spec, 1)
        else:
            # older clients just return the hosted url and download the package
            filePath = self.getPackagePath(pkg_spec)

        return self._getFile(filePath)

    @staticmethod
    def i18n(_translation, *_args):
        """ Translations files for Ubuntu. E.g. Translation-en_US.bz2

            We do not support it so just return 404. But do not fail with
            traceback.
        """
        raise rhnNotFound()

    @staticmethod
    def content():
        """SUSE Content File

        We do not support it so just return 404. But do not fail with
        traceback.
        """
        raise rhnNotFound()

    @staticmethod
    def installation_xml():
        """SUSE File

        We do not support it so just return 404. But do not fail with
        traceback.
        """
        raise rhnNotFound()

    @staticmethod
    def media_1(filePath):
        """SUSE File

        We do not support it so just return 404. But do not fail with
        traceback.
        """
        log_debug(3, filePath)
        raise rhnNotFound()

    def getPackageSource(self, pkgFilename):
        """ Get srpm packrge. """
        log_debug(3, pkgFilename)
        # Sanity check:
        l = pkgFilename.split('.')
        # 6/23/05 wregglej 154248, Don't mangle the filename if it's a nosrc package.
        if l[-2] != "nosrc":
            l[-2] = 'src'
        pkgFilename = '.'.join(l)
        filePath = self.getSourcePackagePath(pkgFilename)
        return self._getFile(filePath)

    def getPackageHeader(self, pkgFilename):
        """ Get rpm header.
            XXX: stock 8.0 clients could not compress headers, we need to either
            change the function name, or version the protocol
        """
        log_debug(3, pkgFilename)
        pkg = pkgFilename.split('.')
        # Basic sanity checks:
        if pkg[-1] not in ["hdr", 'rpm']:
            raise rhnFault(21, "'%s' not a valid RPM header name" % pkgFilename)

        pkgFilename = ".".join(pkg[:-1]) + '.rpm'
        filePath = self.getPackagePath(pkgFilename)
        data = self._getHeaderFromFile(filePath)
        # XXX: Interesting. Found that if returned just data, this
        #      function works fine. Investigate later.
        return rpclib.transports.File(cStringIO.StringIO(data), len(data))

    # The real workhorse for all flavors of listall
    # It tries to pull data out of a file; if it doesn't work,
    # it calls the data producer with the specified params to generate the
    # data, which is also cached

    # --- PRIVATE METHODS ---

    def _getFile(self, filePath):
        """ Returns xmlrpclib file object to any file given a path to it.
            IN:  filePath: path to any file.
            OUT: XMLed rpm or source rpm, or an xmlrpc file object.
        """
        log_debug(3, filePath)
        features = self._fileFeatures(filePath)
        filePath = features['path']
        length = features['length']
        lastModified = features['lastModified']
        self._set_last_modified(lastModified)
        return rpclib.transports.File(open(filePath, "rb"), length, name=filePath)

    def _getHeaderFromFile(self, filePath, stat_info=None):
        """ Utility function to extract a header from an rpm.
            If stat_info was already passed, don't re-stat the file
        """
        log_debug(3, filePath)
        if stat_info:
            s = stat_info
        else:
            s = None
            try:
                s = os.stat(filePath)
            except:
                usix.raise_with_tb(rhnFault(17, "Unable to read package %s"
                                            % os.path.basename(filePath)), sys.exc_info()[2])

        lastModified = s[stat.ST_MTIME]
        del s  # XXX: not neccessary?

        # Get the package header from the file
        # since we stat()ed the file, we know it's there already
        fd = os.open(filePath, os.O_RDONLY)
        h = rhn_rpm.get_package_header(fd=fd)
        os.close(fd)
        if h is None:
            raise rhnFault(17, "Invalid RPM %s" % os.path.basename(filePath))
        stringIO = cStringIO.StringIO()
        # Put the result in stringIO
        stringIO.write(h.unload())
        del h  # XXX: not neccessary?

        pkgFilename = os.path.basename(filePath)
        pkg = pkgFilename.split('.')
        # Replace .rpm with .hdr
        pkg[-1] = "hdr"
        pkgFilename = ".".join(pkg)
        extra_headers = {
            'X-RHN-Package-Header': pkgFilename,
        }
        self._set_last_modified(lastModified, extra_headers=extra_headers)
        rhnFlags.set("AlreadyEncoded", 1)
        return stringIO.getvalue()

    @staticmethod
    def _set_last_modified(last_modified, extra_headers=None):
        log_debug(4, last_modified)
        if not last_modified:
            return None
        # Set a field with the name of the header
        transport = rhnFlags.get('outputTransportOptions')
        if last_modified:
            # Put the last-modified info too
            if isinstance(last_modified, (usix.IntType, usix.FloatType)):
                last_modified = rfc822time(last_modified)
            transport['Last-Modified'] = last_modified
        if extra_headers:
            for k, v in list(extra_headers.items()):
                transport[str(k)] = str(v)
        return transport

    @staticmethod
    def _fileFeatures(filePath):
        """ From a filepath, construct a dictionary of file features. """
        # pylint: disable=W0702
        log_debug(3, filePath)
        if not filePath:
            raise rhnFault(17, "While looking for file: `%s'"
                           % os.path.basename(filePath))
        try:
            s = os.stat(filePath)
        except:
            s = None
        if not s:
            l = 0
            lastModified = 0
        else:
            l = s[stat.ST_SIZE]
            lastModified = s[stat.ST_MTIME]
        del s

        # Build the result hash
        result = {}
        result['name'] = os.path.basename(filePath)
        result['length'] = l
        result['path'] = filePath
        if lastModified:
            result['lastModified'] = rfc822time(lastModified)
        else:
            result['lastModified'] = None
        return result
0707010000002A000081B40000000000000000000000015FBBE8EE00001FB6000000000000000000000000000000000000002200000000spacewalk-backend/common/rhnTB.py #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

import os
import sys
import time
import traceback
import socket
try:
    #  python 2
    from StringIO import StringIO
except ImportError:
    #  python3
    from io import StringIO
from rhn.connections import idn_puny_to_unicode

from spacewalk.common.rhnConfig import CFG, PRODUCT_NAME
from spacewalk.common.rhnLog import log_error
from spacewalk.common.rhnTranslate import _
from uyuni.common.stringutils import to_string
from spacewalk.common import rhnMail
from spacewalk.common import rhnFlags

# Get the hostname for traceback use
hostname = socket.gethostname()

# Keep QUIET_MAIL in a global variable that is initialized from CFG
# when it is first needed. It controls the maximum number of
# tracebacks we're willing to send out of this process in order to
# avoid a huge flood of mail requests.
QUIET_MAIL = None


def print_env(fd=sys.stderr):
    """ Dump the environment. """
    dct = os.environ
    fd.write("\nEnvironment for PID=%d on exception:\n" % os.getpid())
    el = list(dct.keys())
    el.sort()
    for k in el:
        fd.write("%s = %s\n" % (to_string(k), to_string(dct[k])))


def print_locals(fd=sys.stderr, tb=None):
    """ Dump a listing of all local variables and their value for better debugging
        chance.
    """
    if tb is None:
        tb = sys.exc_info()[2]
    stack = []
    # walk the traceback to the end
    while 1:
        if not tb.tb_next:
            break
        tb = tb.tb_next
    # and now start extracting the stack frames
    f = tb.tb_frame
    while f:
        stack.append(f)
        f = f.f_back
    fd.write("\nLocal variables by frame\n")
    for frame in stack:
        fd.write("Frame %s in %s at line %s\n" % (frame.f_code.co_name,
                                                  frame.f_code.co_filename,
                                                  frame.f_lineno))
        for key, value in list(frame.f_locals.items()):
            fd.write("\t%20s = " % to_string(key))
            # We have to be careful not to cause a new error in our error
            # printer! Calling str() on an unknown object could cause an
            # error we don't want.
            # pylint: disable=W0702
            try:
                s = str(to_string(value))
            except:
                s = "<ERROR WHILE PRINTING VALUE>"
            if len(s) > 100 * 1024:
                s = "<ERROR WHILE PRINTING VALUE: string representation too large>"
            fd.write("%s %s\n" % (type(value), s))
        fd.write("\n")


def print_req(req, fd=sys.stderr):
    """ get some debugging information about the current exception for sending
        out when we raise an exception
    """

    fd.write("Request object information:\n")
    fd.write("URI: %s\n" % req.unparsed_uri)
    fd.write("Remote Host: %s\nServer Name: %s:%d\n" % (
        req.get_remote_host(), req.server.server_hostname, req.server.port))
    fd.write("Headers passed in:\n")
    kl = list(req.headers_in.keys())
    kl.sort()
    for k in kl:
        fd.write("\t%s: %s\n" % (to_string(k), to_string(req.headers_in[k])))
    return 0


def Traceback(method=None, req=None, mail=1, ostream=sys.stderr,
              extra=None, severity="notification", with_locals=0):
    """ Reports an traceback error and optionally sends mail about it.
        NOTE: extra = extra text information.
    """
    # pylint: disable=C0103

    global QUIET_MAIL

    if mail:
        # safeguard
        if QUIET_MAIL is None:
            QUIET_MAIL = CFG.QUIET_MAIL

        if QUIET_MAIL < 0:
            QUIET_MAIL = 0
        if QUIET_MAIL == 0:  # make sure we don't mail
            mail = 0

    e_type = sys.exc_info()[:2][0]
    t = time.ctime(time.time())
    exc = StringIO()

    unicode_hostname = idn_puny_to_unicode(hostname)
    exc.write("Exception reported from %s\nTime: %s\n" % (to_string(unicode_hostname), t))
    exc.write("Exception type %s\n" % to_string(e_type))
    if method:
        exc.write("Exception while handling function %s\n" % to_string(method))

    # print information about the request being served
    if req:
        print_req(req, exc)
    if extra:
        exc.write("Extra information about this error:\n%s\n" % to_string(extra))

    # Print the traceback
    exc.write("\nException Handler Information\n")
    traceback.print_exc(None, exc)

    if with_locals and not mail:
        # The mail case will call print_locals by itself
        print_locals(exc)

    # we always log it somewhere
    if ostream:
        ostream.write(to_string(exc.getvalue()))
        ostream.write("\n")

    if mail:
        # print the stack frames for the mail we send out
        print_locals(exc)
        # dump the environment
        print_env(exc)
        # and send the mail
        # build the headers
        to = CFG.TRACEBACK_MAIL
        fr = to
        if isinstance(to, type([])):
            fr = to[0].strip()
            to = ', '.join([x.strip() for x in to])
        headers = {
            "Subject": "%s TRACEBACK from %s" % (PRODUCT_NAME, unicode_hostname),
            "From": "%s <%s>" % (hostname, fr),
            "To": to,
            "X-RHN-Traceback-Severity": severity,
            "Content-Type": 'text/plain; charset="utf-8"',

        }
        QUIET_MAIL = QUIET_MAIL - 1     # count it no matter what

        outstring = to_string(exc.getvalue())

        # 5/18/05 wregglej - 151158 Go through every string in the security list
        # and censor it out of the debug information.
        outstring = censor_string(outstring)

        rhnMail.send(headers, outstring)

    exc.close()
    return


def fetchTraceback(method=None, req=None, extra=None, with_locals=0):
    """ a cheat for snagging just the string value of a Traceback """
    exc = StringIO()
    Traceback(method=method, req=req, mail=0, ostream=exc, extra=extra,
              severity=None, with_locals=with_locals)
    return exc.getvalue()


def exitWithTraceback(e, msg, exitnum, mail=0):
    tbOut = StringIO()
    Traceback(mail, ostream=tbOut, with_locals=1)
    log_error(-1, _('ERROR: %s %s: %s') %
              (e.__class__.__name__, msg, e))
    log_error(-1, _('TRACEBACK: %s') % tbOut.getvalue())
    sys.exit(exitnum)


class SecurityList:

    """ The SecurityList is a list of strings that are censored out of a debug email.
        Right now it's only used for censoring traceback emails.
    """
    _flag_string = "security-list"

    def __init__(self):
        # We store the security list in the global flags. This way, we don't
        # have to worry about clearing it up.
        if rhnFlags.test(self._flag_string):
            self.sec = rhnFlags.get(self._flag_string)
        else:
            self.sec = []
            rhnFlags.set(self._flag_string, self.sec)

    def add(self, obj):
        self.sec.append(obj)

    def check(self, obj):
        return obj in self.sec


def get_seclist():
    """ Returns the list of strings to be censored. """
    return SecurityList().sec


def censor_string(strval):
    """ Remove all instances of the strings in seclist.sec from strval """
    censorlist = get_seclist()
    for c in censorlist:
        # Censor it with a fixed length string. This way the length of the hidden string isn't revealed.
        strval = strval.replace(c, "<CENSORED!>")
    return strval


def add_to_seclist(obj):
    """ Adds a string to seclist.sec, but only if it's not already there. """
    seclist = SecurityList()
    if not seclist.check(obj):
        seclist.add(obj)
  0707010000002B000081B40000000000000000000000015FBBE8EE00000CC3000000000000000000000000000000000000002900000000spacewalk-backend/common/rhnTranslate.py  #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import os
import gettext

from uyuni.common.usix import StringType

class RHN_Translations(gettext.GNUTranslations):
    # Defining our own class, since we'd like to save the language we use
    # Determining the language is not very pretty - we parse the file name
    # which is supposed to be something like
    # .../<lang>/LC_MESSAGES/<domain>.po

    def __init__(self, fp=None):
        self.lang = None
        gettext.GNUTranslations.__init__(self, fp)

    def _parse(self, fp):
        gettext.GNUTranslations._parse(self, fp)
        filename = fp.name
        filename = os.path.normpath(filename)
        # Extract the language
        self.lang = filename.split('/')[-3]

    def getlangs(self):
        # Return all languages
        # pkilambi:bug#158561,170819,170821: the gettext object in python 2.2.3 has no attribute
        #_fallback so add a check if __dict__ has key
        # if not self._fallback or not hasattr(self._fallback, 'getlangs'):
        if "_fallback" not in self.__dict__ or not self._fallback or not hasattr(self._fallback, 'getlangs'):
            return [self.lang, 'C']
        # Recursive call
        return [self.lang] + self._fallback.getlangs()


class i18n:
    _default_langs = ['en', 'en_US', 'C']
    # Wrapper class that allows us to change languages

    def __init__(self, domain=None, localedir="/usr/share/locale"):
        self.domain = domain
        self.localedir = localedir
        self.langs = self._default_langs[:]
        self.cat = None
        self._set_catalog()

    def _set_catalog(self):
        # Set the catalog object
        self.cat = gettext.Catalog(self.domain, localedir=self.localedir,
                                   languages=self.langs, fallback=1, class_=RHN_Translations)

    def getlangs(self):
        # List of languages we support
        # pylint: disable=E1103
        if not hasattr(self.cat, "getlangs"):
            return ["C"]
        # pylint: disable=E1103
        return self.cat.getlangs()

    def setlangs(self, langs):
        if isinstance(langs, StringType) or type(langs) == str:
            langs = [langs]
        # Filter "C" - we will add it ourselves later anyway
        langs = [l for l in langs if l != 'C']
        langs.extend(self._default_langs)
        self.langs = langs
        self._set_catalog()

    def gettext(self, string):
        return self.cat.gettext(string)

    # reinitialize this catalog
    def set(self, domain=None, localedir=None):
        if domain:
            self.domain = domain
        if localedir:
            self.localedir = localedir
        self._set_catalog()


cat = i18n()
_ = cat.gettext
 0707010000002C000081B40000000000000000000000015FBBE8EE000002F0000000000000000000000000000000000000002B00000000spacewalk-backend/common/spacewalk-cfg-get    #!/usr/bin/python

import sys
from spacewalk.common.rhnConfig import RHNOptions

do_list = 0
if len(sys.argv) == 4 and sys.argv[1] == "get":
    comp = sys.argv[2]
    key = sys.argv[3]
elif len(sys.argv) == 3 and sys.argv[1] == "list":
    comp = sys.argv[2]
    do_list = 1
elif len(sys.argv) == 2:
    # assume we want key from root
    comp = ''
    key = sys.argv[1]
else:
    print("Usage: spacewalk-cfg-get list COMPONENT")
    print("       spacewalk-cfg-get get COMPONENT KEY")
    print("       spacewalk-cfg-get KEY")
    sys.exit(1)

cfg = RHNOptions(comp)
cfg.parse()

if do_list:
    cfg.show()
else:
    val = cfg.get(key)
    if isinstance(val, list):
        for i in val:
            print(i)
    elif val != None:
        print(val)
0707010000002D000081B40000000000000000000000015FBBE8EE00000765000000000000000000000000000000000000003000000000spacewalk-backend/common/spacewalk-cfg-get.sgml   <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [
<!ENTITY SERVER "Spacewalk Server" >
<!ENTITY SCRIPTCOMMAND "spacewalk-cfg-get" >

]>
<refentry>

<RefMeta>
<RefEntryTitle>&SCRIPTCOMMAND;</RefEntryTitle><manvolnum>8</manvolnum>
<RefMiscInfo>Version 1.6</RefMiscInfo>
</RefMeta>

<RefNameDiv>
<RefName><command>&SCRIPTCOMMAND;</command></RefName>
<RefPurpose>
Read values from &SERVER; configuration files.
</RefPurpose>
</RefNameDiv>

<RefSynopsisDiv>
<Synopsis>
    <cmdsynopsis>
        <command>&SCRIPTCOMMAND; get  <replaceable>component</replaceable> <replaceable>key</replaceable></command>
    </cmdsynopsis>
    <cmdsynopsis>
        <command>&SCRIPTCOMMAND; list <replaceable>component</replaceable></command>
    </cmdsynopsis>
    <cmdsynopsis>
        <command>&SCRIPTCOMMAND;</command>
        <arg>key</arg>
    </cmdsynopsis>
</Synopsis>
</RefSynopsisDiv>

<RefSect1><Title>Description</Title>
<para>
This script parses configuration files of &SERVER; including /etc/rhn/rhn.conf and /usr/share/rhn/config-defaults/* and outputs list of
values for specified component, or outputs value of specified key.
</para>
<para>
Executing &SCRIPTCOMMAND; with only one parameter (e.g. &SCRIPTCOMMAND; key) is equivalent of &SCRIPTCOMMAND; get '' key
</para>
</RefSect1>

<RefSect1><Title>Options</Title>
<variablelist>
    <varlistentry>
        <term>get</term>
        <listitem>
            <para>Display value of key in given component.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>list</term>
        <listitem>
            <para>List keys and values of given component.</para>
        </listitem>
    </varlistentry>
</variablelist>
</RefSect1>

<RefSect1><Title>Authors</Title>
<simplelist>
    <member>Miroslav SuchÃ½ <email>msuchy@redhat.com</email></member>
    <member>Jan Pazdziora</member>
</simplelist>
</RefSect1>
</RefEntry>
   0707010000002E000081B40000000000000000000000015FBBE8EE0000535E000000000000000000000000000000000000002400000000spacewalk-backend/common/suseLib.py   # -*- coding: utf-8 -*-
#
# Copyright (c) 2010, 2011, 2012 Novell
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#

try:
    import urllib.parse as urlparse
    from io import StringIO
except ImportError:
    import urlparse
    try:
        from cStringIO import StringIO
    except ImportError:
        from StringIO import StringIO

import re
import pycurl

from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.common.rhnConfig import initCFG, CFG, ConfigParserError
try:
    from spacewalk.server import rhnSQL
except ImportError:
    log_debug(2, "Loading suseLib without rhnSQL")

from rhn.connections import idn_puny_to_unicode

YAST_PROXY = "/root/.curlrc"
SYS_PROXY = "/etc/sysconfig/proxy"


class TransferException(Exception):

    """Transfer Error"""

    def __init__(self, value=None):
        Exception.__init__(self)
        self.value = value

    def __str__(self):
        return "%s" % self.value

    def __unicode__(self):
        return '%s' % str(self.value, "utf-8")


class URL(object):

    """URL class that allows modifying the various attributes of a URL"""
    # pylint: disable=R0902

    def __init__(self, url, username=None, password=None):
        u = urlparse.urlsplit(url)
        # pylint can't see inside the SplitResult class
        # pylint: disable=E1103
        self.scheme = u.scheme
        self.username = username or u.username
        self.password = password or u.password
        self.host = u.hostname
        self.port = u.port
        self.path = u.path
        self.query = u.query
        self.fragment = u.fragment

        if self.query:
            self._parse_query()

    def get_query_param(self, key, default=None):
        """Return a query parameter

        Note: this assumes that the parameter contains at most a single
        element (not a list).

        """
        # paramsdict has a list of elements as values, but we assume the
        # most common case where the list has only one element
        # pylint: disable=E1101
        p = self.paramsdict.get(key, default)
        if p:
            assert len(p) == 1, ("The query parameter contains a list of "
                                 "arguments instead of a single element. "
                                 "%s : %s" % (key, p))
            p = p[0]
        return p

    def __setattr__(self, attr, value):
        if attr == "query":
            self.__dict__[attr] = value.lstrip("?")
            self._parse_query()
        # pylint: disable=E1101
        elif attr == "paramsdict":
            # query should be used instead
            raise AttributeError("can't set attribute")
        else:
            self.__dict__[attr] = value

    def _parse_query(self):
        """Parse self.query and populate self.paramsdict

        self.paramsdict is a dict of key: [value1, value2, value3]

        """
        self.__dict__["paramsdict"] = urlparse.parse_qs(self.query)

    def getURL(self, stripPw=False):
        """Return the full url as a string"""
        netloc = ""
        path = self.path
        if self.username:
            netloc = self.username
        if self.password and not stripPw:
            netloc = '%s:%s' % (netloc, self.password)
        elif self.password and stripPw:
            netloc = '%s:%s' % (netloc, '<secret>')
        if self.host and netloc:
            netloc = '%s@%s' % (netloc, self.host)
        elif self.host:
            netloc = self.host

        if self.port:
            netloc = '%s:%s' % (netloc, self.port)

        # Default ULN channels URIs are like: uln:///ol7_x86_64_u8_base
        # If not netloc, we fix the path to avoid getting url:/ol7_x86_64_u8_base
        # as results from urlunsplit
        if self.scheme == 'uln' and not netloc:
            path = "//" + self.path

        return urlparse.urlunsplit((self.scheme, netloc, path,
                                    self.query, self.fragment))


def _curl_debug(mtype, text):
    if mtype == 0:
        log_debug(4, "* %s" % text)
    elif mtype == 1:
        # HEADER_IN
        log_debug(4, "< %s" % text)
    elif mtype == 2:
        # HEADER_OUT
        log_debug(4, "> %s" % text)
    elif mtype == 3:
        # DATA_IN
        log_debug(5, "D< %s" % text)
    elif mtype == 4:
        # DATA_OUT
        log_debug(5, "D> %s" % text)
    else:
        log_debug(6, "%s: %s" % (mtype, text))
    return 0


def send(url, sendData=None):
    """Connect to url and return the result as stringIO

    :arg url: the url where the request will be sent
    :kwarg sendData: do a post-request when "sendData" is given.

    Returns the result as stringIO object.

    """
    connect_retries = 10
    try_counter = connect_retries
    timeout = 120
    if CFG.is_initialized() and CFG.has_key('TIMEOUT'):
        timeout = CFG.TIMEOUT
    curl = pycurl.Curl()

    curl.setopt(pycurl.CONNECTTIMEOUT, timeout)
    curl.setopt(pycurl.URL, url)
    curl.setopt(pycurl.DEBUGFUNCTION, _curl_debug)
    curl.setopt(pycurl.VERBOSE, True)
    proxy_url, proxy_user, proxy_pass = get_proxy(url)
    if proxy_url:
        curl.setopt(pycurl.PROXY, proxy_url)
    log_debug(2, "Connect to %s" % url)
    if sendData is not None:
        curl.setopt(pycurl.POSTFIELDS, sendData)
        if (CFG.is_initialized() and
                CFG.has_key('DISABLE_EXPECT') and
                CFG.DISABLE_EXPECT):
            # disable Expect header
            curl.setopt(pycurl.HTTPHEADER, ['Expect:'])

    # We implement our own redirection-following, because pycurl
    # 7.19 doesn't POST after it gets redirected. Ideally we'd be
    # using pycurl.POSTREDIR here, but that's in 7.21.
    curl.setopt(pycurl.FOLLOWLOCATION, False)

    response = StringIO()
    curl.setopt(pycurl.WRITEFUNCTION, response.write)

    try_counter = connect_retries
    while try_counter:
        try_counter -= 1
        try:
            curl.perform()
        except pycurl.error as e:
            if e[0] == 56:  # Proxy requires authentication
                log_debug(2, e[1])
                if not (proxy_user and proxy_pass):
                    raise TransferException("Proxy requires authentication, "
                                            "but reading credentials from "
                                            "%s failed." % YAST_PROXY)
                curl.setopt(pycurl.PROXYUSERPWD,
                            "%s:%s" % (proxy_user, proxy_pass))
            elif e[0] == 60:
                log_error("Peer certificate could not be authenticated "
                          "with known CA certificates.")
                raise TransferException("Peer certificate could not be "
                                        "authenticated with known CA "
                                        "certificates.")
            else:
                log_error(e[1])
                raise

        status = curl.getinfo(pycurl.HTTP_CODE)
        if status == 200 or (URL(url).scheme == "file" and status == 0):
            # OK or file
            break
        elif status in (301, 302):  # redirects
            url = curl.getinfo(pycurl.REDIRECT_URL)
            log_debug(2, "Got redirect to %s" % url)
            curl.setopt(pycurl.URL, url)
    else:
        log_error("Connecting to %s has failed after %s "
                  "tries with HTTP error code %s." %
                  (URL(url).getURL(stripPw=True), connect_retries, status))
        raise TransferException("Connection failed after %s tries with "
                                "HTTP error %s." % (connect_retries, status))

    # StringIO.write leaves the cursor at the end of the file
    response.seek(0)
    return response


def accessible(url):
    """Try if url is accessible

    :arg url: the url which is tried to access

    Returns True if url is accessible, otherwise False.

    """
    timeout = 120
    if CFG.is_initialized() and CFG.has_key('TIMEOUT'):
        timeout = CFG.TIMEOUT
    curl = pycurl.Curl()

    curl.setopt(pycurl.CONNECTTIMEOUT, timeout)
    curl.setopt(pycurl.URL, url)
    curl.setopt(pycurl.DEBUGFUNCTION, _curl_debug)
    curl.setopt(pycurl.VERBOSE, True)
    proxy_url, proxy_user, proxy_pass = get_proxy(url)
    if proxy_url:
        curl.setopt(pycurl.PROXY, proxy_url)
    log_debug(2, "Connect to %s" % url)

    # We implement our own redirection-following, because pycurl
    # 7.19 doesn't POST after it gets redirected. Ideally we'd be
    # using pycurl.POSTREDIR here, but that's in 7.21.
    curl.setopt(pycurl.FOLLOWLOCATION, False)
    curl.setopt(pycurl.NOBODY, True)

    try_counter = 5
    while try_counter:
        try_counter -= 1
        try:
            curl.perform()
        except pycurl.error as e:
            if e[0] == 56:  # Proxy requires authentication
                log_debug(2, e[1])
                if not (proxy_user and proxy_pass):
                    raise TransferException("Proxy requires authentication, "
                                            "but reading credentials from "
                                            "%s failed." % YAST_PROXY)
                curl.setopt(pycurl.PROXYUSERPWD,
                            "%s:%s" % (proxy_user, proxy_pass))
            else:
                break

        status = curl.getinfo(pycurl.HTTP_CODE)
        # OK or file
        if status == 200 or (URL(url).scheme == "file" and status == 0):
            return True
        elif status in (301, 302):  # redirects
            url = curl.getinfo(pycurl.REDIRECT_URL)
            log_debug(2, "Got redirect to %s" % url)
            curl.setopt(pycurl.URL, url)
        elif status >= 400:
            break
    return False


def get_proxy(url=None):
    """Return proxy information as a (url, username, password) tuple

    Returns None if no proxy URL/credentials could be read.

    If the url parameter is provided, a check against no_proxy will be made.
    (server.satellite.no_proxy)
    In case this connection should not use a proxy, the values returned
    are None for url, username and password.

    Order of lookup (https_proxy is always preferred over http_proxy):
    1. rhn.conf (server.satellite.http_proxy)
    2. .curlrc (--proxy, --proxy-user)

    """
    proxyurl, username, password = (_get_proxy_from_rhn_conf() or
                                    _get_proxy_from_yast() or
                                    (None, None, None))
    if not url or (url and _useProxyFor(url)):
        return (proxyurl, username, password)
    return (None, None, None)


def findProduct(product):
    q_version = ""
    q_release = ""
    q_arch = ""
    product_id = None
    product_lower = {}
    product_lower['name'] = product['name'].lower()

    log_debug(2, "Search for product: %s" % product)

    if product.get('version'):
        q_version = "or sp.version = :version"
        product_lower['version'] = product['version'].lower()
    if product.get('release'):
        q_release = "or sp.release = :release"
        product_lower['release'] = product['release'].lower()
    if product.get('arch'):
        q_arch = "or pat.label = :arch"
        product_lower['arch'] = product['arch'].lower()

    h = rhnSQL.prepare("""
    SELECT sp.id, sp.name, sp.version, pat.label as arch, sp.release
       FROM suseProducts sp
       LEFT JOIN rhnPackageArch pat ON pat.id = sp.arch_type_id
    WHERE sp.name = :name
       AND (sp.version IS NULL %s)
       AND (sp.release IS NULL %s)
       AND (sp.arch_type_id IS NULL %s)
    ORDER BY name, version, release, arch
    """ % (q_version, q_release, q_arch))
    h.execute(**product_lower)
    rs = h.fetchall_dict()

    if not rs:
        log_debug(1, "No Product Found")
        return None

    product_id = rs[0]['id']

    if len(rs) > 1:
        # more than one product matches.
        # search for an exact match or take the first
        for p in rs:
            if (p['version'] == product['version'] and
                    p['release'] == product['release'] and
                    p['arch'] == product['arch']):
                product_id = p['id']
                break

    return product_id


def findAllExtensionProductsOf(baseId, rootId):
    vals = {
        'baseId': baseId,
        'rootID': rootId
    }
    h = rhnSQL.prepare(
        """
        SELECT distinct ext.id, ext.release, ext.version, pa.label arch, ext.name, ext.base baseproduct
                FROM SUSEProductExtension pe
                JOIN SUSEProducts base on base.id = pe.base_pdid
                JOIN SUSEProducts ext on pe.ext_pdid = ext.id
                JOIN rhnpackagearch pa on pa.id = ext.arch_type_id
            WHERE base.id = :baseId and pe.root_pdid = :rootId and pe.recommended = 'Y';
        """
    )
    h.execute(**vals)
    rs = h.fetchall_dict()
    return rs or []

def channelForProduct(product, parent_id=None, org_id=None,
                      user_id=None):
    """Find mandatory Channels for a given product and ostarget.

    If parent_id is None, a base channel is requested.
    Otherwise only channels are returned which have this id
    as parent channel.
    org_id and user_id are used to check for permissions.

    """
    product_id = findProduct(product)
    if not product_id:
        return None

    vals = {
        'pid': product_id,
        'org_id': org_id,
        'user_id': user_id
    }
    parent_statement = " IS NULL "
    if parent_id:
        parent_statement = " = :parent_id "
        vals['parent_id'] = parent_id

    h = rhnSQL.prepare("""
        SELECT ca.label arch,
        c.id,
        c.parent_channel,
        c.org_id,
        c.label,
        c.name,
        c.summary,
        c.description,
        to_char(c.last_modified, 'YYYYMMDDHH24MISS') last_modified,
        -- If user_id is null, then the channel is subscribable
        rhn_channel.loose_user_role_check(c.id, :user_id, 'subscribe') subscribable
        FROM rhnChannel c
        JOIN suseProductChannel spc ON spc.channel_id = c.id
        JOIN rhnChannelArch ca ON c.channel_arch_id = ca.id
        WHERE spc.product_id = :pid
          AND spc.mandatory = 'Y'
          AND c.parent_channel %s""" % parent_statement)
    h.execute(**vals)
    rs = h.fetchall_dict()
    if not rs:
        log_debug(1, "No Channel Found")
        return None
    ret = []
    for channel in rs:
        subscribable = channel['subscribable']
        del channel['subscribable']

        if not subscribable:
            # Not allowed to subscribe to this channel
            continue

        ret.append(channel)
        log_debug(1, "Found channel %s with id %d" %
                  (channel['label'], channel['id']))

    if ret == []:
        ret = None
    return ret


def get_mirror_credentials():
    """Return a list of mirror credential tuples (user, pass)

    N.B. The config values will be read from the global configuration:
     server.susemanager.mirrcred_user
     server.susemanager.mirrcred_pass
     server.susemanager.mirrcred_user_1
     server.susemanager.mirrcred_pass_1
     etc.

    The credentials are read sequentially, when the first value is found
    to be missing, the process is aborted and the list of credentials
    that have been read so far are returned. For example if
    server.susemanager.mirrcred_pass_1 can not be read, only the first
    pair of default mirrcreds will be returned, even though
    mirrcred_user_2, mirrcred_pass_2 etc. might still exist.

    """
    comp = CFG.getComponent()
    initCFG("server.susemanager")

    creds = []

    # the default values should at least always be there
    if not CFG["mirrcred_user"] or not CFG["mirrcred_pass"]:
        initCFG(comp)
        raise ConfigParserError("Could not read default mirror credentials: "
                                "server.susemanager.mirrcred_user, "
                                "server.susemanager.mirrcred_pass.")

    creds.append((CFG["mirrcred_user"], CFG["mirrcred_pass"]))

    # increment the credentials number, until we can't read one
    n = 1
    while True:
        try:
            creds.append((CFG["mirrcred_user_%s" % n],
                          CFG["mirrcred_pass_%s" % n]))
        except (KeyError, AttributeError):
            break
        n += 1
    initCFG(comp)
    return creds


def isAllowedSlave(hostname):
    rhnSQL.initDB()
    if not rhnSQL.fetchone_dict("select 1 from rhnISSSlave where slave = :hostname and enabled = 'Y'",
                                hostname=idn_puny_to_unicode(hostname)):
        log_error('Server "%s" is not enabled for ISS.' % hostname)
        return False
    return True


def hasISSSlaves():
    rhnSQL.initDB()
    if rhnSQL.fetchone_dict("select 1 from rhnISSSlave where enabled = 'Y'"):
        return True
    return False


def hasISSMaster():
    rhnSQL.initDB()
    if rhnSQL.fetchone_dict("select 1 from rhnISSMaster where is_current_master = 'Y'"):
        return True
    return False


def getISSCurrentMaster():
    rhnSQL.initDB()
    master = rhnSQL.fetchone_dict(
        "select label from rhnISSMaster where is_current_master = 'Y'")
    if not master:
        return None
    return master['label']


def _parse_curl_proxy_credentials(text):
    """Parse proxy credentials from the string :text:

    Return a (username, password) tuple or (None, None).

    """
    try:
        # pylint: disable=W1401
        user_pass = re.search('^[\s-]+proxy-user\s*=?\s*"([^:]+:.+)"\s*$',
                              text, re.M).group(1)
    except AttributeError:
        return (None, None)

    return re.sub('\\\\"', '"', user_pass).split(":")


def _parse_curl_proxy_url(text):
    try:
        # pylint: disable=W1401
        return re.search('^[\s-]+proxy\s*=?\s*"(.+)"\s*$',
                         text, re.M).group(1)
    except AttributeError:
        return None


def _get_proxy_from_yast():
    """Return a tuple of (url, user, pass) proxy information from YaST

    Returns None instead of a tuple if there was no proxy url. user,
    pass can be None.

    """
    f = None
    try:
        try:
            f = open(YAST_PROXY)
            contents = f.read()
        except IOError:
            log_debug(1, "Couldn't open " + YAST_PROXY)
            return None
    finally:
        if f:
            f.close()

    proxy_url = _parse_curl_proxy_url(contents)
    if not proxy_url:
        log_debug(1, "Could not read proxy URL from " + YAST_PROXY)
        return None

    username, password = _parse_curl_proxy_credentials(contents)

    return (proxy_url, username, password)


def _get_proxy_from_rhn_conf():
    """Return a tuple of (url, user, pass) proxy information from rhn config

    Returns None instead of a tuple if there was no proxy url. user,
    pass can be None.

    """
    comp = CFG.getComponent()
    if not CFG.has_key("http_proxy"):
        initCFG("server.satellite")
    result = None
    if CFG.http_proxy:
        # CFG.http_proxy format is <hostname>[:<port>] in 1.7
        url = 'http://%s' % CFG.http_proxy
        result = (url, CFG.http_proxy_username, CFG.http_proxy_password)
    initCFG(comp)
    log_debug(2, "Could not read proxy URL from rhn config.")
    return result

# pylint complains because this method has too many return statements.
# pylint: disable=R0911


def _useProxyFor(url):
    """Return True if a proxy should be used for given url, otherwise False.

    This function uses server.satellite.no_proxy variable to check for
    hosts or domains which should not be connected via a proxy.

    server.satellite.no_proxy is a comma seperated list.
    Either an exact match, or the previous character
    is a '.', so host is within the same domain.
    A leading '.' in the pattern is ignored.
    See also 'man curl'

    """
    u = urlparse.urlsplit(url)
    # pylint can't see inside the SplitResult class
    # pylint: disable=E1103
    if u.scheme == 'file' or not u.hostname:
        return False
    hostname = u.hostname.lower()
    if hostname in ["localhost", "127.0.0.1", "::1"]:
        return False
    comp = CFG.getComponent()
    if not CFG.has_key("no_proxy"):
        initCFG("server.satellite")
    if not CFG.has_key('no_proxy'):
        initCFG(comp)
        return True
    noproxy = CFG.no_proxy
    initCFG(comp)
    if not noproxy:
        return True
    if not isinstance(noproxy, list):
        if noproxy == '*':
            # just an asterisk disables all.
            return False
        noproxy = [noproxy]

    # No proxy: Either an exact match, or the previous character
    # is a '.', so host is within the same domain.
    # A leading '.' in the pattern is ignored. Some implementations
    # need '.foo.ba' to prevent 'foo.ba' from matching 'xfoo.ba'.
    for domain in noproxy:
        domain = domain.lower()
        if domain[0] == '.':
            domain = domain[1:]
        if hostname.endswith(domain) and \
            (len(hostname) == len(domain) or
             hostname[len(hostname) - len(domain) - 1] == '.'):
            return False
    return True
  0707010000002F000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000001E00000000spacewalk-backend/common/test 07070100000030000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002800000000spacewalk-backend/common/test/unit-test   07070100000031000081B40000000000000000000000015FBBE8EE000000B5000000000000000000000000000000000000003100000000spacewalk-backend/common/test/unit-test/Makefile  TESTS       = \
        test_gettext.py \
        test_rhnCache.py

all:	$(addprefix test-,$(TESTS))

test-%:
	@echo Running $*
	@PYTHONPATH=$(PYTHONPATH):../../.. $(PYTHON_BIN) $*
   07070100000032000081B40000000000000000000000015FBBE8EE000002D6000000000000000000000000000000000000002E00000000spacewalk-backend/common/test/unit-test/ca.po # Robert Antoni Buj Gelonch <rbuj@fedoraproject.org>, 2015. #zanata
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: rhn-bugs@redhat.com\n"
"POT-Creation-Date: 2005-02-23 22:39-0500\n"
"PO-Revision-Date: 2015-04-01 03:37+0000\n"
"Last-Translator: Robert Antoni Buj Gelonch <rbuj@fedoraproject.org>\n"
"Language-Team: Catalan\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"X-Generator: Zanata 4.6.2\n"

#: foo.py:7
msgid "Good day"
msgstr "Bon dia"

#: foo.py:8
msgid "How do you do?"
msgstr "Com estÃ s?"

#: foo.py:9
msgid "What should I do now?"
msgstr "QuÃ¨ he de fer ara?"
  07070100000033000081B40000000000000000000000015FBBE8EE000002CC000000000000000000000000000000000000002E00000000spacewalk-backend/common/test/unit-test/cs.po # Zdenek <chmelarz@gmail.com>, 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: Unit Test 0.1\n"
"Report-Msgid-Bugs-To: rhn-bugs@redhat.com\n"
"POT-Creation-Date: 2005-02-23 22:39-0500\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2018-02-20 09:55+0000\n"
"Last-Translator: Zdenek <chmelarz@gmail.com>\n"
"Language-Team: Czech\n"
"Language: cs\n"
"X-Generator: Zanata 4.6.2\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n"

#: foo.py:7
msgid "Good day"
msgstr "DobrÃ½ den"

#: foo.py:8
msgid "How do you do?"
msgstr "Jak se mÃ¡te?"

#: foo.py:9
msgid "What should I do now?"
msgstr "Co mÃ¡m teÄ udÄ›lat?"
07070100000034000081B40000000000000000000000015FBBE8EE000000D3000000000000000000000000000000000000004100000000spacewalk-backend/common/test/unit-test/generate-translations.sh  TOPDIR=$(cd $(dirname $0) && pwd)

domain="unit-test"
for lang in en ro; do
    msgfmt --statistics --verbose \
        --output-file $TOPDIR/translations/$lang/LC_MESSAGES/$domain.mo $TOPDIR/$domain.$lang
done
 07070100000035000081B40000000000000000000000015FBBE8EE000002F6000000000000000000000000000000000000002E00000000spacewalk-backend/common/test/unit-test/pl.po # Piotr DrÄ…g <piotrdrag@gmail.com>, 2016. #zanata
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: rhn-bugs@redhat.com\n"
"POT-Creation-Date: 2005-02-23 22:39-0500\n"
"PO-Revision-Date: 2016-09-03 10:52+0000\n"
"Last-Translator: Piotr DrÄ…g <piotrdrag@gmail.com>\n"
"Language-Team: Polish\n"
"Language: pl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2)\n"
"X-Generator: Zanata 4.6.2\n"

#: foo.py:7
msgid "Good day"
msgstr "DzieÅ„ dobry"

#: foo.py:8
msgid "How do you do?"
msgstr "Jak siÄ™ masz?"

#: foo.py:9
msgid "What should I do now?"
msgstr "Co zrobiÄ‡ teraz?"
  07070100000036000081B40000000000000000000000015FBBE8EE00001334000000000000000000000000000000000000003800000000spacewalk-backend/common/test/unit-test/test_gettext.py   #!/usr/bin/python
#
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

import os
import sys
import unittest

# Make paths absolute
if sys.argv[0] == "/":
    topdir = sys.argv[0]
else:
    topdir = os.path.dirname(os.path.abspath(__file__))
topdir = os.path.abspath(os.path.dirname(topdir + "/../../../.."))

if topdir not in sys.path:
    sys.path.append(topdir)

from spacewalk.common import rhnTranslate


class Tests(unittest.TestCase):
    # pylint: disable=R0904

    @staticmethod
    def _setup(lang):
        domain = "unit-test"
        localedir = "%s/common/test/unit-test/translations" % topdir
        rhnTranslate.cat.set(domain=domain, localedir=localedir)
        rhnTranslate.cat.setlangs(lang)

    def _test(self, lang, s, target):
        self._setup(lang)
        ss = rhnTranslate._(s)
        self.assertEqual(ss, target)

    def test_setlangs_en(self):
        "Tests setting the language to en"
        lang = "en"
        self._setup(lang)
        langs = rhnTranslate.cat.getlangs()
        self.assertTrue(langs[0] == lang)

    def test_setlangs_ro(self):
        "Tests setting the language to ro"
        lang = "ro"
        self._setup(lang)
        langs = rhnTranslate.cat.getlangs()
        self.assertTrue(langs[0] == lang)

    def test_setlangs_go(self):
        """Tests setting the language to go (does not exist)"""
        lang = "go"
        self._setup(lang)
        langs = rhnTranslate.cat.getlangs()
        if hasattr(sys, "version_info"):
            # On python 1.5.2 we don't really get an idea what the language
            # is, so it's ok to check for the first component
            self.assertFalse(langs[0] == lang, "Language is %s" % langs[0])
        else:
            self.assertTrue(langs[0] == lang, "Language is %s" % langs[0])

    def test_en_1(self):
        "Tests plain English messages"
        lang = 'en'
        s = "Good day"
        target = s
        self._test(lang, s, target)

    def test_en_2(self):
        "Tests plain English messages"
        lang = 'en'
        s = "How do you do?"
        target = s
        self._test(lang, s, target)

    def test_en_3(self):
        "Tests plain English messages"
        lang = 'en'
        s = "What should I do now?"
        target = s
        self._test(lang, s, target)

    def test_en_missing_1(self):
        "Tests plain English messages that are not in the translation files"
        lang = 'en'
        s = "This string doesn't exist in the translation"
        target = s
        self._test(lang, s, target)

    def test_ro_1(self):
        "Tests plain English messages translated to Romanian"
        lang = 'ro'
        s = "Good day"
        target = "Buna ziua"
        self._test(lang, s, target)

    def test_ro_2(self):
        "Tests plain English messages translated to Romanian"
        lang = 'ro'
        s = "How do you do?"
        target = "Ce mai faceti?"
        self._test(lang, s, target)

    def test_ro_3(self):
        "Tests plain English messages translated to Romanian"
        lang = 'ro'
        s = "What should I do now?"
        target = "Ce sa fac acum?"
        self._test(lang, s, target)

    def test_ro_missing_1(self):
        "Tests plain English messages that are not in the translation files (ro)"
        lang = 'ro'
        s = "This string doesn't exist in the translation"
        target = s
        self._test(lang, s, target)

    def test_go_1(self):
        "Tests plain English messages translated in the mythical go language"
        lang = 'en'
        s = "Good day"
        target = s
        self._test(lang, s, target)

    def test_go_2(self):
        "Tests plain English messages translated in the mythical go language"
        lang = 'en'
        s = "How do you do?"
        target = s
        self._test(lang, s, target)

    def test_go_3(self):
        "Tests plain English messages translated in the mythical go language"
        lang = 'en'
        s = "What should I do now?"
        target = s
        self._test(lang, s, target)

    def test_go_missing_1(self):
        "Tests plain English messages that are not in the translation files (go)"
        lang = 'en'
        s = "This string doesn't exist in the translation"
        target = s
        self._test(lang, s, target)


if __name__ == '__main__':
    sys.exit(unittest.main() or 0)
07070100000037000081B40000000000000000000000015FBBE8EE00004B49000000000000000000000000000000000000003500000000spacewalk-backend/common/test/unit-test/test_repo.py  # coding: utf-8
"""
Py-test based unit tests for common/repo
"""
from mock import MagicMock, patch
from spacewalk.common.repo import DpkgRepo, GeneralRepoException
import http
import pytest
import lzma
import zlib


class FakeRequests:
    """
    Fake requests object.
    """

    class FakeResponse:
        """
        Fake request's response struct
        """

    def close(self):
        """
        Close request. Does nothing actually.

        :return:
        """

    def conf(self, **kwargs):
        """
        Configure response for the test purposes.

        :param kwargs:
        :return:
        """
        for kkw, vkw in kwargs.items():
            setattr(self, kkw, vkw)

        return self


def mock_release_index(self):
    """
    Set flat to True.

    :param self:
    :return:
    """
    self._flat = True


class TestCommonRepo:
    """
    Test suite for common/repo.
    """
    @patch("spacewalk.common.repo.DpkgRepo.get_pkg_index_raw", MagicMock(return_value=("Packages.gz", b"\x00")))
    @patch("spacewalk.common.repo.DpkgRepo.is_flat", MagicMock(return_value=False))
    def test_verify_packages_index(self):
        """
        Test verify_packages_index method.

        :return:
        """
        gri = DpkgRepo.ReleaseEntry(size=999, uri="restricted/binary-amd64")
        gri.checksum.md5 = "93b885adfe0da089cdf634904fd59f71"
        gri.checksum.sha1 = "5ba93c9db0cff93f52b521d7420e43f6eda2784f"
        gri.checksum.sha256 = "6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d"

        release_index = MagicMock()
        release_index().get = MagicMock(return_value=gri)
        with patch("spacewalk.common.repo.DpkgRepo.get_release_index", release_index):
            repo = DpkgRepo("http://mygreathost.com/ubuntu/dists/bionic/restricted/binary-amd64/")
            assert repo.verify_packages_index()

    @patch("spacewalk.common.repo.DpkgRepo.get_pkg_index_raw", MagicMock(return_value=("Packages.gz", b"\x00")))
    @patch("spacewalk.common.repo.DpkgRepo.is_flat", MagicMock(return_value=False))
    def test_verify_local_packages_index(self):
        """
        Test verify_packages_index method.

        :return:
        """
        gri = DpkgRepo.ReleaseEntry(size=999, uri="restricted/binary-amd64")
        gri.checksum.md5 = "93b885adfe0da089cdf634904fd59f71"
        gri.checksum.sha1 = "5ba93c9db0cff93f52b521d7420e43f6eda2784f"
        gri.checksum.sha256 = "6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d"

        release_index = MagicMock()
        release_index().get = MagicMock(return_value=gri)
        with patch("spacewalk.common.repo.DpkgRepo.get_release_index", release_index):
            repo = DpkgRepo("file:///ubuntu/dists/bionic/restricted/binary-amd64/")
            assert repo.verify_packages_index()

    @patch("spacewalk.common.repo.DpkgRepo.get_pkg_index_raw", MagicMock(return_value=("Packages.gz", b"\x00")))
    @patch("spacewalk.common.repo.DpkgRepo.is_flat", MagicMock(return_value=False))
    def test_verify_packages_index_missing_some_checksums(self):
        """
        Test verify_packages_index method when only sha256 checksum is available.

        :return:
        """
        gri = DpkgRepo.ReleaseEntry(size=999, uri="restricted/binary-amd64")
        gri.checksum.md5 = ""
        gri.checksum.sha1 = ""
        gri.checksum.sha256 = "6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d"

        release_index = MagicMock()
        release_index().get = MagicMock(return_value=gri)
        with patch("spacewalk.common.repo.DpkgRepo.get_release_index", release_index):
            repo = DpkgRepo("http://mygreathost.com/ubuntu/dists/bionic/restricted/binary-amd64/")
            assert repo.verify_packages_index()

    @patch("spacewalk.common.repo.DpkgRepo.get_pkg_index_raw", MagicMock(return_value=("Packages.gz", b"\x00")))
    @patch("spacewalk.common.repo.DpkgRepo.is_flat", MagicMock(return_value=False))
    def test_verify_packages_local_index_missing_some_checksums(self):
        """
        Test verify_packages_index method when only sha256 checksum is available.

        :return:
        """
        gri = DpkgRepo.ReleaseEntry(size=999, uri="restricted/binary-amd64")
        gri.checksum.md5 = ""
        gri.checksum.sha1 = ""
        gri.checksum.sha256 = "6e340b9cffb37a989ca544e6bb780a2c78901d3fb33738768511a30617afa01d"

        release_index = MagicMock()
        release_index().get = MagicMock(return_value=gri)
        with patch("spacewalk.common.repo.DpkgRepo.get_release_index", release_index):
            repo = DpkgRepo("file://ubuntu/dists/bionic/restricted/binary-amd64/")
            assert repo.verify_packages_index()

    @patch("spacewalk.common.repo.DpkgRepo.get_release_index", mock_release_index)
    def test_is_flat(self):
        """
        Return True or (False) if repo has flat (or not) format.

        :return:
        """
        assert DpkgRepo("http://dummy").is_flat()

    @patch("spacewalk.common.repo.DpkgRepo.get_release_index", mock_release_index)
    def test_is_flat_local_file(self):
        """
        Return True or (False) if repo has flat (or not) format.

        :return:
        """
        assert DpkgRepo("file://dummy").is_flat()

    def test_get_parent_url_no_subpath_default(self):
        """
        Return parent URL without adding subpath and default params.

        :return:
        """
        url = "http://mygreathost.com/ubuntu/dists/bionic/restricted/binary-amd64/"
        assert DpkgRepo._get_parent_url(url) == "http://mygreathost.com/ubuntu/dists/bionic/restricted/"

    def test_get_parent_url_no_subpath_with_depth(self):
        """
        Return parent URL without adding subpath with depth.

        :return:
        """
        url = "http://mygreathost.com/ubuntu/dists/bionic/restricted/binary-amd64/"
        assert DpkgRepo._get_parent_url(url, depth=0) == "http://mygreathost.com/ubuntu/dists/bionic/restricted/binary-amd64/"
        assert DpkgRepo._get_parent_url(url, depth=2) == "http://mygreathost.com/ubuntu/dists/bionic/"
        assert DpkgRepo._get_parent_url(url, depth=3) == "http://mygreathost.com/ubuntu/dists/"
        assert DpkgRepo._get_parent_url(url, depth=4) == "http://mygreathost.com/ubuntu/"
        assert DpkgRepo._get_parent_url(url, depth=5) == "http://mygreathost.com/"
        assert DpkgRepo._get_parent_url(url, depth=6) == "http://mygreathost.com/"
        assert DpkgRepo._get_parent_url(url, depth=7) == "http://mygreathost.com/"

    @patch("spacewalk.common.repo.requests.get", MagicMock(
        return_value=FakeRequests().conf(status_code=http.HTTPStatus.NOT_FOUND, content=b"", url="")))
    @patch("spacewalk.common.repo.DpkgRepo._parse_release_index", MagicMock(return_value="Plasma conduit overflow"))
    def test_get_release_index_flat(self):
        """
        Get release index file contents, flat.

        :return:
        """
        repo = DpkgRepo("http://dummy/url")
        assert repo.get_release_index() == "Plasma conduit overflow"
        assert repo.is_flat()

    @patch("spacewalk.common.repo.requests.get", MagicMock(
        return_value=FakeRequests().conf(status_code=http.HTTPStatus.OK, content=b"", url="")))
    @patch("spacewalk.common.repo.DpkgRepo._parse_release_index", MagicMock(return_value="Plasma conduit overflow"))
    def test_get_release_index_standard(self):
        """
        Get release index file contents, standard and skip GPG verification.

        :return:
        """
        repo = DpkgRepo("http://dummy/url", gpg_verify=False)
        with patch("spacewalk.common.repo.DpkgRepo._has_valid_gpg_signature", MagicMock()) as gpg_check:
            assert repo.get_release_index() == "Plasma conduit overflow"
            assert not repo.is_flat()
            assert not gpg_check.called

    @patch("spacewalk.common.repo.requests.get", MagicMock(
        return_value=FakeRequests().conf(status_code=http.HTTPStatus.NO_CONTENT, content=b"", url="")))
    @patch("spacewalk.common.repo.DpkgRepo._parse_release_index", MagicMock(return_value="Plasma conduit overflow"))
    def test_get_release_index_exception(self):
        """
        Get release index file contents, other than flat or standard error code.

        :return:
        """
        repo = DpkgRepo("http://dummy/url")

        with pytest.raises(GeneralRepoException) as exc:
            assert repo.get_release_index()
        assert str(exc.value) == "HTTP error 204 occurred while connecting to the URL"

    def test_has_valid_gpg_signature_call_InRelease(self):
        """
        Test _has_valid_gpg_signature call with an embedded GPG signature (InRelease).

        :return:
        """
        repo = DpkgRepo("http://dummy/url/InRelease")
        response = FakeRequests().conf(
                content=b"dummy content",
                url="http://dummy/url/InRelease",
        )

        mock_popen = MagicMock()
        mock_communicate = MagicMock()
        mock_popen().communicate = mock_communicate
        mock_popen().returncode = 0

        with patch("spacewalk.common.repo.subprocess.Popen", mock_popen):
            assert repo._has_valid_gpg_signature(response.url, response)
            mock_communicate.assert_called_once_with(b"dummy content", timeout=90)

    @patch("spacewalk.common.repo.tempfile.NamedTemporaryFile", MagicMock())
    @patch("spacewalk.common.repo.requests.get", MagicMock(
        return_value=FakeRequests().conf(status_code=http.HTTPStatus.OK, content=b"", url="")))
    def test_has_valid_gpg_signature_call_Release(self):
        """
        Test _has_valid_gpg_signature call with a detached GPG signature (Release + Release.gpg).

        :return:
        """

        repo = DpkgRepo("http://dummy/url/Release")
        response = FakeRequests().conf(
                content=b"dummy content",
                url="http://dummy/url/Release",
        )
        mock_popen = MagicMock()
        mock_popen().returncode = 0

        with patch("spacewalk.common.repo.subprocess.Popen", mock_popen):
            assert repo._has_valid_gpg_signature(response.url, response)
            mock_popen.assert_called_once
            gpg_args = mock_popen.call_args[0][0]
            assert gpg_args[0] == "gpg"
            assert gpg_args[1] == "--verify"
            assert gpg_args[2] == "--homedir"
            assert gpg_args[3] == "/var/lib/spacewalk/gpgdir"
            assert gpg_args[4].beginswith("/tmp/")
            assert gpg_args[5].beginswith("/tmp/")

    def test_has_valid_gpg_signature_returns_false_if_gpg_verify_fails(self):
        """
        Test _has_valid_gpg_signature returns False if gpg --verify returns non-zero.

        :return:
        """
        repo = DpkgRepo("http://dummy/url/InRelease")
        response = FakeRequests().conf(
                content=b"dummy content",
                url="http://dummy/url/InRelease",
        )
        mock_popen = MagicMock()
        mock_popen().returncode = 1

        with patch("spacewalk.common.repo.subprocess.Popen", mock_popen):
            assert not repo._has_valid_gpg_signature(response.url, response)


    def test_parse_release_index(self):
        """
        Parse release index.

        :return:
        """
        release = """
Irrelevant data
9f067fc9044265ff132cefef4f741ede     999 one/Release.gz
ee27992a1c0154454601fd8e5a808256    1298 two/Release.gz
some more irrelevant data here
c373e78514584fc3a6b3505aa0ce1525b83e4ceb     999 one/Release.gz
70d7c8225fb5b6ee67ba089681425c5b712e0b19    1298 two/Release.gz
something in between
ef73ea0cc071ad4a13fb52717f99b1951bb41bc2198d2307b30cc0edfb3aed03     999 one/Release.gz
4843bbb823a63f3bde6104ceecc86daebf8b84efd4f6fb1373138b4589a84803    1298 two/Release.gz
Some more irrelevant data
"""
        repo = DpkgRepo("http://dummy/url")
        parsed = repo._parse_release_index(release)

        assert len(parsed) == 2
        assert "one/Release.gz" in parsed
        assert "two/Release.gz" in parsed

        assert parsed["one/Release.gz"].checksum.md5 == "9f067fc9044265ff132cefef4f741ede"
        assert parsed["one/Release.gz"].checksum.sha1 == "c373e78514584fc3a6b3505aa0ce1525b83e4ceb"
        assert parsed["one/Release.gz"].checksum.sha256 == "ef73ea0cc071ad4a13fb52717f99b1951bb41bc2198d2307b30cc0edfb3aed03"
        assert parsed["one/Release.gz"].size == 999

        assert parsed["two/Release.gz"].checksum.md5 == "ee27992a1c0154454601fd8e5a808256"
        assert parsed["two/Release.gz"].checksum.sha1 == "70d7c8225fb5b6ee67ba089681425c5b712e0b19"
        assert parsed["two/Release.gz"].checksum.sha256 == "4843bbb823a63f3bde6104ceecc86daebf8b84efd4f6fb1373138b4589a84803"
        assert parsed["two/Release.gz"].size == 1298

    @patch("spacewalk.common.repo.DpkgRepo.get_pkg_index_raw", MagicMock(return_value=("Packages.gz", "content")))
    def test_decompress_pkg_index_gz(self):
        """
        Test decompression for Packages.gz file.

        :return:
        """
        data = b'\xd0\xbc\xd0\xb0\xd0\xba\xd0\xb0\xd1\x80\xd0\xbe\xd0\xbd\xd0\xb8'
        zdcmp = MagicMock(return_value=data)
        xdcmp = MagicMock(return_value=data)
        with patch("spacewalk.common.repo.zlib.decompress", zdcmp) as m_zlib, \
            patch("spacewalk.common.repo.lzma.decompress", xdcmp) as m_lzma:
            out = DpkgRepo("http://dummy_url").decompress_pkg_index()

        assert not xdcmp.called
        assert zdcmp.called
        assert out == "Ð¼Ð°ÐºÐ°Ñ€Ð¾Ð½Ð¸"

    @patch("spacewalk.common.repo.DpkgRepo.get_pkg_index_raw", MagicMock(return_value=("Packages.xz", "content")))
    def test_decompress_pkg_index_xz(self):
        """
        Test decompression for Packages.xz file.

        :return:
        """
        data = b'\xd0\xbc\xd0\xb0\xd0\xba\xd0\xb0\xd1\x80\xd0\xbe\xd0\xbd\xd0\xb8'
        zdcmp = MagicMock(return_value=data)
        xdcmp = MagicMock(return_value=data)
        with patch("spacewalk.common.repo.zlib.decompress", zdcmp) as m_zlib, \
            patch("spacewalk.common.repo.lzma.decompress", xdcmp) as m_lzma:
            out = DpkgRepo("http://dummy_url").decompress_pkg_index()

        assert not zdcmp.called
        assert xdcmp.called
        assert out == "Ð¼Ð°ÐºÐ°Ñ€Ð¾Ð½Ð¸"

    @patch("spacewalk.common.repo.DpkgRepo.get_pkg_index_raw", MagicMock(return_value=("Packages.gz", "content")))
    def test_decompress_pkg_index_gz_general_failure(self):
        """
        Test decompression for Packages.gz file general failure handling.

        :return:
        """
        zdcmp = MagicMock(side_effect=GeneralRepoException("Too many symlinks found in binary data"))
        xdcmp = MagicMock(side_effect=GeneralRepoException(""))
        with patch("spacewalk.common.repo.zlib.decompress", zdcmp) as m_zlib, \
            patch("spacewalk.common.repo.lzma.decompress", xdcmp) as m_lzma:
            with pytest.raises(GeneralRepoException) as exc:
                DpkgRepo("http://dummy_url").decompress_pkg_index()

        assert not xdcmp.called
        assert zdcmp.called

        err = str(exc.value)
        assert err.startswith("Unhandled exception occurred while decompressing Packages.gz:")
        assert "symlinks" in err

    @patch("spacewalk.common.repo.DpkgRepo.get_pkg_index_raw", MagicMock(return_value=("Packages.xz", "content")))
    def test_decompress_pkg_index_xz_general_failure(self):
        """
        Test decompression for Packages.xz file general failure handling.

        :return:
        """
        zdcmp = MagicMock(side_effect=GeneralRepoException(""))
        xdcmp = MagicMock(side_effect=GeneralRepoException("Software design limitation"))
        with patch("spacewalk.common.repo.zlib.decompress", zdcmp) as m_zlib, \
            patch("spacewalk.common.repo.lzma.decompress", xdcmp) as m_lzma:
            with pytest.raises(GeneralRepoException) as exc:
                DpkgRepo("http://dummy_url").decompress_pkg_index()

        assert not zdcmp.called
        assert xdcmp.called

        err = str(exc.value)
        assert err.startswith("Unhandled exception occurred while decompressing Packages.xz:")
        assert "Software" in err

    @patch("spacewalk.common.repo.DpkgRepo.get_pkg_index_raw", MagicMock(return_value=("Packages.xz", "content")))
    def test_decompress_pkg_index_xz_failure(self):
        """
        Test decompression for Packages.xz file failure handling.

        :return:
        """
        zdcmp = MagicMock(side_effect=zlib.error(""))
        xdcmp = MagicMock(side_effect=lzma.LZMAError("/dev/null is busy while upgrading"))
        with patch("spacewalk.common.repo.zlib.decompress", zdcmp) as m_zlib, \
            patch("spacewalk.common.repo.lzma.decompress", xdcmp) as m_lzma:
            with pytest.raises(GeneralRepoException) as exc:
                DpkgRepo("http://dummy_url").decompress_pkg_index()

        assert not zdcmp.called
        assert xdcmp.called
        assert "/dev/null" in str(exc.value)

    @patch("spacewalk.common.repo.DpkgRepo.get_pkg_index_raw", MagicMock(return_value=("Packages.gz", "content")))
    def test_decompress_pkg_index_gz_failure(self):
        """
        Test decompression for Packages.gz file failure handling.

        :return:
        """
        zdcmp = MagicMock(side_effect=zlib.error("Firewall currently too hot"))
        xdcmp = MagicMock(side_effect=lzma.LZMAError(""))
        with patch("spacewalk.common.repo.zlib.decompress", zdcmp) as m_zlib, \
            patch("spacewalk.common.repo.lzma.decompress", xdcmp) as m_lzma:
            with pytest.raises(GeneralRepoException) as exc:
                DpkgRepo("http://dummy_url").decompress_pkg_index()

        assert not xdcmp.called
        assert zdcmp.called
        assert "hot" in str(exc.value)

    def test_append_index_file_to_url(self):
        """
        Test append index files to the given url.
        :return:
        """
        url = "https://domainname.ext/PATH/Updates/Distro/version/arch/update/?very_long_auth_token"
        dpr = DpkgRepo(url)

        assert dpr.append_index_file(DpkgRepo.PKG_GZ) == \
            "https://domainname.ext/PATH/Updates/Distro/version/arch/update/Packages.gz?very_long_auth_token"

        assert dpr.append_index_file(DpkgRepo.PKG_XZ) == \
            "https://domainname.ext/PATH/Updates/Distro/version/arch/update/Packages.xz?very_long_auth_token"

    def test_append_index_file_to_url_no_difference(self):
        """
        Test append index files to the given url, but no changes has to be applied
        :return:
        """
        url = "https://domainname.ext/PATH/Updates/Distro/version/arch/update/Packages.gz?very_long_auth_token"
        assert url == DpkgRepo(url).append_index_file(DpkgRepo.PKG_GZ)

    def test_append_index_file_to_url_exception(self):
        """
        Test append index files to the given url, but exception happens due to unsupported URL
        :return:
        """
        url = "https://domainname.ext/PATH/Updates/Distro/version/arch/Packages.gz/update?very_long_auth_token"
        with pytest.raises(GeneralRepoException) as exc:
            DpkgRepo(url).append_index_file(DpkgRepo.PKG_GZ)

        assert str(exc.value) == "URL has already Packages.gz mentioned in it."
   07070100000038000081B40000000000000000000000015FBBE8EE00000D64000000000000000000000000000000000000003900000000spacewalk-backend/common/test/unit-test/test_rhnCache.py  #!/usr/bin/python
#
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

import sys
import unittest
from spacewalk.common import rhnCache


class Tests(unittest.TestCase):
    # pylint: disable=R0904
    key = "unit-test/test"
    content = ""
    for i in range(256):
        content = content + chr(i)

    def test_cache_1(self):
        "Tests storing of simple strings"
        content = self.content * 10
        self._test(self.key, content)

    def test_cache_2(self):
        "Tests storing of more complex data structures"
        content = [(1, 2, 3), {'a': 1}, 'ab']
        self._test(self.key, content)

    def test_cache_3(self):
        "Tests storing of raw content"
        content = self.content * 10
        self._test(self.key, content, raw=1)

    def test_cache_4(self):
        "Tests storing of raw content"
        content = self.content * 10
        self._test(self.key, content, raw=1, modified='20041110001122')

    def _test(self, key, content, **modifiers):
        # Blow it away
        rhnCache.CACHEDIR = '/tmp/rhn'
        self._cleanup(key)
        rhnCache.set(key, content, **modifiers)
        self.assertTrue(rhnCache.has_key(key))
        content2 = rhnCache.get(key, **modifiers)
        self.assertEqual(content, content2)

        self._cleanup(key)
        self.assertFalse(rhnCache.has_key(key))
        return (key, content)

    def test_cache_5(self):
        content = self.content * 10
        timestamp = '20041110001122'

        self._cleanup(self.key)
        rhnCache.set(self.key, content, modified=timestamp)

        self.assertTrue(rhnCache.has_key(self.key))
        self.assertTrue(rhnCache.has_key(self.key, modified=timestamp))
        self.assertFalse(rhnCache.has_key(self.key, modified='20001122112233'))
        self._cleanup(self.key)

    def test_missing_1(self):
        "Tests exceptions raised by the code"
        self._cleanup(self.key)
        self.assertEqual(None, rhnCache.get(self.key))

    def test_exception_1(self):
        "Tests raising exceptions"
        self.assertRaises(KeyError, rhnCache.get, self.key, missing_is_null=0)

    def test_opening_uncompressed_data_as_compressed(self):
      "Should return None, opening uncompressed data as compressed"
      rhnCache.set(self.key, self.content, raw=1)

      self.assertEqual(None, rhnCache.get(self.key, compressed=1, raw=1))

      self._cleanup(self.key)

    def test_opening_raw_data_as_pickled(self):
      "Should return None, opening uncompressed data as compressed"
      rhnCache.set(self.key, "12345", raw=1)

      self.assertEqual(None, rhnCache.get(self.key, raw=0))

      self._cleanup(self.key)

    def _cleanup(self, key):
        if rhnCache.has_key(key):
            rhnCache.delete(key)

        self.assertFalse(rhnCache.has_key(key))

if __name__ == '__main__':
    sys.exit(unittest.main() or 0)
07070100000039000081B40000000000000000000000015FBBE8EE000010E0000000000000000000000000000000000000003800000000spacewalk-backend/common/test/unit-test/test_suseLib.py   # -*- coding: utf-8 -*-
#
# Copyright (c) 2012 SUSE LLC
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#

try:
    import unittest2 as unittest
except ImportError:
    import unittest

import mock

from spacewalk.common import suseLib

PROXY_ADDR = "my.proxy.com:1234"
HTTPS_PROXY = "https://my.proxy.com:1234"
HTTP_PROXY = "http://my.proxy.com:1234"
PROXY_USER = "proxy_user"
PROXY_PASS = "proxy_pass"
HTTPS_PROXY_CREDS = "https://user:password@my.proxy.com:1234"


class SuseLibTest(unittest.TestCase):
    @classmethod
    def setUpClass(self):
        self.initCFG = mock.patch("spacewalk.common.suseLib.initCFG")
        self.initCFG.start()

    @classmethod
    def tearDownClass(self):
        self.initCFG.stop()

    @mock.patch('spacewalk.common.suseLib.CFG')
    @mock.patch('builtins.open')
    def test_get_proxy_from_yast(self, mocked_open, mocked_CFG):
        mocked_CFG.http_proxy          = None
        mocked_CFG.http_proxy_username = None
        mocked_CFG.http_proxy_password = None

        mocked_file                    = mock.MagicMock()
        mocked_file.read.return_value  = ' --proxy "%s"\n --proxy-user "%s:%s"' % (HTTPS_PROXY, PROXY_USER, PROXY_PASS)
        mocked_file.close.return_value = True

        mocked_open.return_value = mocked_file

        self.assertEqual(
            (HTTPS_PROXY, PROXY_USER, PROXY_PASS),
            suseLib.get_proxy()
        )

    @mock.patch('spacewalk.common.suseLib.CFG')
    @mock.patch('builtins.open')
    def test_get_proxy_from_yast_no_creds(self, mocked_open, mocked_CFG):
        mocked_CFG.http_proxy          = None
        mocked_CFG.http_proxy_username = None
        mocked_CFG.http_proxy_password = None

        mocked_file                    = mock.MagicMock()
        mocked_file.read.return_value  = ' --proxy "%s"' % HTTPS_PROXY
        mocked_file.close.return_value = True

        mocked_open.return_value = mocked_file

        self.assertEqual((HTTPS_PROXY, None, None), suseLib.get_proxy())

    @mock.patch('spacewalk.common.suseLib.CFG')
    @mock.patch('spacewalk.common.suseLib.log_debug')
    @mock.patch('builtins.open')
    def test_get_proxy_none(self, mocked_open, mocked_log_debug, mocked_CFG):
        mocked_CFG.http_proxy          = None
        mocked_CFG.http_proxy_username = None
        mocked_CFG.http_proxy_password = None

        mocked_file                    = mock.MagicMock()
        mocked_file.read.return_value  = ""
        mocked_file.close.return_value = True

        mocked_open.return_value = mocked_file

        self.assertEqual((None, None, None), suseLib.get_proxy())
        self.assertIn('Could not read proxy URL from rhn config',
                      mocked_log_debug.call_args_list[0][0][1])
        self.assertEqual(
            'Could not read proxy URL from /root/.curlrc',
            mocked_log_debug.call_args_list[1][0][1]
        )
        self.assertEqual(2, mocked_log_debug.call_count)

    @mock.patch('spacewalk.common.suseLib.CFG')
    def test_get_proxy_rhn_conf_no_creds(self, mocked_CFG):
        mocked_CFG.http_proxy          = PROXY_ADDR
        mocked_CFG.http_proxy_username = None
        mocked_CFG.http_proxy_password = None

        self.assertEqual((HTTP_PROXY, None, None), suseLib.get_proxy())

    @mock.patch('spacewalk.common.suseLib.CFG')
    def test_get_proxy_rhn_conf_creds(self, mocked_CFG):
        mocked_CFG.http_proxy          = PROXY_ADDR
        mocked_CFG.http_proxy_username = PROXY_USER
        mocked_CFG.http_proxy_password = PROXY_PASS

        self.assertEqual(
            (HTTP_PROXY, PROXY_USER, PROXY_PASS),
            suseLib.get_proxy()
        )

    @mock.patch('spacewalk.common.suseLib.CFG')
    def test_get_proxy_rhn_only_username(self, mocked_CFG):
        mocked_CFG.http_proxy          = PROXY_ADDR
        mocked_CFG.http_proxy_username = 'user'
        mocked_CFG.http_proxy_password = None

        self.assertEqual((HTTP_PROXY, 'user', None), suseLib.get_proxy())

0707010000003A000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000003500000000spacewalk-backend/common/test/unit-test/translations  0707010000003B000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000003800000000spacewalk-backend/common/test/unit-test/translations/en   0707010000003C000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000004400000000spacewalk-backend/common/test/unit-test/translations/en/LC_MESSAGES   0707010000003D000081B40000000000000000000000015FBBE8EE0000021A000000000000000000000000000000000000005100000000spacewalk-backend/common/test/unit-test/translations/en/LC_MESSAGES/unit-test.mo  Þ•          <      \       p      q      z      ‰   L  Ÿ      ì     õ                        Good day How do you do? What should I do now? Project-Id-Version: Unit Test 0.1
Report-Msgid-Bugs-To: rhn-bugs@redhat.com
POT-Creation-Date: 2005-02-23 22:39-0500
PO-Revision-Date: 2005-02-23 22:39-0500
Last-Translator: Mihai Ibanescu <misa@redhat.com>
Language-Team: English <EN@li.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
 Good day How do you do? What should I do now?   0707010000003E000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000003800000000spacewalk-backend/common/test/unit-test/translations/ro   0707010000003F000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000004400000000spacewalk-backend/common/test/unit-test/translations/ro/LC_MESSAGES   07070100000040000081B40000000000000000000000015FBBE8EE00000215000000000000000000000000000000000000005100000000spacewalk-backend/common/test/unit-test/translations/ro/LC_MESSAGES/unit-test.mo  Þ•          <      \       p      q      z      ‰   L  Ÿ   	   ì     ö                        Good day How do you do? What should I do now? Project-Id-Version: Unit Test 0.1
Report-Msgid-Bugs-To: rhn-bugs@redhat.com
POT-Creation-Date: 2005-02-23 22:39-0500
PO-Revision-Date: 2005-02-23 22:39-0500
Last-Translator: Mihai Ibanescu <misa@redhat.com>
Language-Team: English <EN@li.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
 Buna ziua Ce mai faceti? Ce sa fac acum?    07070100000041000081B40000000000000000000000015FBBE8EE00000322000000000000000000000000000000000000002E00000000spacewalk-backend/common/test/unit-test/uk.po # Yuri Chornoivan <yurchor@ukr.net>, 2015. #zanata
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: rhn-bugs@redhat.com\n"
"POT-Creation-Date: 2005-02-23 22:39-0500\n"
"PO-Revision-Date: 2015-09-26 06:22+0000\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian\n"
"Language: uk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
"X-Generator: Zanata 4.6.2\n"

#: foo.py:7
msgid "Good day"
msgstr "Ð”Ð¾Ð±Ñ€Ð¾Ð³Ð¾ Ð´Ð½Ñ"

#: foo.py:8
msgid "How do you do?"
msgstr "Ð¯Ðº ÑÐ¿Ñ€Ð°Ð²Ð¸?"

#: foo.py:9
msgid "What should I do now?"
msgstr "Ð©Ð¾ ÑÐ»Ñ–Ð´ Ð·Ñ€Ð¾Ð±Ð¸Ñ‚Ð¸?"
  07070100000042000081B40000000000000000000000015FBBE8EE00000302000000000000000000000000000000000000003500000000spacewalk-backend/common/test/unit-test/unit-test.en  # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: Unit Test 0.1\n"
"Report-Msgid-Bugs-To: rhn-bugs@redhat.com\n"
"POT-Creation-Date: 2005-02-23 22:39-0500\n"
"PO-Revision-Date: 2005-02-23 22:39-0500\n"
"Last-Translator: Mihai Ibanescu <misa@redhat.com>\n"
"Language-Team: English <EN@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: foo.py:7
msgid "Good day"
msgstr "Good day"

#: foo.py:8
msgid "How do you do?"
msgstr "How do you do?"

#: foo.py:9
msgid "What should I do now?"
msgstr "What should I do now?"
  07070100000043000081B40000000000000000000000015FBBE8EE000002D7000000000000000000000000000000000000003600000000spacewalk-backend/common/test/unit-test/unit-test.pot # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: Unit Test 0.1\n"
"Report-Msgid-Bugs-To: rhn-bugs@redhat.com\n"
"POT-Creation-Date: 2005-02-23 22:39-0500\n"
"PO-Revision-Date: 2005-02-23 22:39-0500\n"
"Last-Translator: Mihai Ibanescu <misa@redhat.com>\n"
"Language-Team: English <EN@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: foo.py:7
msgid "Good day"
msgstr ""

#: foo.py:8
msgid "How do you do?"
msgstr ""

#: foo.py:9
msgid "What should I do now?"
msgstr ""
 07070100000044000081B40000000000000000000000015FBBE8EE000002FD000000000000000000000000000000000000003500000000spacewalk-backend/common/test/unit-test/unit-test.ro  # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: Unit Test 0.1\n"
"Report-Msgid-Bugs-To: rhn-bugs@redhat.com\n"
"POT-Creation-Date: 2005-02-23 22:39-0500\n"
"PO-Revision-Date: 2005-02-23 22:39-0500\n"
"Last-Translator: Mihai Ibanescu <misa@redhat.com>\n"
"Language-Team: English <EN@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"

#: foo.py:7
msgid "Good day"
msgstr "Buna ziua"

#: foo.py:8
msgid "How do you do?"
msgstr "Ce mai faceti?"

#: foo.py:9
msgid "What should I do now?"
msgstr "Ce sa fac acum?"
   07070100000045000081FD0000000000000000000000015FBBE8EE000009BF000000000000000000000000000000000000002000000000spacewalk-backend/db-checker.py   #!/usr/bin/python
#
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import os
import sys
from uyuni.common import usix

_topdir = os.path.abspath(os.path.dirname(sys.argv[0]))
if _topdir not in sys.path:
    sys.path.append(_topdir)

from spacewalk.server import rhnSQL


def main():
    rhnSQL.initDB()

    if not args:
        print("No module specified")
        return 0

    if '.' not in sys.path:
        sys.path.append('.')

    g = globals()

    for module_name in args:
        print(("Checking module %s" % module_name))
        pmn = proper_module_name(module_name)
        try:
            m = __import__(pmn)
            g[module_name] = m
        except ImportError:
            e = sys.exc_info()[1]
            print(("Unable to import module %s: %s" % (module_name, e)))
            continue

        comps = pmn.split('.')
        for c in comps[1:]:
            m = getattr(m, c)

        for mod, name, statement in get_class_instances(m, rhnSQL.Statement):
            try:
                rhnSQL.prepare(statement)
            except rhnSQL.SQLStatementPrepareError:
                e = sys.exc_info()[1]
                print(("Error: %s.%s: %s" % (mod.__name__, name, e)))


def proper_module_name(module_name):
    suffix = '.py'
    if module_name.endswith(suffix):
        module_name = module_name[:-len(suffix)]

    return os.path.normpath(module_name).replace('/', '.')

_objs_seen = {}


def get_class_instances(obj, class_obj):
    if not hasattr(obj, "__dict__"):
        return []
    id_obj = id(obj)
    if id_obj in _objs_seen:
        return []
    _objs_seen[id_obj] = None
    result = []
    for k, v in list(obj.__dict__.items()):
        if isinstance(v, class_obj):
            result.append((obj, k, v))
        elif isinstance(v, usix.ClassType):
            result.extend(get_class_instances(v, class_obj))
    return result

if __name__ == '__main__':
    sys.exit(main() or 0)
 07070100000046000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000001600000000spacewalk-backend/doc 07070100000047000081B40000000000000000000000015FBBE8EE00001903000000000000000000000000000000000000001E00000000spacewalk-backend/doc/api.txt 
            Description of the API used by up2date version 2

I. Major changes:

The most prominent change (which complicated the whole picture a little bit)
is the notion of channel. A channel is an abstraction of what we previously
called a "distribution". It is a logical grouping of packages known to
correctly run on a system. This means no dependency problems should exit a
channel; i.e. channels should be self-contained with respect to RPM
dependencies.

A channel has a "base architecture" as an implicit feature. One should not be
able to put a package in a channel with an incompatible architecture.

XMLRPC is no longer the only way the client and the server talk to each other.
Because the mechanism to pack XMLRPC involves POST requests, the result of an
XMLRPC function call is impossible to be cached on regular HTTP
proxies/caches. For this reason, some of the bandwidth-hungry operations
(fetching the list of packages, a package header, a binary or a source
package) have been converted to use GET requests, and have been tested to work
with HTTP proxies/caches (we tested Squid and Apache).

A fault for a call is no longer packed as an HTTP 200 response for GET
requests. Instead we pass back HTTP_NOT_FOUND and (in certain situations)
HTTP_UNAUTHORIZED. The XMLRPC Fault is packed in the header of the response,
instead of the body.

We ran limited testing of running the up2date client over HTTP/1.1. While the
results seemed to be correct, a more thorough analysis of the implications and
complications HTTP/1.1 would bring is welcome.

We have tested the old clients to run against the current code; this implies
that the old XMLRPC calls run exactly as before. Some complications occur
though when channels kick in, since they completely ignore the channel
concept.


II. What an up2date client is supposed to do (the work-flow of the protocol):

1. the client issues an XMLRPC request for up2date.login, passing its system
  ID. A successful lookup of the server will return a dictionary of items
  which are supposed to be passed back to the server (in the header of the GET
  request) when GET functions are called. The dictionary typically contains
  the following keys:
    'X-RHN-Client-Version':     set to '2'
    'X-RHN-Auth-Expire-Offset': the string representation of a float, the
          number of seconds until the request expires
    'X-RHN-Auth-User-Id':       the username (string)
    'X-RHN-Server-Id':          the server ID (an integer)
    'X-RHN-Auth':               a signature generated by the server, which
        will be verified to establish the client authenticity
    'X-RHN-Auth-Server-Time':   the time (string representation of a float
        value, the number of seconds from the epoch, Jan 1, 1970) on the 
        server side) when this authentication token was generated. Clients
        could use this value to detect clock skews and to figure out when the
        authentication token will expire (and to renew it). The expiration
        time is the server time plus the 'X-RHN-Auth-Expire-Offset' value.
    'X-RHN-Auth-Channels':      a list of channels this server is subscribed
        to. Each entry in the list is in the form 
        [channel_name, channel_version], both strings.
        This key is for the client use only and is not used by the server to
        compute the signature, so it may be excluded from the dictionary the
        client sends back to the server

2. the client creates an rhnHTTPlib.Server, using the server's URL and the
  dictionary passed as 'headers'. Underneath, rhnHTTPlib will send all the
  (key, value) pairs as header fields for the GET request. An array value is
  passed as a multi-valued header.

3. using the server object created on step 2, the client can issue the
   following functions:
    - listPackages(channelName, channelVersion). The result is an
      XMLRPC-encoded list of entries. Each entry is (currently) a 7-item list:
      [packageName, packageVersion, packageRelease, packageEpoch, packageArch,
          packageSize, channelName]
      After retrieving the string returned by this function, one should 
      XMLRPC decode it in order to obtain the list.
    - getPackageHeader(channelName, headerName),
      where headerName closely mimics the way RPM filenames are generated,
      replacing the trailing .rpm with .hdr. For example, to retrieve the
      package returned by a listPackages call which reads:
        ['kernel', '2.4.3', '12', '', 'i686', '13441234',
         'redhat-linux-i386-7.1']
      one should issue:
        getPackageHeader('redhat-linux-i386-7.1', 'kernel-2.4.3-12.i686.hdr')
      The return value of this function is binary data, ready to be fed to the
      RPM library to obtain a header object.
    - getPackage(channelName, packageName), 
      where packageName closely mimics the way RPM filenames are generated.
      For example, to retrieve the package returned by a listPackages call 
      which reads:
        ['kernel', '2.4.3', '12', '', 'i686', '13441234',
         'redhat-linux-i386-7.1']
      one should issue:
        getPackage('redhat-linux-i386-7.1', 'kernel-2.4.3-12.i686.rpm').
      The return value of this function is binary data, ready to be saved in a
      file and considered a valid RPM package.
    - getPackageSource(channelName, packageSourceName),
      where packageName closely mimics the way RPM filenames are generated.
      For example, to retrieve the package returned by a listPackages call 
      which reads:
        ['kernel', '2.4.3', '12', '', 'i686', '13441234',
         'redhat-linux-i386-7.1']
      one should issue:
        getPackageSource('redhat-linux-i386-7.1', 'kernel-2.4.3-12.src.rpm')
      The return value of this function is binary data, ready to be saved in a
      file and considered a valid RPM package.
    
All these functions return a tuple (size, fd) if the call was successful
(i.e. if the HTTP result code is 200); otherwise, rhnHTTPlib raises a
cgiwrap.ProtocolError exception. The errcode, errmsg and headers fields of the
exception object contain the correspondent values of the result.

One should be careful when reading from the file-descriptor-like object
returned by the GET functions. HTTP/1.1 uses persistent connections, so one
should try to read exactly the size returned by the function. Failure to do so
may result in corruption of data.

 07070100000048000081B40000000000000000000000015FBBE8EE000015A2000000000000000000000000000000000000002000000000spacewalk-backend/doc/kudzu.doc   Devices detected are of the following classes:

CLASS_UNSPEC: used by the probe to say 'look for everything'
CLASS_NETWORK: network adapters
CLASS_SCSI: SCSI (and some RAID) adapters
CLASS_MOUSE: mice
CLASS_AUDIO: sound cards/chips
CLASS_CDROM: CD-ROMs, CD-Rs, CD-RW, DVD-ROMs, etc.
CLASS_MODEM: modems; also, PCI serial ports (FIXME)
CLASS_VIDEO: video cards
CLASS_TAPE: tape drives
CLASS_FLOPPY: IDE, SCSI, and USB floppy drives. Generic PC floppy drives
              are *not* detected
CLASS_SCANNER: scanners
CLASS_HD: hard drives, other random storage media
CLASS_RAID: RAID adapters. Not really used by anything currently.
CLASS_PRINTER: printers
CLASS_CAPTURE: video capture boards (think bttv)
CLASS_KEYBOARD: keyboards (only returned on Sparc hardware)
CLASS_MONITOR: DDC monitors
CLASS_USB: USB controllers
CLASS_SOCKET: Cardbus controllers. Might be expanded to PCMCIA controllers
	      in the future
CLASS_OTHER: anything else

The 'bus'es that it finds things on are the following:

BUS_PCI - also sees any currently configured Cardbus stuff
BUS_SBUS - this is currently a misnomer. It applies to anything pulled from
	the OpenPROM probe on Sparc
BUS_SERIAL
BUS_PSAUX - the PS/2 mouse controller
BUS_PARALLEL
BUS_SCSI - this includes ide-scsi and USB storage, if configured
BUS_IDE
BUS_KEYBOARD - this is where it looks for Sparc keyboard information
BUS_DDC - monitors
BUS_USB
BUS_ISAPNP
BUS_OTHER - a placeholder, mostly
BUS_UNSPEC - again, used by the probe to find anything

Fields written in /etc/sysconfig/hwconf that are common to all devices
(note: some may be NULL; if so, they are not written):

class:
	The device class
bus:
	The 'bus' the device was probed on
detached:
	This is for devices that the user wants to leave as configured,
	even though they may not be probed. Cardbus cards, if detected,
	are automatically marked as this; a user may want to mark this
	themselves for some USB devices.
driver:
	(always non-NULL)
	The driver to use for the card; it means different things for
	different device classes. For mice, it's a mouseconfig type;
	for video cards, it's a mapping in the Xconfigurator 'Cards'
	database; for *most* other things, it's a kernel module.
	There are three special values:
	  - unknown
	    This means that we don't know what driver to use
	  - ignore
	    This means that we don't care what driver to use. Generally
	    assigned to PCI bridges and the like. In the current
	    implementation, there really is no difference between
	    'ignore' and 'unknown'.
	  - disabled
	    This means that we'd normally assign a driver, but the
	    device appears to be disabled in the BIOS; this is mainly
	    set for PCI devices. This can occur if, for example,
	    the user sets 'PnP OS: Yes' in their BIOS and no interrupts
	    are assigned to any cards.
desc:
	(always non-NULL)
	Some generic description of the device
device:
	For network cards, this is 'eth' to indicate ethernet, and
	'tr' to indicate token ring. For other devices, it is usually
	the device node associated with a device. For example, for an
	IDE device, it would be along the lines of 'hda'. For a serial
	device, it could be 'ttyS1'.
	
Devices have additional fields depending on the 'bus' that they are
associated with (again, some may be NULL):

BUS_DDC
id:
	A DDC PnP id from the Xconfigurator MonitorsDB
horizSyncMin:
horizSyncMax:
vertRefreshMin:
vertRefreshMax:
	The minimum and maximum horizontal sync and vertical refresh
	rates.
modes:
	A list of VESA compatible resolutions supported by the
	video card/monitor combo.
mem:
	The amount of memory detected on the attached video card.
	Yes, this is technically in the wrong place.

BUS_IDE
physical:
logical:
	The physical and logical geometry for the drive, as gleaned
	from /proc/ide. Not used by anything.

BUS_ISAPNP
deviceId:
	The ISAPnP logical device id
pdeviceId:
	The parent card ISAPnP id
compat:
	Any compatibility PnP id, if available
native:
	'1' if a kernel driver with native ISAPnP support exists
	for this device. Gleaned from /lib/modules/`uname -r`/modules.isapnpmap
active:
	'1' if the device is currently activated
cardnum:
	The index of the card that this logical device is part of.
logdev:
	The logical device number for this logical device.
io:
irq:
dma:
mem:
	Resources currently in use by this card.

BUS_KEYBOARD:
BUS_PSAUX:
(none)

BUS_PARALLEL:
pnpmodel:
pnpmfr:
pnpdesc:
	The PnP model name, manufaturer, and description of this device.
pnpmodes:
	The PnP supported 'modes' for this device.
pinfo:
	X and Y resolution of the printer, whether or not it supports
	color and raw ASCII output, and if it uses a uniprint driver.
(Note: information returned by the parallel probe is not currently used
 by kudzu)
 
BUS_PCI:
vendorId:
deviceId:
	The PCI vendor and device ids.
subVendorId:
subDeviceId:
	The PCI subvendor and subdevice ids.
pciType:
	'1' for a normal PCI device. '2' for a Cardbus device.


BUS_SBUS:
width:
height:
freq:
monitor:
	Used for monitors detected via OpenPROM; it specifies
	the resolution and frequency.

BUS_SCSI:
host:
channel:
id:
lun:
	The host, channel, id, and lun of the device.

BUS_SERIAL:
pnpmfr:
pnpmodel:
pnpcompat:
pnpdesc:
	The serial PnP manufacturer, model, compatibility string,
	and description of the device.

BUS_USB:
usbclass:
usbsubclass:
usbprotocol:
	The USB class, subclass, and protocol. Used to identify
	the device type.
usbbus:
usblevel:
usbport:
productrevision:
	Other USB data. Not currently used.
vendorId:
deviceId:
	The vendor and device IDs of the USB device.

  07070100000049000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000001C00000000spacewalk-backend/logrotate   0707010000004A000081B40000000000000000000000015FBBE8EE000000DC000000000000000000000000000000000000002500000000spacewalk-backend/logrotate/Makefile  # Makefile for installation of the logrotation configuration files
#

# what is the backend top dir
TOP	= ..

INSTALL_FILES	= $(wildcard spacewalk-backend-*)
INSTALL_DEST	= /etc/logrotate.d

include $(TOP)/Makefile.defs
0707010000004B000081B40000000000000000000000015FBBE8EE000000C1000000000000000000000000000000000000003200000000spacewalk-backend/logrotate/spacewalk-backend-app # logrotation file for Spacewalk server
#

/var/log/rhn/rhn_server_app.log {
    weekly
    rotate 5
    copytruncate
    compress
    notifempty
    missingok
    size=10M
    su wwwrun www
}
   0707010000004C000081B40000000000000000000000015FBBE8EE000000C4000000000000000000000000000000000000003500000000spacewalk-backend/logrotate/spacewalk-backend-applet  # logrotation file for Spacewalk Server
#

/var/log/rhn/rhn_server_applet.log {
    weekly
    rotate 5
    copytruncate
    compress
    notifempty
    missingok
    size=10M
    su wwwrun www
}
0707010000004D000081B40000000000000000000000015FBBE8EE0000015C000000000000000000000000000000000000003200000000spacewalk-backend/logrotate/spacewalk-backend-cdn # logrotation file for Spacewalk Server
#

/var/log/rhn/cdnsync.log {
    weekly
    rotate 5
    copytruncate
    compress
    notifempty
    missingok
    size=10M
#LOGROTATE-3.8#    su root apache
}

/var/log/rhn/cdnsync/*.log {
    weekly
    rotate 5
    copytruncate
    compress
    delaycompress
    notifempty
    missingok
    size=10M
}
0707010000004E000081B40000000000000000000000015FBBE8EE000000C8000000000000000000000000000000000000003B00000000spacewalk-backend/logrotate/spacewalk-backend-config-files    # logrotation file for Spacewalk Server
#

/var/log/rhn/rhn_config_management.log {
    weekly
    rotate 5
    copytruncate
    compress
    notifempty
    missingok
    size=10M
    su wwwrun www
}
0707010000004F000081B40000000000000000000000015FBBE8EE000000CD000000000000000000000000000000000000004000000000spacewalk-backend/logrotate/spacewalk-backend-config-files-tool   # logrotation file for Spacewalk Server
#

/var/log/rhn/rhn_config_management_tool.log {
    weekly
    rotate 5
    copytruncate
    compress
    notifempty
    missingok
    size=10M
    su wwwrun www
}
   07070100000050000081B40000000000000000000000015FBBE8EE000000CF000000000000000000000000000000000000003200000000spacewalk-backend/logrotate/spacewalk-backend-iss # logrotation file for Spacewalk Server - SAT handler
#

/var/log/rhn/rhn_server_sat.log {
    weekly
    rotate 5
    copytruncate
    compress
    notifempty
    missingok
    size=10M
    su wwwrun www
}
 07070100000051000081B40000000000000000000000015FBBE8EE000000CE000000000000000000000000000000000000003900000000spacewalk-backend/logrotate/spacewalk-backend-iss-export  # logrotation file for Spacewalk Server package uploader
#

/var/log/rhn/rhn_sat_export_internal.log {
    weekly
    rotate 5
    copytruncate
    compress
    notifempty
    missingok
    su wwwrun www
}
  07070100000052000081B40000000000000000000000015FBBE8EE000000DB000000000000000000000000000000000000004200000000spacewalk-backend/logrotate/spacewalk-backend-package-push-server # logrotation file for Spacewalk Server package uploader
#

/var/log/rhn/rhn_upload_package_push.log {
    weekly
    rotate 5
    copytruncate
    compress
    notifempty
    missingok
    size=10M
    su wwwrun www
}
 07070100000053000081B40000000000000000000000015FBBE8EE000000BD000000000000000000000000000000000000003500000000spacewalk-backend/logrotate/spacewalk-backend-server  # logrotation file for Spacewalk Server
#

/var/log/rhn/rhn_server.log {
    weekly
    rotate 5
    copytruncate
    compress
    notifempty
    missingok
    size=10M
    su wwwrun www
}
   07070100000054000081B40000000000000000000000015FBBE8EE0000029E000000000000000000000000000000000000003400000000spacewalk-backend/logrotate/spacewalk-backend-tools   # logrotation file for Spacewalk Server
#

/var/log/rhn/activation.log {
    weekly
    rotate 5
    copytruncate
    compress
    notifempty
    missingok
    size=10M
#LOGROTATE-3.8#    su root apache
}

/var/log/rhn/rhn_server_satellite.log {
    weekly
    rotate 5
    copytruncate
    compress
    notifempty
    missingok
    size=10M
    su wwwrun www
}

/var/log/rhn/reposync.log {
    weekly
    rotate 5
    copytruncate
    compress
    notifempty
    missingok
    size=10M
#LOGROTATE-3.8#    su root apache
}

/var/log/rhn/reposync/*.log {
    weekly
    rotate 5
    copytruncate
    compress
    delaycompress
    notifempty
    missingok
    size=10M
}
  07070100000055000081B40000000000000000000000015FBBE8EE000000C4000000000000000000000000000000000000003500000000spacewalk-backend/logrotate/spacewalk-backend-xmlrpc  # logrotation file for Spacewalk Server
#

/var/log/rhn/rhn_server_xmlrpc.log {
    weekly
    rotate 5
    copytruncate
    compress
    notifempty
    missingok
    size=10M
    su wwwrun www
}
07070100000056000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000001500000000spacewalk-backend/po  07070100000057000081B40000000000000000000000015FBBE8EE000005E5000000000000000000000000000000000000001E00000000spacewalk-backend/po/Makefile # Makefile for the PO files (translation) catalog
#

TOP	= ..
SUBDIR	= locale
localedir = /usr/share/locale

include $(TOP)/Makefile.defs

# What is this package?
NLSPACKAGE	= spacewalk-backend-server
POTFILE		= $(NLSPACKAGE).pot

# PO catalog handling
MSGMERGE	= msgmerge -v
XGETTEXT	= xgettext --default-domain=$(NLSPACKAGE) --from-code utf-8 \
		  --add-comments		  
MSGFMT		= msgfmt --statistics --verbose

# What do we need to do
POFILES		= $(wildcard *.po)
MOFILES		= $(patsubst %.po,%.mo,$(POFILES))
SRCFILES	= $(shell find ../server -name \*.py) \
		  $(shell find ../common -name \*.py) \
		  $(shell find ../satellite_tools -name \*.py)

all:: $(MOFILES)

$(POTFILE): $(SRCFILES)
	@$(XGETTEXT) --keyword=_ --keyword=N_ $(SRCFILES)
	@if cmp -s $(NLSPACKAGE).po $(POTFILE); then \
	    rm -f $(NLSPACKAGE).po; \
	else \
	    mv -f $(NLSPACKAGE).po $(POTFILE); \
	fi

update-po: Makefile $(POTFILE) refresh-po

refresh-po: Makefile
	for cat in $(POFILES); do \
		lang=`basename $$cat .po`; \
		if $(MSGMERGE) $$lang.po $(POTFILE) > $$lang.pot ; then \
			mv -f $$lang.pot $$lang.po ; \
			echo "$(MSGMERGE) of $$lang succeeded" ; \
		else \
			echo "$(MSGMERGE) of $$lang failed" ; \
			rm -f $$lang.pot ; \
		fi \
	done

clean ::
	@rm -fv *mo *~ .depend

install :: $(MOFILES)
	@for n in $(MOFILES); do \
	    l=`basename $$n .mo`; \
	    d="$(PREFIX)$(localedir)/$$l/LC_MESSAGES" ; \
	    $(INSTALL_DIR) $$d ; \
	    $(INSTALL_DATA) $$n $$d/$(NLSPACKAGE).mo ; \
	done

%.mo: %.po
	$(MSGFMT) -o $@ $<
   07070100000058000081B40000000000000000000000015FBBE8EE0000B5EE000000000000000000000000000000000000001C00000000spacewalk-backend/po/aln.po   # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: aln\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
  07070100000059000081B40000000000000000000000015FBBE8EE0000B6F2000000000000000000000000000000000000001B00000000spacewalk-backend/po/ar.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Mohammad Ghoniem <Mohammad.Ghoniem@laposte.net>, 2004.
# Munzir Taha <munzir@kacst.edu.sa>, 2004.
# Munzir Taha <munzirtaha@newhorizons.com.sa>, 2005.
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Arabic <trans-ar@lists.fedoraproject.org>\n"
"Language: ar\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
  0707010000005A000081B40000000000000000000000015FBBE8EE0000B68B000000000000000000000000000000000000001B00000000spacewalk-backend/po/as.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Amitakhya Phukan <amitakhya.phukan@gmail.com>, 2006.
# Amitakhya Phukan <aphukan@redhat.com>, 2006, 2007.
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Assamese (http://www.transifex.com/projects/p/fedora/language/"
"as/)\n"
"Language: as\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
 0707010000005B000081B40000000000000000000000015FBBE8EE0000B621000000000000000000000000000000000000001C00000000spacewalk-backend/po/ast.po   # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Asturian (http://www.transifex.com/projects/p/fedora/language/"
"ast/)\n"
"Language: ast\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
   0707010000005C000081B40000000000000000000000015FBBE8EE0000B606000000000000000000000000000000000000001C00000000spacewalk-backend/po/bal.po   # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Balochi <trans-bal@lists.fedoraproject.org>\n"
"Language: bal\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
  0707010000005D000081B40000000000000000000000015FBBE8EE0000B606000000000000000000000000000000000000001B00000000spacewalk-backend/po/bg.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Bulgarian <trans-bg@lists.fedoraproject.org>\n"
"Language: bg\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
  0707010000005E000081B40000000000000000000000015FBBE8EE0000B9CC000000000000000000000000000000000000001B00000000spacewalk-backend/po/bn.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Progga <progga@BengaLinux.Org>, 2004.
# Robin Mehdee <robin@ankur.org.bd>, 2012.
# Runa Bhattacharjee <runab@redhat.com>, 2004.
# Salahuddin <salahuddin66@gmail.com>, 2004.
# Samia Niamatullah <mailsamia2001@yahoo.com>, 2005.
# Jiri Dostal <jdostal@redhat.com>, 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2018-03-16 10:53+0000\n"
"Last-Translator: Copied by Zanata <copied-by-zanata@zanata.org>\n"
"Language-Team: Bengali <info@ankur.org.bd>\n"
"Language: bn\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Zanata 4.6.2\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr "à¦…à¦•à¦¾à¦°à§à¦¯à¦•à¦° à¦¸à§‡à¦¶à¦¨ à¦•à§€"

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr "à¦…à¦•à¦¾à¦°à§à¦¯à¦•à¦° à¦…à§à¦¯à¦¾à¦•à¦¶à¦¨ à¦®à¦¾à¦¨à§‡à¦° à¦§à¦°à¦£ %s (%s)"

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr "%s à¦…à§à¦¯à¦¾à¦•à¦¶à¦¨ %s à¦¸à¦¾à¦°à§à¦­à¦¾à¦° à¦•à§‡ à¦…à¦§à¦¿à¦•à¦¾à¦° à¦•à¦°à§‡ à¦¨à¦¾"

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr "à¦…à¦¨à§à¦°à§‹à¦§à¦•à§ƒà¦¤ à¦¡à¦¾à¦Ÿà¦¾ à¦ªà¦¾à¦“à¦¯à¦¼à¦¾ à¦¯à¦¾à¦šà§à¦›à§‡ à¦¨à¦¾"

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr "à¦…à¦•à¦¾à¦°à§à¦¯à¦•à¦° à¦®à¦¾à¦¨ %s (%s)"

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr "%s à¦—à§à¦°à§à¦ªà§‡ à¦¸à¦¾à¦°à§à¦­à¦¾à¦° à¦¸à¦‚à¦¯à§‹à¦— à¦•à¦°à¦¤à§‡ à¦¬à§à¦¯à¦°à§à¦¥"

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr "'%s' à¦Ÿà§‹à¦•à§‡à¦¨ à¦ªà¦¾à¦“à¦¯à¦¼à¦¾ à¦¯à¦¾à¦¯à¦¼à¦¨à¦¿"

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""

#, fuzzy
#~ msgid "Red Hat Satellite Welcome Message"
#~ msgstr "à¦°à§‡à¦¡ à¦¹à§à¦¯à¦¾à¦Ÿ à¦¨à§‡à¦Ÿà¦“à¦¯à¦¼à¦¾à¦°à§à¦• à¦¸à§à¦¬à¦¾à¦—à¦¤ à¦¬à¦¾à¦°à§à¦¤à¦¾"
0707010000005F000081B40000000000000000000000015FBBE8EE0000B5F0000000000000000000000000000000000000001E00000000spacewalk-backend/po/bn_BD.po # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: bn_BD\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
07070100000060000081B40000000000000000000000015FBBE8EE0000B69E000000000000000000000000000000000000001E00000000spacewalk-backend/po/bn_IN.po # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Progga <progga@BengaLinux.Org>, 2004.
# Runa Bhattacharjee <runab@redhat.com>, 2004, 2005, 2006, 2007.
# Salahuddin <salahuddin66@gmail.com>, 2004.
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Bengali (India) <anubad@lists.ankur.org.in>\n"
"Language: bn_IN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
  07070100000061000081B40000000000000000000000015FBBE8EE0000B66B000000000000000000000000000000000000001B00000000spacewalk-backend/po/bs.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Bosnian (http://www.transifex.com/projects/p/fedora/language/"
"bs/)\n"
"Language: bs\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
 07070100000062000081B40000000000000000000000015FBBE8EE0000C774000000000000000000000000000000000000001B00000000spacewalk-backend/po/ca.po    # Robert Antoni Buj Gelonch <rbuj@fedoraproject.org>, 2015. #zanata
# Jiri Dostal <jdostal@redhat.com>, 2018. #zanata
# Robert Antoni Buj Gelonch <rbuj@fedoraproject.org>, 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2020-05-14 22:19+0000\n"
"Last-Translator: David Medina <medipas@gmail.com>\n"
"Language-Team: Catalan <https://l10n.opensuse.org/projects/uyuni/backend/ca/"
">\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.6.1\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr "testimoni incomplet del servidor intermediari: %s"

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr "Es va rebre una peticiÃ³ no vÃ lida (%s)."

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""
"MISSATGE IMPORTANT SEGÃœENT:\n"
"%s"

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""
"Mentre s'executava '%s': es va capturar\n"
"%s : %s\n"

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr "L'URI %s no Ã©s vÃ lid"

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
#, fuzzy
msgid "ISS is disabled on this server."
msgstr "ISS estÃ  inhabilitat en aquest satellite."

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr "El servidor \"%s\" no estÃ  habilitat per a l'ISS."

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr "S'esperava un paquet, no: %s"

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr "la clau de sessiÃ³ no Ã©s vÃ lida"

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr "Aquest id. de servidor ja no existeix"

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr "L'acciÃ³ %s no pertany al servidor %s"

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
#, fuzzy
msgid "Privacy Statement"
msgstr "DeclaraciÃ³ de privacitat de la Red Hat Network"

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr "Valor no vÃ lid %s (%s)"

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr "No esteu autoritzat per gestionar els paquets de l'organitzaciÃ³ nulÂ·la"

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr "No esteu autoritzat per gestionar els paquets de l'organitzaciÃ³ %s"

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr "No esteu autoritzat per realitzar les tasques administratives"

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""
"No esteu autoritzat per gestionar el canal %s, o no existeix aquest canal"

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr "Si us plau, executeu rhn_register com a arrel en aquest client."

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr "Paquet no trobat"

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr "El testimoni `%s' tÃ© mÃ©s d'un canal base assignat"

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr "No es va poder tovar el testimoni '%s'"

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr "PermÃ­s denegat."

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr "Objecte no trobat."

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr "Es requereix un nom d'usuari vÃ lid."

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr "Es requereix una contrasenya vÃ lida."

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr "El nom d'usuari contÃ© carÃ cters no vÃ lids."

#: ../common/rhnException.py:66
msgid "File not found."
msgstr "Fitxer no trobat."

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr "No s'ha pogut actualitzar l'entrada de la base de dades."

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr "L'arquitectura del servidor no estÃ  admesa."

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr "Valor no vÃ lid per a l'entrada."

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr "Error del canal"

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr "El testimoni de la sessiÃ³ del client no Ã©s vÃ lid."

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr "El testimoni de la sessiÃ³ del client ha venÃ§ut."

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr "AcciÃ³ no vÃ lida"

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""
"No esteu autoritzat per realitzar les tasques administratives en aquest "
"sistema."

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr "El sistema ja estÃ  subscrit al canal especificat."

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr "El sistema actualment no estÃ  subscrit al canal especificat."

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr "El canal especificat no existeix."

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr "La versiÃ³ del canal no Ã©s vÃ lida."

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
#, fuzzy
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""
"\n"
"     Arquitectura no vÃ lida.\n"
"\n"
"     L'arquitectura del paquet no estÃ  admesa per la Red Hat Network\n"
"     "

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr "CapÃ§alera RPM no vÃ lida"

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr "InformaciÃ³ no vÃ lida pujada al servidor"

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""
"S'ha produÃ¯t un error en pujar la configuraciÃ³ de les interfÃ­cies de xarxa."

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""
"Hi ha massa sistemes registrats que utilitzen aquest testimoni de "
"registrament"

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr "El testimoni contÃ© ajustos no vÃ lids, en desÃºs i insuficients"

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr "Conflicte en els testimonis d'activaciÃ³"

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr "No us podeu de-subscriure del canal base."

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr "No es pot donar el dret al sistema"

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr "El nom d'usuari no Ã©s vÃ lid"

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
#, fuzzy
msgid "SUSE Manager Proxy unable to login."
msgstr "RHN Proxy va ser incapaÃ§ d'iniciar la sessiÃ³."

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
#, fuzzy
msgid "SUSE Manager Proxy session token is invalid."
msgstr "El testimoni de la sessiÃ³ del RHN Proxy no Ã©s vÃ lid."

#: ../common/rhnException.py:198
#, fuzzy
msgid "SUSE Manager Proxy session token has expired."
msgstr "El testimoni de la sessiÃ³ del RHN Proxy ha venÃ§ut."

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
#, fuzzy
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""
"\n"
"     La creaciÃ³ de l'usuari del RHN Satellite no estÃ  permesa a travÃ©s de "
"rhn_register;\n"
"     poseu-vos en contacte amb l'administrador del sistema perquÃ¨ creÃ¯ el "
"vostre compte.\n"
"     "

#: ../common/rhnException.py:206
#, fuzzy
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""
"\n"
"     Aquest servidor de satellite no pot utilitzar la sincronitzaciÃ³ interna "
"entre els satellite en aquest satellite\n"
"     "

#: ../common/rhnException.py:209
#, fuzzy
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""
"\n"
"     La sincronitzaciÃ³ interna entre els satellite estÃ  inhabilitada en "
"aquest satellite.\n"
"     "

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr "Es va passar un tipus de dades no vÃ lid"

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr "No es pot recuperar el canal"

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr "No es pot recuperar el paquet"

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr "No es pot recuperar l'errata"

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr "Falta el fitxer"

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr "Error en la recuperaciÃ³ de la funciÃ³"

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr "Error en l'execuciÃ³ de la funciÃ³"

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr "Falta la cadena de la versiÃ³"

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr "La cadena de la versiÃ³ no Ã©s vÃ lida"

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr "Les versions no coincideixen"

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr "La versiÃ³ del canal no Ã©s vÃ lida"

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr "No hi ha el fitxer comps per al canal"

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr "No es pot recuperar el fitxer comps"

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr "Falta l'acciÃ³ de configuraciÃ³"

#: ../common/rhnException.py:230
msgid "File too large"
msgstr "El fitxer Ã©s massa gran"

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr "El fitxer contÃ© dades binÃ ries"

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr "El canal de configuraciÃ³ no estÃ  buit"

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr "Error de permÃ­s"

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr "Falta contingut per al fitxer de configuraciÃ³"

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr "El canal de configuraciÃ³ no existeix"

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr "El canal de configuraciÃ³ ja existeix"

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr "El nÃºmero de revisiÃ³ no Ã©s vÃ lid"

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr "No es poden comparar els fitxers de diferent tipus de fitxer"

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
#, fuzzy
msgid "Invalid content encoding"
msgstr "El codi de l'element no Ã©s vÃ lid"

#: ../common/rhnException.py:253
#, fuzzy
msgid "Invalid crash name"
msgstr "El nom del paquet no Ã©s vÃ lid"

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""
"Missatge d'error:\n"
"    %s\n"

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr "Codi de la classe d'error: %s\n"

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr "InformaciÃ³ de la classe d'error: %s\n"

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr "ExplicaciÃ³: %s"

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr "ERROR: %s %s: %s"

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, fuzzy, python-format
msgid "    Extinct package:  %s"
msgstr "S'esperava un paquet, no: %s"

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, fuzzy, python-format
msgid "Unable to save file %s: %s"
msgstr "No es pot donar el dret al sistema"

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
#, fuzzy
msgid "print the configuration and exit"
msgstr "El canal de configuraciÃ³ no existeix"

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
#, fuzzy
msgid "  12 - Channel do not exist"
msgstr "El canal especificat no existeix."

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""

#~ msgid "ISS is disabled on this satellite."
#~ msgstr "ISS estÃ  inhabilitat en aquest satellite."

#, fuzzy
#~ msgid "Red Hat Satellite Welcome Message"
#~ msgstr "Missatge de benvinguda a la Red Hat Network"

#, fuzzy
#~ msgid "Red Hat Satellite Privacy Statement"
#~ msgstr "DeclaraciÃ³ de privacitat de la Red Hat Network"
07070100000063000081B40000000000000000000000015FBBE8EE00011087000000000000000000000000000000000000001B00000000spacewalk-backend/po/cs.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Martin Minar <skulliq@gmail.com>, 2011.
# Milan Kerslager <kerslage@linux.cz>, 2002,2007.
# Miloslav Trmac <mitr@volny.cz>, 2002.
# Miroslav SuchÃ½ <msuchy@redhat.com>, 2011.
# Jiri Dostal <jdostal@redhat.com>, 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2020-09-25 17:48+0000\n"
"Last-Translator: AleÅ¡ Kastner <alkas@volny.cz>\n"
"Language-Team: Czech <https://l10n.opensuse.org/projects/uyuni/backend/cs/>\n"
"Language: cs\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Weblate 3.6.1\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr "NeÃºplnÃ½ autentifikaÄnÃ­ token pro proxy: %s"

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr "ZaslanÃ½ podpis proxy %s neodpovÃ­dÃ¡ naÅ¡emu %s."

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr "zamÃ­tnutÃ¡ proxy autentifikace"

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr "NeplatnÃ¡ Å¾Ã¡dost (%s)."

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""
"DÅ®LEÅ½ITÃ‰ UPOZORNÄšNÃ:\n"
"%s"

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""
"PÅ™i bÄ›hu '%s': zachyceno\n"
"%s : %s\n"

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr "NeplatnÃ© URI %s"

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""
"\n"
"                   ÃšÄet %s byl na tomto serveru deaktivovÃ¡n.\n"
"                   Pro dalÅ¡Ã­ pomoc kontaktujte sprÃ¡vce svÃ© organizace."

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr "VÃ¡Å¡ systÃ©m nebyl v databÃ¡zi {PRODUCT_NAME} nalezen"

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr "ISS je na tomto serveru deaktivovÃ¡no."

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr "Server \"%s\" nemÃ¡ povolen ISS."

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr "OÄekÃ¡vÃ¡m jmÃ©no balÃ­ku, nikoliv \"%s\""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr "OÄekÃ¡vÃ¡m balÃ­k, nikoliv \"%s\""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr "ServerovÃ½ profil \"%s\" nemÃ¡ aktivovÃ¡nu sluÅ¾bu SUSE Manager Proxy"

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr "NeplatnÃ½ session key"

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr "Toto ID serveru jiÅ¾ neexistuje"

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr "NeplatnÃ¡ hodnota operace typu %s (%s)"

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr "Operace %s nenÃ¡leÅ¾Ã­ k serveru %s"

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr "ChybÃ­ poÅ¾adovanÃ¡ data"

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr "ChybÃ­ poÅ¾adovanÃ­ Äleni"

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr "PokouÅ¡Ã­te se zaregistrovat systÃ©m na neexistujicÃ­ho uÅ¾ivate"

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr "PoÅ¾adovÃ¡na neplatnÃ¡ release verze systÃ©mu"

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""
"Nelze najÃ­t platnÃ© sÃ­Å¥ovÃ© rozhranÃ­, ipaddr (IPv4) a ip6addr (IPv6) nebyly "
"nalezeny."

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr "UvÃ­tacÃ­ zprÃ¡va {PRODUCT_NAME}"

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr "ProhlÃ¡Å¡enÃ­ o ochranÄ› soukromÃ­"

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr "Jako argument u produktu je oÄekÃ¡vÃ¡n slovnÃ­k"

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr "NeplatnÃ¡ hodnota '%s' pro %s (%s)"

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr "NeplatnÃ½ pÃ¡r system_id/action_id."

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr "NeplatnÃ¡ hodnota %s (%s)"

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr "PrÃ¡zdnÃ¡ organizace nemÃ¡ prÃ¡vo spravovat balÃ­Äky"

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr "NemÃ¡te prÃ¡vo spravovat balÃ­Äky v organizaci  %s"

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr "NemÃ¡te prÃ¡vo provÃ¡dÄ›t Ãºkoly sprÃ¡vy"

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr "NemÃ¡te prÃ¡vo spravovat kanÃ¡l %s, nebo takovÃ½ kanÃ¡l ani neexistuje"

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""
"\n"
"               ÃšÄet %s byl na tomto serveru deaktivovÃ¡n.\n"
"               Pro dalÅ¡Ã­ pomoc kontaktujte sprÃ¡vce svÃ© organizace."

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""
"VÃ¡Å¡ systÃ©m nemÃ¡ pÅ™Ã­stup k Å¾Ã¡dnÃ½m kanÃ¡lÅ¯m pro (release='%(release)s', "
"arch='%(arch)s')%(www_activation)s"

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""
"\n"
"Pokud mÃ¡te registraÄnÃ­ ÄÃ­slo, tak se s nÃ­m nejdÅ™Ã­ve zaregistrujte na http://"
"www.redhat.com/apps/activate/ a pak to zkuste znova.\n"
"\n"

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr "NedostateÄnÃ¡ subscription prÃ¡va pro release (%s, %s"

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr "SystÃ©m je registrovÃ¡n, ale neaktivnÃ­"

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""
"\n"
"NeplatnÃ¡ kombinace architektury a operaÄnÃ­ho systÃ©mu (%s, %s).\n"
"VÃ¡Å¡ systÃ©m byl sice zaregistrovÃ¡n, ale nebude dostÃ¡vat aktualizace,\n"
"protoÅ¾e nenÃ­ pÅ™ihlÃ¡Å¡en do Å¾Ã¡dnÃ©ho kanÃ¡lu.\n"
"Pokud jste jeÅ¡tÄ› svÅ¯j produkt neaktivovali, jdÄ›te na:\n"
"  \n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...a aktivujte si ho."

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""
"\n"
"NeplatnÃ¡ kombinace architektury a operaÄnÃ­ho systÃ©mu (%s, %s).\n"
"VÃ¡Å¡ systÃ©m byl sice zaregistrovÃ¡n, ale nebude dostÃ¡vat aktualizace,\n"
"protoÅ¾e nemÅ¯Å¾e bÃ½t pÅ™ihlÃ¡Å¡en do hlavnÃ­ho kanÃ¡lu.\n"
"Pro dalÅ¡Ã­ pomoc kontaktujte sprÃ¡vce vaÅ¡Ã­ organizace.\n"

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""
"\n"
"  SystÃ©m byl sice zaregistrovÃ¡n, ale jeÅ¡tÄ› nemÃ¡ povolenu\n"
"  sluÅ¾bu.  Pro povolenÃ­ sluÅ¾by se pÅ™ihlaste na webovÃ© strÃ¡nky na:\n"
"\n"
"  %(entitlement_url)s\n"

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""
"\n"
"  SystÃ©m byl sice zaregistrovÃ¡n, ale jeÅ¡tÄ› nemÄ›l k dispozici\n"
"  Å¾Ã¡dnÃ© povolenÃ© sluÅ¾by.  Pro povolenÃ­ sluÅ¾by se pÅ™ihlaste na webovÃ© strÃ¡nky "
"na:\n"
"\n"
"  %(entitlement_url)s\n"

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr "SpusÅ¥te prosÃ­m rhn_register jako superuÅ¾ivatel (root) tohoto klienta"

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr "Tato sluÅ¾ba nenÃ­ aktivovÃ¡na pro systÃ©movÃ½ profil: \"%s\""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr "Byl vyÅ¾Ã¡dÃ¡n neplatnÃ½ RPM balÃ­k %s"

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr "BalÃ­k nenalezen"

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr "Architektura '%s' nenÃ­ podporovÃ¡na"

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr "Token `%s' mÃ¡ pÅ™iÅ™azen vÃ­ce jak jeden kanÃ¡l"

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr "Konflikt hlavnÃ­ch kanÃ¡lÅ¯"

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr "NepodaÅ™ilo se pÅ™idat server do skupiny %s"

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr "Bylo dosaÅ¾eno maximÃ¡lnÃ­ho poÄtu uÅ¾Ã­vÃ¡nÃ­ %s"

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""
"SklÃ¡dÃ¡nÃ­ re-registraÄnÃ­ch tokenÅ¯ s povolenÃ­mi na rÅ¯znÃ© hlavnÃ­ kanÃ¡ly nenÃ­ "
"podporovÃ¡no"

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr "NepodaÅ™ilo se nalÃ©zt token '%s'"

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr "Tokeny jsou z neodpovÃ­dajÃ­cÃ­ch si organizacÃ­"

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr "NesouhlasÃ­ session kickstartu"

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr "SÄÃ­tÃ¡nÃ­ re-registraÄnÃ­ch tokenÅ¯ nenÃ­ podporovÃ¡no"

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr "NeplatnÃ¡ kombinace uÅ¾ivatelskÃ©ho jmÃ©na a hesla"

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr "UÅ¾ivatelskÃ© jmÃ©no `%s' nebylo rezerovÃ¡no"

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr "Nebyla udÃ¡na e-mailovÃ¡ adresa"

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr "uÅ¾ivatelskÃ© jmÃ©no musÃ­ mÃ­t minimÃ¡lnÄ› %d znakÅ¯"

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr "uÅ¾ivatelskÃ© jmÃ©no musÃ­ bÃ½t kratÅ¡Ã­, neÅ¾ %d znakÅ¯"

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr "uÅ¾ivatelskÃ© jmÃ©no = `%s' obsahuje neplatnÃ½ znak `%s'"

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr "ProsÃ­m, omezte e-mail adresu na znaky %s"

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr "heslo musÃ­ mÃ­t nejmÃ©nÄ› %d znakÅ¯"

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr "Heslo musÃ­ bÃ½t kratÅ¡Ã­, neÅ¾ %d znakÅ¯"

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr "heslo obsahuje znak `%s'"

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr "uÅ¾ivatelskÃ© jmÃ©no by mÄ›lo mÃ­t alespoÅˆ %d znakÅ¯"

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr "Nelze registrovat uÅ¾ivatelskÃ¡ jmÃ©na konÄÃ­cÃ­ na %s"

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr "Toto asi nenÃ­ platnÃ© uÅ¾ivatelskÃ© jmÃ©no."

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr "NeplatnÃ¡ kombinace uÅ¾ivatelskÃ©ho jmÃ©na a hesla."

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr "Tento login je jiÅ¾ pouÅ¾Ã­vÃ¡n nebo je heslo neplatnÃ©."

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr "PÅ™Ã­stup odepÅ™en."

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr "Objekt nenalezen."

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr "NeplatnÃ© ID systÃ©mu."

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr "NeplatnÃ© pÅ™ihlaÅ¡ovacÃ­ Ãºdaje do systÃ©mu."

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr "NepodaÅ™ilo se z databÃ¡ze zÃ­skat uÅ¾ivatelskÃ¡ data."

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr "VyÅ¾adovÃ¡no platnÃ© uÅ¾ivatelskÃ© jmÃ©no."

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr "VyÅ¾adovÃ¡no platnÃ© heslo."

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr "NedostateÄnÃ¡ dÃ©lka uÅ¾ivatelskÃ©ho jmÃ©na."

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr "NedostateÄnÃ¡ dÃ©lka hesla."

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr "UÅ¾ivatelskÃ© jmÃ©no obsahuje nepovolenÃ© znaky."

#: ../common/rhnException.py:66
msgid "File not found."
msgstr "Soubor nenalezen."

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""
"Tato kombinace architektury a verze operaÄnÃ­ho systÃ©mu nenÃ­ podporovÃ¡na."

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr "NepodaÅ™ilo se zÃ­skat systÃ©movÃ¡ data z databÃ¡ze."

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr "Funkci byly pÅ™edÃ¡ny neplatnÃ© argumenty."

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr "NepodaÅ™ilo se zÃ­skat poÅ¾adovanÃ½ zÃ¡znam."

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr "NepodaÅ™ilo se aktualizovat zÃ¡znam v databÃ¡zi."

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr "NepodporovanÃ¡ architektura serveru."

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""
"\n"
"     Funkce anonymnÃ­ho serveru jiÅ¾ nenÃ­ dostupnÃ¡.\n"
"\n"
"     Znovu se zaregistrujte jako superuÅ¾ivatel root pÅ™Ã­kazem mgr_register.\n"
"     NavÅ¡tivte https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     nebo se pÅ™ihlaste na https://%(hostname)s a na kartÄ› \"PÅ™ehled"
"\" (Overview),\n"
"     zvolte \"SprÃ¡vu pÅ™edplatnÃ½ch\" (Subscription Management)\n"
"     pro aktivaci sluÅ¾by pro tento systÃ©m.\n"
"     "

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr "Tento zÃ¡znam v databÃ¡zi neexistuje."

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr "NeplatnÃ¡ hodnota zÃ¡znamu."

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""
"\n"
"     Tento systÃ©m nemÃ¡ platnÃ© oprÃ¡vnÄ›nÃ­ pro SprÃ¡vce SUSE.\n"
"     NavÅ¡tivte https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     nebo se pÅ™ihlaste na https://%(hostname)s a na kartÄ› \"PÅ™ehled"
"\" (Overview)\n"
"     zvolte \"SprÃ¡vu pÅ™edplatnÃ½ch\" (Subscription Management),\n"
"     abyste si aktivovali sluÅ¾bu pro tento systÃ©m.\n"
"     "

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr "Chyba kanÃ¡lu"

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr "Session token klient je neplatnÃ½."

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr "Session token klienta vyprÅ¡el."

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr "NemÃ¡te oprÃ¡vnÄ›nÃ­ k vyzvednutÃ­ poÅ¾adovanÃ©ho objektu."

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr "NeplatnÃ¡ operace"

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr "NemÃ¡te oprÃ¡vnÄ›nÃ­ spravovat tento systÃ©m."

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr "Tento systÃ©m je jiÅ¾ pÅ™ihlÃ¡Å¡en do danÃ©ho kanÃ¡lu."

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr "Tento systÃ©m nenÃ­ momentÃ¡lnÄ› pÅ™ihlÃ¡Å¡enÃ½ do danÃ©ho kanÃ¡lu."

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr "PoÅ¾adovanÃ½ kanÃ¡l neexistuje."

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr "NeplatnÃ¡ verze kanÃ¡lu."

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""
"\n"
"     PÅ™ekroÄeny limity ÄlenstvÃ­ ve skupinÄ› uÅ¾ivatelÅ¯.\n"
"\n"
"     AktuÃ¡lnÃ­ nastavenÃ­ ÃºÄtu neumoÅ¾Åˆuje pÅ™idat dalÅ¡Ã­ uÅ¾ivatelskÃ½ ÃºÄet. "
"Zkontrolujte\n"
"     prosÃ­m u sprÃ¡vce vaÅ¡Ã­ organizace ÃºÄet, zda maximÃ¡lnÃ­ poÄet uÅ¾ivatelÅ¯,\n"
"     kteÅ™Ã­ se mohou pÅ™ihlÃ¡sit k odbÄ›ru serverovÃ½ch potÅ™eb, mÃ¡ bÃ½t zmÄ›nÄ›n.\n"
"     "

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""
"\n"
"     PÅ™ekroÄeny limity ÄlenstvÃ­ ve skupinÄ› uÅ¾ivatelÅ¯.\n"
"\n"
"     AktuÃ¡lnÃ­ nastavenÃ­ ÃºÄtu VÃ¡m neumoÅ¾Åˆuje pÅ™idat dalÅ¡Ã­ uÅ¾ivatelskÃ½ ÃºÄet.\n"
"     Zkontrolujte u sprÃ¡vce vaÅ¡Ã­ organizace ÃºÄet, zda maximÃ¡lnÃ­ poÄet "
"uÅ¾ivatelÅ¯,\n"
"     kteÅ™Ã­ se mohou pÅ™ihlÃ¡sit k odbÄ›ru serverovÃ½ch potÅ™eb, mÃ¡ bÃ½t zmÄ›nÄ›n.\n"
"     "

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""
"\n"
"     NeplatnÃ¡ architektura.\n"
"\n"
"     Architektura balÃ­Äku nenÃ­ podporovÃ¡na\n"
"     "

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr "NeplatnÃ¡ hlaviÄka RPM"

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""
"\n"
"    Tento systÃ©m je jiÅ¾ zaregistrovÃ¡n jako Salt Minion. Chcete-li se "
"zaregistrovat jako tradiÄnÃ­ klient,\n"
"    nejprve ho smaÅ¾te webovÃ½m rozhranÃ­m UI nebo API a pak ho registrujte "
"tradiÄnÃ­mi nÃ¡stroji.\n"
"    "

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr "Na server byla nahrÃ¡na neplatnÃ¡ informace"

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr "Chyba pÅ™i nahrÃ¡vÃ¡nÃ­ konfigurace sÃ­Å¥ovÃ½ch rozhranÃ­."

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""
"\n"
"     NahrÃ¡vÃ¡nÃ­ balÃ­Äku se nezdaÅ™ilo kvÅ¯li poruÅ¡enÃ­ jedineÄnosti.\n"
"     UjistÄ›te se, Å¾e balÃ­Äek nemÃ¡ duplicitnÃ­ zÃ¡vislosti a je dosud na "
"serveru\n"
"     "

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""
"\n"
"     MoÅ¾nost --force rhnpush byla na tomto serveru deaktivovÃ¡na.\n"
"     Pro dalÅ¡Ã­ pomoc kontaktujte svÃ©ho sprÃ¡vce SUSE Manager.\n"
"     "

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""
"\n"
"     ZadanÃ½ aktivaÄnÃ­ Å¾eton nebyl na serveru nalezen.\n"
"     Zkuste to prosÃ­m znovu s platnÃ½m klÃ­Äem.\n"
"     "

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""
"PomocÃ­ tohoto registraÄnÃ­ho tokenu se registrovalo pÅ™Ã­liÅ¡ mnoho systÃ©mÅ¯"

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr "Token obsahuje neplatnÃ©, zastaralÃ© nebo nedostateÄnÃ© nastavenÃ­"

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr "Konflikt aktivaÄnÃ­ch tokenÅ¯"

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""
"\n"
"     Ve vaÅ¡em systÃ©mu nebyl nalezen Å¾Ã¡dnÃ½ odpovÃ­dajÃ­cÃ­ zÃ¡kladnÃ­ kanÃ¡l.\n"
"     "

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""
"\n"
"     NemÃ¡te povolenÃ­ k odbÄ›ru urÄenÃ©ho kanÃ¡lu.\n"
"     Pro dalÅ¡Ã­ podrobnosti se prosÃ­m obraÅ¥te na\n"
"     kanÃ¡l vaÅ¡Ã­ organizace nebo na jejÃ­ sprÃ¡vce.\n"
"     "

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr "Z hlavnÃ­ho kanÃ¡lu se nelze odhlÃ¡sit."

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr "Nelze odebÃ­rat SUSE Manager nebo Proxy kanÃ¡l."

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr "PÅ™i pokusu o pÅ™ipojenÃ­ systÃ©mu do jeho skupin doÅ¡lo k chybÄ›"

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr "Nelze pÅ™iÅ™adit oprÃ¡vnÄ›nÃ­ systÃ©mu"

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr "PÅ™Ã­liÅ¡ dlouhÃ½ e-mail."

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr "Tento systÃ©m jiÅ¾ byl registrovÃ¡n."

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr "NeplatnÃ© uÅ¾ivatelskÃ© jmÃ©no"

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr "NepodaÅ™ilo se dohledat server"

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr "ChybÃ½ poÅ¾adovanÃ½ argument"

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr "K hardwaru nejsou pÅ™ipojeny Å¾Ã¡dnÃ© informace o oprÃ¡vnÄ›nÃ­"

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr "ÄŒÃ­slo instalace nenÃ­ oprÃ¡vnÄ›nÃ­"

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr "PÅ™Ã­liÅ¡ dlouhÃ© uÅ¾ivatelskÃ© jmÃ©no"

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr "PÅ™Ã­liÅ¡ dlouhÃ© heslo"

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr "Tento uÅ¾ivatel mÃ¡ k API pÅ™Ã­stup jen pro ÄtenÃ­. Akce je zamÃ­tnuta."

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr "NÃ¡zev systÃ©mu musÃ­ mÃ­t alespoÅˆ 1 znak"

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr "Chyba SUSE Manager Proxy."

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr "SUSE Manager Proxy nenÃ­ schopen se pÅ™ihlÃ¡sit."

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""
"\n"
"     ID systÃ©mu SUSE Manager Proxy neodpovÃ­dÃ¡ serveru Spacewalk Proxy\n"
"     v databÃ¡zi.\n"
"     "

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr "Å½eton relace SUSE Manager Proxy je neplatnÃ½."

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr "Å½eton relace SUSE Manager Proxy vyprÅ¡el."

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""
"\n"
"      vytvoÅ™enÃ­ uÅ¾ivatele nenÃ­ povoleno pomocÃ­ mgr_register;\n"
"     obraÅ¥te se na svÃ©ho sysadmina a poÅ¾Ã¡dejte ho o vytvoÅ™enÃ­ ÃºÄtu.\n"
"     "

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""
"\n"
"     Tento server SUSE Manager nemÃ¡ na tomto serveru povoleno pouÅ¾Ã­vat Inter "
"Server Sync\n"
"     "

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""
"\n"
"     Funkce Inter Server Sync je na tomto serveru SUSE Manager zakÃ¡zÃ¡na.\n"
"     "

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr "PÅ™edÃ¡n neplatnÃ½ datovÃ½ typ"

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr "NepodaÅ™ilo se naÄÃ­st kanÃ¡l"

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr "NepodaÅ™ilo se naÄÃ­st balÃ­Äek"

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr "NepodaÅ™ilo se naÄÃ­st erratu"

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr "Soubor nenalezen"

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr "Chyba naÄÃ­tÃ¡nÃ­ funkce"

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr "Chyba provÃ¡dÄ›nÃ­ funkce"

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr "ChybÄ›jÃ­cÃ­ Å™etÄ›zec verze"

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr "NeplatnÃ½ Å™etÄ›zec verze"

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr "NesouhlasÃ­cÃ­ verze"

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr "NeplatnÃ¡ verze kanÃ¡lu"

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr "Pro kanÃ¡l nenÃ­ k dispozici Å¾Ã¡dnÃ½ soubor comps"

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr "Nelze naÄÃ­st soubor comps"

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr "ChybÃ­ akce konfigurace"

#: ../common/rhnException.py:230
msgid "File too large"
msgstr "PÅ™Ã­liÅ¡ velkÃ½ soubor"

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr "Soubor obsahuje binÃ¡rnÃ­ data"

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr "KonfiguraÄnÃ­ kanÃ¡l nenÃ­ prÃ¡zdnÃ½"

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr "Chyba oprÃ¡vnÄ›nÃ­"

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr "ChybÃ­ obsah konfiguraÄnÃ­ho souboru"

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr "OddÄ›lovaÄe Å¡ablon nejsou zadÃ¡ny"

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr "KonfiguraÄnÃ­ kanÃ¡l neexistuje"

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr "KonfiguraÄnÃ­ kanÃ¡l jiÅ¾ existuje"

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr "Soubor z konfiguraÄnÃ­ho kanÃ¡lu chybÃ­"

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr "Je nahrÃ¡na jinÃ¡ revize tohoto souboru"

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr "Soubor jiÅ¾ byl nahrÃ¡n na konfiguraÄnÃ­ kanÃ¡l"

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr "Velikost souboru pÅ™ekraÄuje zbÃ½vajÃ­cÃ­ prostor kvÃ³ty"

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr "MusÃ­ bÃ½t zadÃ¡na ÃºplnÃ¡ cesta k souboru"

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr "NeplatnÃ© ÄÃ­slo revize"

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr "Nelze porovnat soubory rÅ¯znÃ½ch typÅ¯"

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr "Ãšdaje o havÃ¡rii jsou neplatnÃ© nebo neÃºplnÃ©"

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr "Ãšdaje souboru o havÃ¡rii jsou neplatnÃ© nebo neÃºplnÃ©"

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr "Chyba pÅ™i vytvÃ¡Å™enÃ­ cesty k adresÃ¡Å™i havÃ¡rie"

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr "Chyba pÅ™i vytvÃ¡Å™enÃ­ cesty k souboru havÃ¡rie"

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr "NeplatnÃ© kÃ³dovÃ¡nÃ­ obsahu"

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr "NeplatnÃ½ nÃ¡zev havÃ¡rie"

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr "HlÃ¡Å¡enÃ­ havÃ¡riÃ­ je pro tuto organizaci zakÃ¡zÃ¡no"

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr "PÅ™enos souboru vÃ½sledkÅ¯ SCAP je neplatnÃ½ nebo neÃºplnÃ½"

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr "Chyba pÅ™i vytvÃ¡Å™enÃ­ cesty k adresÃ¡Å™i pro podrobnÃ© vÃ½sledky SCAP"

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr "Chyba pÅ™i vytvÃ¡Å™enÃ­ cesty souboru pro podrobnÃ© vÃ½sledky SCAP"

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""
"\n"
"     PÅ™i zpracovÃ¡nÃ­ vaÅ¡eho poÅ¾adavku doÅ¡lo k chybÄ›. PÅ™etrvÃ¡vÃ¡-li tento\n"
"     problÃ©m, ohlaste prosÃ­m chybu na scc.suse.com.\n"
"     Rozhodnete-li se odeslat zprÃ¡vu o chybÄ›, nezapomeÅˆte pÅ™ipojit\n"
"     podrobnosti o tom, co jste se pokusili udÄ›lat, kdyÅ¾ doÅ¡lo k tÃ©to chybÄ›\n"
"     a postup, jak tento problÃ©m reprodukovat.\n"

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""
"ChybovÃ© hlÃ¡Å¡enÃ­:\n"
"    %s\n"

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr "KÃ³d tÅ™Ã­dy chyby: %s\n"

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr "Informace o tÅ™Ã­dÄ› chyb: %s\n"

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr "VysvÄ›tlenÃ­: %s"

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr "CHYBA: %s %s: %s"

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr "TRACE-BACK: %s"

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr "formÃ¡t %s by mÄ›l bÃ½t alespoÅˆ RRRRMMDD.\n"

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""
"\n"
"CHYBA: pÅ™i provedenÃ­ kroku %s. Chyba je:\n"
"%s\n"

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""
"\n"
"CHYBA: doÅ¡lo k problÃ©mu s pÅ™Ã­stupem k datÅ¯m kanÃ¡lu z vaÅ¡eho doÄasnÃ©ho\n"
"       ÃºloÅ¾iÅ¡tÄ›. PÅ™enesli jste vÅ¡echna data z ISO kanÃ¡lÅ¯ do tohoto "
"adresÃ¡Å™e?\n"
"       KdyÅ¾ ano, znovu zkontrolujte kanÃ¡ly ISO, zajistÄ›te, aby byly "
"vÅ¡echny,\n"
"       a pak iterativnÄ› znovu pÅ™ipojte a znovu naplÅˆte doÄasnÃ© ÃºloÅ¾iÅ¡tÄ› "
"(%s).\n"

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""
"\n"
"CHYBA: PÅ™i synchronizaci informacÃ­ doÅ¡lo k potÃ­Å¾Ã­m.\n"
"       ChybovÃ¡ zprÃ¡va: %s\n"

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""
"\n"
"CHYBA: PÅ™i komunikaci s ISS Master doÅ¡lo k potÃ­Å¾Ã­m.\n"
"       V zÃ¡vislosti na konkrÃ©tnÃ­ch podrobnostech o chybÄ› ovÄ›Å™te "
"konfiguraci,\n"
"       zÃ¡kladnÃ­ sÃ­Å¥ovÃ© pÅ™ipojenÃ­ a/nebo pÅ™eklad nÃ¡zvÅ¯ (DNS) a akci "
"opakujte.\n"
"       ChybovÃ¡ zprÃ¡va: %s\n"

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""
"\n"
"CHYBA: PÅ™i komunikaci s ISS Master doÅ¡lo k potÃ­Å¾Ã­m.\n"
"       Pokud je Master Satellite starÅ¡Ã­ neÅ¾ v5.3, nemÃ¡ schopnost ISS.\n"
"       V opaÄnÃ©m pÅ™Ã­padÄ› zkontrolujte konkrÃ©tnÃ­ podrobnosti o chybÄ›,\n"
"       ovÄ›Å™te sprÃ¡vnost svÃ© konfigurace, zÃ¡kladnÃ­ pÅ™ipojenÃ­ k sÃ­ti nebo\n"
"       pÅ™eklad nÃ¡zvÅ¯ (DNS) a akci opakujte.\n"
"       ChybovÃ¡ zprÃ¡va: %s\n"

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""
"\n"
"CHYBA: podÅ™Ã­zenÃ½ kanÃ¡l nelze synchronizovat, aniÅ¾ je jeho rodiÄ takÃ© "
"synchronizovÃ¡n.\n"
"       RodiÄ musÃ­ bÃ½t (a) synchronizovÃ¡n pÅ™edem nebo (b) synchronizovÃ¡n\n"
"       spoleÄnÄ› s poÅ¾adovanÃ½m podÅ™Ã­zenÃ½m kanÃ¡lem. ChybÄ›jÃ­cÃ­ rodiÄe pro tuto\n"
"       transakci:\n"
"       %s\n"

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""
"\n"
"CHYBA: nemÃ¡te prÃ¡vo synchronizovat kanÃ¡l v tÃ©to sadÄ› kanÃ¡lÅ¯.\n"
"ObraÅ¥te se prosÃ­m na svÅ¯j kontakt u SUSE Manager\n"
"%s"

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr "  CHYBA: na zaÅ™Ã­zenÃ­ nenÃ­ dostatek volnÃ©ho mÃ­sta (%s KB)."

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr "    %3d/%s ÃºspÄ›Å¡nÃ© naÄtenÃ­: %s (%s bajtÅ¯)"

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr "    ZaniklÃ½ balÃ­Äek:  %s"

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr "   CelkovÃ¡ velikost: %s"

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr "      StaÅ¾eno %s z %s. OdhadovanÃ½ zbÃ½vajÃ­cÃ­ Äas: %s"

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr "    NaÄtenÃ­ neÃºspÄ›Å¡nÃ©: %s"

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr "   Souhrn naÄtenÃ­ RPM: %s"

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr "       ÃºspÄ›ch: %d"

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr "       neÃºspÄ›ch:  %d"

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr "       zaniklo: %d"

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr "   NaÄÃ­tÃ¡nÃ­ / analÃ½za *relevantnÃ­ch* metadat balÃ­Äku: %s (%s)"

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr "   NaÄÃ­tÃ¡nÃ­ / analÃ½za dat chyb (errata): %s (%s)"

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr "   NaÄÃ­tÃ¡nÃ­ / analÃ½za dat kickstartu: %s (%s)"

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr "   NaÄÃ­tÃ¡nÃ­ / analÃ½za souborÅ¯ stromu kickstartu: %s (%s)"

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr "   Import *relevantnÃ­ch* metadat balÃ­ÄkÅ¯: %s (%s)"

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr "   * VÃSTRAHA: Toto mÅ¯Å¾e bÃ½t pomalÃ½ proces."

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr "PropojenÃ­ balÃ­ÄkÅ¯ ke kanÃ¡lÅ¯m"

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr "   Import *relevantnÃ­ch* errat: %s (%s)"

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr "   Å½Ã¡dnÃ½ novÃ½ spustitelnÃ½ strom k importu"

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr "Import spustitelnÃ½ch stromÅ¯ (%d)"

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr "ImportovanÃ© startovatelnÃ© stromy (%d)"

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr "+++ odesÃ­lÃ¡nÃ­ protokolu jako e-mailu +++"

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr "%s synchronizaÄnÃ­ zprÃ¡va od %s"

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr "+++ vyÅ¾adovÃ¡n e-mail, ale nenÃ­ nic k odeslÃ¡nÃ­ +++"

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""
"\"%s\" (uvedeno v pÅ™Ã­kazovÃ©m Å™Ã¡dku)\n"
"nelze otevÅ™Ã­t a pÅ™eÄÃ­st:\n"
"%s"

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""
"\"%sâ€œ nelze otevÅ™Ã­t a/nebo\n"
"do nÄ›j zapisovat:\n"
"%s"

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr "Å½Ã¡dnÃ½ obsluÅ¾nÃ½ program pro krok %s"

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr "ProstÅ™edÃ­ se zmÄ›nilo, novÃ½ pokus..."

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr "CHYBA: DoÅ¡lo k chybÄ› integrity: \n"

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr "OpakovanÃ© zÃ¡vady"

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""
"    Import dokonÄen:\n"
"        ZahÃ¡jeno:  %s\n"
"        UkonÄeno: %s\n"
"        Uplynulo:   %s\n"
"          "

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr "hodin"

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr "minut"

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr "vteÅ™in"

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""
"CHYBA: Na vÃ½pisu chybÃ­ data balÃ­Äku; pouÅ¾ijte --no-rpms k pÅ™eskoÄenÃ­ tohoto "
"kroku nebo opravte obsah tak, aby obsahoval data balÃ­Äku."

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr "HlavnÃ­ server SUSE Manager nepodporuje synchronizaci dat organizacÃ­."

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr "PÅ™eskakuji..."

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr "ZprÃ¡va o synchronizaci SUSE Manager Inter Server z %s"

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr " - synchronizace systÃ©mu souborÅ¯"

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr " - Å¾ivÃ¡ synchronizace"

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""
"CHYBA: Synchronizace Å¾ivÃ©ho obsahu s RHN Classic Hosted jiÅ¾ nenÃ­ "
"podporovÃ¡na.\n"
"PouÅ¾ijte pÅ™Ã­kaz cdn-sync, nepokouÅ¡Ã­te-li se synchronizovat z jinÃ©ho "
"{PRODUCT_NAME} pÅ™es Inter-Server-Sync (ISS), nebo z mÃ­stnÃ­ho obsahu na disku "
"pomocÃ­ obrazÅ¯ ISO z vÃ½pisu kanÃ¡lu (Channel Dump)."

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr "   url: %s"

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr "   ÃºroveÅˆ ladÄ›nÃ­/vÃ½stupu: %s"

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr "CHYBA: tento server musÃ­ bÃ½t zaregistrovÃ¡n u SUSE Manager."

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr "NaÄÃ­tÃ¡nÃ­/analÃ½za dat %s"

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr "*** VYVOLÃNO SYSTÃ‰MOVÃ‰ PÅ˜ERUÅ ENÃ ***"

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr "CHYBA: doÅ¡lo k fatÃ¡lnÃ­ vÃ½jimce analyzÃ¡toru "

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr "(Å™Ã¡dek: %s, sloupec: %s zprÃ¡va: %s)"

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr "CHYBA: doÅ¡lo k vÃ½jimce analyzÃ¡toru: %s"

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr "CHYBA: doÅ¡lo k vÃ½jimce (bÄ›hem analÃ½zy): "

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""
"   DoÅ¡lo k nÄ›kterÃ½m chybÃ¡m s daty %s (dalÅ¡Ã­ informace viz protokoly %s)"

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr "   DoÅ¡lo k nÄ›kolika chybÃ¡m s Ãºdaji %s:"

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr "   ------- CHYBA ANALÃZY/IMPORTU %s -------"

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr "   ---------------------------------------"

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr "%s dat dokonÄeno"

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr "NaÄÃ­tÃ¡nÃ­ / analÃ½za dat kanÃ¡lu"

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr "Data kanÃ¡lu dokonÄena"

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr "%10s import z %s"

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr "%10s import z %s - %s"

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr "%10s"

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr "p"

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr "."

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr "   p = dÅ™Ã­ve importovanÃ½ / synchronizovanÃ½ kanÃ¡l"

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr "   . = kanÃ¡l dosud nenÃ­ importovÃ¡n/synchronizovÃ¡n"

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr "   e = kanÃ¡l jiÅ¾ nenÃ­ podporovÃ¡n (ukonÄenÃ­ sluÅ¾by)"

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr "   ? = oznaÄenÃ­ kanÃ¡lu je neplatnÃ© --- pÅ™eklep?"

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr "   %s:"

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr "      %s %-40s %4s %s"

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr "zÃ¡kladnÃ­-kanÃ¡ly"

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr "Å½ÃDNÃ RELEVANTNÃ"

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr "ukonÄenÃ­-sluÅ¾by"

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr "e"

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr "   pÅ™eklepy:"

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr "?"

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr "XXX: importovanÃ© kanÃ¡ly: %s"

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr "XXX: kanÃ¡ly v mezipamÄ›ti (keÅ¡i): %s"

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr "XXX: seznam volanÃ½ch kanÃ¡lÅ¯"

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr "CHYBA: tyto kanÃ¡ly neexistujÃ­, nebo nejsou dostupnÃ©:"

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr "       (zobrazenÃ­ seznamu oznaÄenÃ­ kanÃ¡lÅ¯: %s --list-channels)"

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr "   NaÄÃ­tÃ¡nÃ­ / analÃ½za metadat krÃ¡tkÃ½ch balÃ­ÄkÅ¯: %s (%s)"

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr "SrovnÃ¡nÃ­ metadat balÃ­ÄkÅ¯ (co lokÃ¡lnÄ› chybÃ­?): %s"

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr "SrovnÃ¡vÃ¡nÃ­:    "

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr "CHYBA: vynechÃ¡n pÅ™Ã­rÅ¯stkovÃ½ vÃ½pis"

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr "StahovÃ¡nÃ­ balÃ­ÄkÅ¯ rpm"

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr "   NaÄÃ­tÃ¡nÃ­ chybÄ›jÃ­cÃ­ch RPM: %s (%s)"

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr "NECHYBÃ Å½ÃDNÃ"

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr "ZpracovÃ¡nÃ­ balÃ­ÄkÅ¯ rpm bylo dokonÄeno"

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr "StahovÃ¡nÃ­ metadat balÃ­Äku"

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr "StahovÃ¡nÃ­ balÃ­ÄkÅ¯ srpm"

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr "   NaÄÃ­tÃ¡nÃ­ chybÄ›jÃ­cÃ­ch SRPM: %s (%s)"

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr "SrovnÃ¡nÃ­ metadat zdrojovÃ½ch balÃ­ÄkÅ¯ (co lokÃ¡lnÄ› chybÃ­?): %s"

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr "StahovÃ¡nÃ­ metadat zdrojovÃ©ho balÃ­Äku"

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr "Nelze uloÅ¾it soubor %s: %s"

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr "NaÄtenÃ­ souboru %s se nezdaÅ™ilo"

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr "StahovÃ¡nÃ­ metadat startovatelnÃ½ch stromÅ¯"

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr "StahovÃ¡nÃ­ souborÅ¯ startovatelnÃ½ch stromÅ¯"

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr "ZÃ­skÃ¡nÃ­ vÅ¡ech zÃ¡plat pro kanÃ¡l %s"

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr "StahovÃ¡nÃ­ dat zÃ¡platy"

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr "Vynucuji staÅ¾enÃ­ vÅ¡ech dat zÃ¡plat pro poÅ¾adovanÃ© kanÃ¡ly."

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr "StahovÃ¡nÃ­ dat zÃ¡platy dokonÄeno"

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr "Stahuji:"

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr " - dokonÄeno"

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr "Import metadat zdrojovÃ©ho balÃ­Äku"

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr "Import metadat balÃ­Äku"

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr "Importuji:  "

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""
"BalÃ­Äek nebyl v mezipamÄ›ti (keÅ¡i) nalezen; vymaÅ¾te mezipamÄ›Å¥ "
"do                                  Regenerujte ji."

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr "Import zÃ¡plat kanÃ¡lu"

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr "Importuje se %s zÃ¡plat pro kanÃ¡l %s."

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr "CHYBA: v konfiguraÄnÃ­m souboru nenÃ­ nastaven server.mount_point"

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr "CHYBA: server.mount_point %s neexistuje"

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr "CHYBA: cesta podle nastavenÃ­ server.mount_point (%s) neexistuje"

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr "PÅ™Ã­kazovÃ½ Å™Ã¡dek: %s"

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""
"POUZE DEBUG: max. velikost dÃ¡vky pro zpracovÃ¡nÃ­ importu XML/databÃ¡ze (1 .."
"%s). DalÅ¡Ã­ informace: \"man satellite-sync\"."

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr "alternativnÃ­ certifikÃ¡t SSL CA (ÃºplnÃ¡ cesta k souboru certifikÃ¡tu)"

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr "zpracovÃ¡vat data jen pro tento kanÃ¡l"

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""
"vÃ½pis disku bude povaÅ¾ovÃ¡n za ÃºplnÃ½ export; dalÅ¡Ã­ informace viz \"man "
"satellite-syncâ€œ."

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""
"stÃ¡vajÃ­cÃ­ vlastnÃ­ kanÃ¡ly budou takÃ© synchronizovÃ¡ny (nenÃ­-li pouÅ¾it parametr "
"-c)"

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""
"pÅ™epsat ÃºroveÅˆ ladÄ›nÃ­ zadanou v /etc/rhn/rhn.conf (aktuÃ¡lnÄ› nastavena na %s)."

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr "poÅ¾adovanÃ¡ verze vÃ½pisu XML (vÃ½chozÃ­: %s)"

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr "poÅ¡lete e-mailem zprÃ¡vu o tom, co bylo synchronizovÃ¡no/importovÃ¡no"

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr "nucenÄ› zpracovat vÅ¡echna (nejen odliÅ¡nÃ¡) metadata zÃ¡plat"

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr "Za Å¾Ã¡dnÃ½ch okolnostÃ­ nepouÅ¾Ã­vejte http proxy."

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr "alternativnÃ­ http proxy (nÃ¡zev_poÄÃ­taÄe_v_sÃ­ti: port)"

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr "alternativnÃ­ uÅ¾ivatelskÃ© jmÃ©no pro http proxy"

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr "alternativnÃ­ heslo pro http proxy"

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr "nadÅ™Ã­zenÃ½ SUSE Manager, z nÄ›hoÅ¾ chcete importovat obsah"

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr "vÃ½pis vÅ¡ech dostupnÃ½ch kanÃ¡lÅ¯ a ukonÄenÃ­"

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr "nÃ¡povÄ›da ke vÅ¡em kÃ³dÅ¯m chyb kterÃ© vracÃ­ mgr-inter-sync"

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr "zdrojovÃ½ bod pÅ™ipojenÃ­ pro import - jen aktualizace disku"

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr "nezpracovÃ¡vat data zÃ¡plat"

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr "nezpracovÃ¡vat data kickstartu (jen uklÃ¡dÃ¡nÃ­)"

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr "nezpracovÃ¡vat ÃºplnÃ¡ metadata balÃ­Äku"

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr "nestahovat ani nezpracovÃ¡vat Å¾Ã¡dnÃ© balÃ­Äky RPM"

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr "vypnout SSL (nedoporuÄuje se)"

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""
"organizace, do nÃ­Å¾ synchronizace importuje data; vÃ½chozÃ­ nastavenÃ­ je ÃºÄet "
"sprÃ¡vce"

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr "vytisknout konfiguraci a skonÄit"

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr "alternativnÃ­ server, kam se chcete pÅ™ipojit (nÃ¡zev v sÃ­ti, hostname)"

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""
"synchronizovat s tÃ­mto krokem (vÃ­ce informacÃ­ poskytne pÅ™Ã­kaz \"man "
"satellite-sync\")"

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""
"pÅ™ed streamovÃ¡nÃ­m do zbytku aplikace zapiÅ¡te ÃºplnÃ¡ data do doÄasnÃ©ho souboru"

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr "POUZE DEBUG: alternativnÃ­ cesta k ID digitÃ¡lnÃ­ho systÃ©mu"

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""
"alternativnÃ­ e-mailovÃ© adresa(-y) pro vÃ½stup synchronizace (volba --email)"

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr "pÅ™i importu z lokÃ¡lnÃ­ho vÃ½pisu neodstraÅˆujte rpms"

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""
"plnÄ› kvalifikovanÃ½ domÃ©novÃ½ nÃ¡zev serveru Master Satellite. PlatÃ­ pouze s --"
"mount-point. VyÅ¾adovÃ¡n, chcete-li importovat data organizace a oprÃ¡vnÄ›nÃ­ "
"kanÃ¡lu."

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""
"CHYBA: tyto argumenty nedÃ¡vajÃ­ v tomto kontextu Å¾Ã¡dnÃ½ smysl (zkuste --help): "
"%s"

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr "CHYBA: Nelze se pÅ™ipojit k databÃ¡zi: %s"

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr "CHYBA: ProvÄ›Å™te, zda VaÅ¡e databÃ¡ze bÄ›Å¾Ã­."

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr "CHYBA: --debug-level mÅ¯Å¾e mÃ­t jen celoÄÃ­selnou hodnotu v rozsahu %s."

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr "  0  - nÃ­zkÃ¡ ÃºroveÅˆ zaznamenÃ¡vÃ¡nÃ­/odesÃ­lÃ¡nÃ­ zprÃ¡v."

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr "  1  - minimÃ¡lnÃ­ ÃºroveÅˆ zaznamenÃ¡vÃ¡nÃ­/odesÃ­lÃ¡nÃ­ zprÃ¡v."

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr "  2  - normÃ¡lnÃ­ ÃºroveÅˆ zaznamenÃ¡vÃ¡nÃ­/odesÃ­lÃ¡nÃ­ zprÃ¡v."

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr "  3  - vysokÃ¡ ÃºroveÅˆ zaznamenÃ¡vÃ¡nÃ­/odesÃ­lÃ¡nÃ­ zprÃ¡v."

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr "  4+ - nadmÄ›rnÃ¡ ÃºroveÅˆ zaznamenÃ¡vÃ¡nÃ­/odesÃ­lÃ¡nÃ­ zprÃ¡v."

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr "CHYBA: MoÅ¾nost --master je platnÃ¡ pouze s volbou --mount-point"

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr "CHYBA: Nelze vyhledat ID organizace %s"

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""
"UPOZORNÄšNÃ: Volba --list-channels pÅ™epÃ­Å¡e jakoukoli volbu --step. Volba --"
"step ignorovÃ¡na."

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""
"CHYBA: '%s' nenÃ­ platnÃ½ krok. DalÅ¡Ã­ podrobnosti viz 'man mgr-inter-sync'."

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""
"CHYBA: MomentÃ¡lnÄ› nejsou importovÃ¡ny Å¾Ã¡dnÃ© kanÃ¡ly; zkuste mgr-inter-sync --"
"list-kanÃ¡ly; pak mgr-inter-sync -c chn0 -c chn1 ..."

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr "CHYBA: - velikost dÃ¡vky musÃ­ mÃ­t hodnotu v rozsahu: 1..50"

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr "CHYBA: adresÃ¡Å™ %s neexistuje"

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr "ChybovÃ© kÃ³dy: VrÃ¡cenÃ© kÃ³dy znamenajÃ­:"

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr " -1  - Nelze zamknout soubor nebo KeyboardInterrupt nebo SystemExit"

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr "  0  - UÅ¾ivatel pÅ™eruÅ¡en nebo zÃ¡mÄ›rnÄ› ukonÄen"

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr "  1  - pokus spustit vÃ­ce neÅ¾ jednu instanci mgr-inter-sync."

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr "  2  - Nelze najÃ­t synchronizaÄnÃ­ nÃ¡stroje."

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr "  3  - doÅ¡lo k obecnÃ© vÃ½jimce soketu"

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr "  4  - doÅ¡lo k chybÄ› SSL. Zkontrolujte nastavenÃ­ SSL."

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr "  5  - chyba ISS"

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr "  6  - doÅ¡lo k neoÅ¡etÅ™enÃ© vÃ½jimce"

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr "  7  - neznÃ¡mÃ¡ chyba synchronizace"

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr "  8  - CHYBA: pro spuÅ¡tÄ›nÃ­ musÃ­te bÃ½t root"

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr "  9  - chyba rpclib bÄ›hem zahÃ¡jenÃ­ synchronizace"

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr "  10 - chyba zahÃ¡jenÃ­ synchronizace"

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr "  11 - Chyba pÅ™i analÃ½ze toku XML"

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr "  12 - KanÃ¡l neexistuje"

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr "  13 - Chyba SQL pÅ™i importu metadat balÃ­Äku"

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr "  14 - Chyba SQL pÅ™i spojovÃ¡nÃ­ balÃ­ÄkÅ¯ kanÃ¡lÅ¯"

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr "  15 - Chyba SQL bÄ›hem zpracovÃ¡nÃ­ xml"

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr "  16 - server.mount_point nenÃ­ v konfiguraÄnÃ­m souboru nastaven"

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""
"  17 - Chyba SQL pÅ™i naÄÃ­tÃ¡nÃ­ kanÃ¡lÅ¯ jiÅ¾ importovanÃ½ch v databÃ¡zi SUSE "
"Manager"

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr "  18 - ChybnÃ½ pÅ™ipojovacÃ­ Å™etÄ›zec db v rhn.conf"

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr "  19 - Å patnÃ© argumenty"

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr "  20 - Nelze se pÅ™ipojit k databÃ¡zi."

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr "  21 - Å patnÃ¡ ÃºroveÅˆ ladÄ›nÃ­"

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr "  22 - NeplatnÃ½ krok"

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr "  24 - soubor neexistuje"

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr "  25 - adresÃ¡Å™ neexistuje"

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr "  26 - bod pÅ™ipojenÃ­ (mount_point) neexistuje"

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr "  27 - Organizace neexistuje"

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr "  28 - chyba: --master je platnÃ½ pouze s --mount-point"

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr "CHYBA: neznÃ¡mÃ¡ verze vÃ½pisu, zkuste jeden z %s"

#~ msgid "Your system was not found in the RHN database"
#~ msgstr "VÃ¡Å¡ systÃ©m nebyl v databÃ¡zi RHN nalezen"

#~ msgid "ISS is disabled on this satellite."
#~ msgstr "ISS je na tomto satelitu deaktivovÃ¡na."

#~ msgid "Spacewalk Proxy service not enabled for server profile: \"%s\""
#~ msgstr "Profil \"%s\" nemÃ¡ aktivovÃ¡nu sluÅ¾bu Spacewalk Proxy"

#~ msgid "Red Hat Satellite Welcome Message"
#~ msgstr "UvÃ­tacÃ­ zprÃ¡va Red Hat Satellite"

#~ msgid "Red Hat Satellite Privacy Statement"
#~ msgstr "Red Hat Satellite prohlÃ¡Å¡enÃ­ o soukromÃ­"
 07070100000064000081B40000000000000000000000015FBBE8EE0000B685000000000000000000000000000000000000001B00000000spacewalk-backend/po/da.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Christian Rose <menthos@menthos.com>, 2002.
# Keld Simonsen <keld@dkuug.dk>, 2002, 2003, 2004, 2005.
# Keld Simonsen <keld@rap.dk>, 2005.
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
"Language: da\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
   07070100000065000081B40000000000000000000000015FBBE8EE0000DA30000000000000000000000000000000000000001B00000000spacewalk-backend/po/de.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Bernd Groh <bgroh@redhat.com>, 2003.
# Gerd Koenig <koenig.ulm@googlemail.com>, 2012.
# Miroslav SuchÃ½ <msuchy@redhat.com>, 2011.
# sknirT omiT <moc.tahder@sknirtt>, 2010.
# Timo Trinks <ttrinks@redhat.com>, 2006.
# Verena <vfuehrer@redhat.com>, 2004-2005.
# Jiri Dostal <jdostal@redhat.com>, 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2020-09-25 10:29+0000\n"
"Last-Translator: Michael Calmer <mc@suse.com>\n"
"Language-Team: German <https://l10n.opensuse.org/projects/uyuni/backend/de/"
">\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.6.1\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr "unvollstÃ¤ndige Kennung zur Proxyauthentisierung: %s"

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr "die gesendete Proxysignatur %s stimmt mit unserer (%s) nicht Ã¼berein"

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr "abgewiesene Proxyauthentisierung"

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr "UngÃ¼ltige Anfrage erhalten (%s)."

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""
"NACHFOLGEND EINE WICHTIGE NACHRICHT:\n"
"%s"

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr "UngÃ¼ltige URI %s"

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""
"\n"
"                   %s Benutzer wurde auf diesem Server deaktiviert.\n"
"                   Bitte kontaktieren Sie Ihren Org-Administrator fÃ¼r Hilfe."

#: ../server/handlers/applet/applet.py:78
#, fuzzy, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr "Ihr System wurde in der RHN Datenbank nicht gefunden"

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr "ISS ist auf diesem Server deaktiviert."

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr "Server \"%s\" nicht fÃ¼r ISS aktiviert."

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr "Paketname erwartet, nicht: %s"

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr "Paket erwartet, nicht: %s"

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""
"SUSE Manager Proxy Dienst ist nicht fÃ¼r das Server-Profil \"%s\" aktiviert"

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr "UngÃ¼ltiger SitzungsschlÃ¼ssel"

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr "Diese Server-ID existiert nicht mehr"

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr "UngÃ¼ltiger Aktionswerttyp %s (%s)"

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr "Aktion %s gehÃ¶rt nicht zu Server %s"

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr "Erforderliche Daten nicht vorhanden"

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr "Erforderliche Mitglieder fehlen"

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr "Versuch, ein System mit einem ungÃ¼ltigen Benutzernamen zu registrieren"

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr "UngÃ¼ltige System-Release-Version angefordert"

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""
"Kein gÃ¼ltiges Netzwerk Interface gefunden. Sowohl ipaddr als auch ip6addr "
"konnten nicht gefunden werden."

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
#, fuzzy
msgid "Privacy Statement"
msgstr "SUSE Manager DatenschutzerklÃ¤rung"

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr "Es wurde ein WÃ¶rterbuch als Produktargument erwartet"

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr "UngÃ¼ltiger Wert '%s' fÃ¼r %s (%s)"

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr "UngÃ¼ltiges system_id/action_id Paar."

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr "UngÃ¼ltiger Wert %s (%s)"

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr "Sie haben keine Berechtigungen, Pakete in der Null-Org zu verwalten"

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr "Sie dÃ¼rfen keine Pakete in der %s-Org verwalten"

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr "Sie dÃ¼rfen keine administrativen Aufgaben durchfÃ¼hren"

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""
"Sie dÃ¼rfen Channel %s nicht verwalten, oder dieser Channel existiert nicht"

#: ../server/importlib/userAuth.py:204
#, fuzzy, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""
"\n"
"                   %s Benutzer wurde auf diesem Server deaktiviert.\n"
"                   Bitte kontaktieren Sie Ihren Org-Administrator fÃ¼r Hilfe."

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr "UngenÃ¼gende Berechtigung fÃ¼r Release (%s, %s"

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr "System registriert, aber inaktiv"

#: ../server/rhnChannel.py:2277
#, fuzzy, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""
"\n"
"UngÃ¼ltige Kombination aus Architektur und Betriebssystemversion (%s, %s).\n"
"Ihr System wurde registriert, wird aber keine Updates erhalten, da es "
"keinen\n"
"Channel abonniert hat. Falls Sie Ihr System bislang nicht aktiviert haben,\n"
"besuchen Sie bitte unsere Webseite unter:\n"
"  \n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...um Ihr Produkt zu aktivieren."

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""
"\n"
"UngÃ¼ltige Kombination aus Architektur und Betriebssystemversion (%s, %s).\n"
"Ihr System wurde registriert, wird aber keine Updates erhalten da es keinen\n"
"Basis-Channel abonnieren konnte.\n"
"Bitte kontaktieren Sie zwecks UnterstÃ¼tzung den Org-Administrator.\n"

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr "Der Dienst ist fÃ¼r das Systemprofil: \"%s\" nicht aktiviert"

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr "ungÃ¼ltiges rpm Paket %s angefordert"

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr "Paket nicht gefunden"

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr "die Architektur '%s' wird nicht unterstÃ¼tzt"

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr "Kennung '%s' hat mehr als einen zugewiesenen Channel"

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr "Konflikt zwischen Basis-Channels"

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr "Fehler beim HinzufÃ¼gen des Servers zur Gruppe %s"

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr "Maximale Nutzung von %s erreicht"

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr "Konnte Token '%s' nicht finden"

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr "Tokens von nicht Ã¼bereinstimmenden Orgs"

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr "Kickstart-Sitzung stimmt nicht Ã¼berein"

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr "UngÃ¼ltige Kombination von Benutzername und Passwort"

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr "der Benutzername '%s' wurde nicht reserviert"

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr "die Emailadresse wurde nicht angegeben"

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr "der Benutzername muss mindestens %d Zeichen lang sein"

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr "der Benutzername darf hÃ¶chstens %d Zeichen lang sein"

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr "Benutzername = '%s', ungÃ¼ltiges Zeichen '%s'"

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr "Bitte beschrÃ¤nken Sie Ihre Emailadresse auf %s Zeichen"

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr "das Passwort muss mindestens %d Zeichen lang sein"

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr "Das Passwort darf hÃ¶chstens %d Zeichen lang sein"

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr "das Passwort enthÃ¤lt das Zeichen `%s'"

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr "der Benutzername muss mindestens %d Zeichen lang sein"

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr "Benutzernamen, die auf %s enden kÃ¶nnen nicht registriert werden"

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr "Dies scheint kein gÃ¼ltiger Benutzername zu sein."

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr "UngÃ¼ltige Kombination von Benutzername und Passwort"

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr "Dieses Login wird bereits verwendet oder das Passwort ist falsch."

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr "Zugriff verweigert."

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr "Objekt nicht gefunden."

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr "UngÃ¼ltige System Digital-ID."

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr "UngÃ¼ltige System-Berechtigungsnachweise."

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr "Benutzerdaten konnten nicht von Datenbank abrufen werden."

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr "GÃ¼ltiger Benutzername erforderlich."

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr "GÃ¼ltiges Passwort erforderlich."

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr "MinimallÃ¤nge des Benutzernamen nicht erfÃ¼llt."

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr "MinimallÃ¤nge des Passworts nicht erfÃ¼llt."

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr "Der Benutzername enthÃ¤lt ungÃ¼ltige Zeichen."

#: ../common/rhnException.py:66
msgid "File not found."
msgstr "Datei nicht gefunden."

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""
"Diese Kombination aus Architektur und OS Version wird nicht unterstÃ¼tzt."

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr "Systemdaten konnten in der Datenbank nicht gefunden werden."

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr "Der Funktion wurden ungÃ¼ltige Werte Ã¼bergeben."

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr "Eintrag konnte nicht abgerufen werden."

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr "Datenbankeintrag konnte nicht aktualisiert werden."

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr "Serverarchitektur wird nicht unterstÃ¼tzt."

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr "Kein Eintrag in der Datenbank."

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr "UngÃ¼ltiger Wert."

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr "Channel Fehler"

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr "Client Session Token ist ungÃ¼ltig."

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr "Client Session ist abgelaufen."

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr "Sie sind nicht berechtigt dieses Objekt abzurufen."

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr "UngÃ¼ltige Aktion"

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr "Sie sind fÃ¼r Administative TÃ¤tigkeiten nicht freigegeben."

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr "Dieses System ist bereits bei diesem Channel registriert."

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr "Dieses System ist bei diesem Channel nicht registriert."

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr "Der angegebene Channel existiert nicht."

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr "UngÃ¼ltige Channel-Version."

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
#, fuzzy
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""
"\n"
"     UngÃ¼ltige Architektur.\n"
"\n"
"     Die Architektur dieses Paketes ist vom Red Hat Network nicht "
"unterstÃ¼tzt\n"
"     "

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr "UngÃ¼ltiger RPM Header"

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr "Es wurden ungÃ¼ltige Informationen hochgeladen"

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr "Fehler beim Hochladen der Konfiguration der Netzwerk-Schnittstellen."

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""
"\n"
"     Hochladen des Paketes fehlgeschlagen. \n"
"     Bitte prÃ¼fen Sie ob das Paket keine doppelten AbhÃ¤ngigkeiten besitzt\n"
"      und nicht schon bereits auf dem Server vorhanden ist\n"
"     "

#: ../common/rhnException.py:134
#, fuzzy
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""
"\n"
"     Die Option --force fÃ¼r rhnpush wurde auf diesem Server deaktiviert. \n"
"     Bitte kontaktieren Sie den Satellite Administrator fÃ¼r Hilfestellung.\n"
"     "

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr "Zuviele Systeme sind dieser Registration zugeordnet"

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""
"Dieser Token enthÃ¤lt ungÃ¼ltige, obsolete oder nicht ausreichende "
"Einstellungen"

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr "Aktivierungs-Tokens mit Konflikten"

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr "Sie kÃ¶nnen sich von diesem Base-Channel nicht abmelden."

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr "Fehler beim HinzufÃ¼gen des Systems in die entsprechenden Gruppen"

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr "System kann nicht berechtigt werden"

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr "Maximale LÃ¤nge der Email Ã¼berschritten."

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr "Dieses System wurde bereits registriert."

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr "Benutzername ungÃ¼ltig"

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr "BenÃ¶tigte Angabe fehlt"

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr "Maximale LÃ¤nge des Benutzernamen Ã¼berschritten"

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr "Maximale PasswortlÃ¤nge Ã¼berschritten"

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
#, fuzzy
msgid "System Name cannot be less than 1 character"
msgstr "der Benutzername darf hÃ¶chstens %d Zeichen lang sein"

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
#, fuzzy
msgid "SUSE Manager Proxy error."
msgstr "RHN Proxy Fehler."

#: ../common/rhnException.py:191
#, fuzzy
msgid "SUSE Manager Proxy unable to login."
msgstr "Login zum RHN Proxy nicht mÃ¶glich."

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
#, fuzzy
msgid "SUSE Manager Proxy session token is invalid."
msgstr "RHN Proxy Session-Token ist ungÃ¼ltig."

#: ../common/rhnException.py:198
#, fuzzy
msgid "SUSE Manager Proxy session token has expired."
msgstr "RHN Proxy Session Token abgelaufen."

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
#, fuzzy
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""
"\n"
"     Diesem Satellite Server fehlt die Berechtigung fÃ¼r Inter Satellite Sync "
"auf diesem Satellite\n"
"     "

#: ../common/rhnException.py:209
#, fuzzy
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""
"\n"
"     Inter Satellite Sync ist auf diesem Satellite deaktiviert.\n"
"     "

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr "Es wurde ein ungÃ¼ltiger Datentyp Ã¼bergeben"

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr "Channels konnten nicht abgerufen werden"

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr "Pakete konnten nicht abgerufen werden"

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr "Erratum konnte nicht abgerufen werden"

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr "Datei nicht vorhanden"

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr "Es wurde keine Version angegeben"

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr "UngÃ¼ltige Version"

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr "Versionen stimmen nicht Ã¼berein"

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr "UngÃ¼ltige Channel-Version"

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr "Keine Chomps-Datei fÃ¼r dem Channel"

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr "Comps-Datei kann nicht abgerufen werden."

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr "Datei zu gross"

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr "Datei enthÃ¤lt binÃ¤re Daten"

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr "Konfigurations-Channel enthÃ¤lt Daten"

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr "Zugriff nicht erlaubt"

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr "Kein Inhalt fÃ¼r Konfigurationsdatei"

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr "Die Template Trennzeichen sind nicht spezifiziert"

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr "Konfigurations-Channel existiert nicht"

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr "Konfigrations-Channel bereits vorhanden"

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr "Die Datei aus dem Konfigurationskanal fehlt"

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr "Eine andere Version dieser Datei wurde breits hochgeladen"

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr "Datei wurde breits in den Konfigations-Channel hochgeladen"

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr "Die DateigrÃ¶ÃŸe Ã¼berschreitet die verbleibende Quota (Speicherplatz)"

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr "Der vollstÃ¤ndige Datei-Pfad muss angegeben werden"

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr "UngÃ¼ltige Revisionsnummer"

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""
"Ein Vergeich zwischen verschiedenen Datei-Typen kann nicht erstellt werden"

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
#, fuzzy
msgid "Invalid content encoding"
msgstr "UngÃ¼ltiger Feldcode"

#: ../common/rhnException.py:253
#, fuzzy
msgid "Invalid crash name"
msgstr "UngÃ¼ltiger Paketname"

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
#, fuzzy
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""
"\n"
"     Bei der Bearbeitung Ihrer Anfrage trat ein Fehler auf. Falls dieses "
"Problem\n"
"     weiterhin auftritt, reichen Sie bitte einen Fehlerbericht unter "
"bugzilla.redhat.com ein.\n"
"     Falls Sie sich dazu entschlieÃŸen, einen Fehlerbericht einzureichen, "
"stellen Sie bitte sicher,\n"
"     dass Sie Details zu den von Ihnen durchgefÃ¼hrten Schritten liefern, als "
"dieser Fehler auftrat,\n"
"     sowie Informationen, wie dieses Problem reproduziert werden kann.\n"

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""
"Fehlermeldung:\n"
"    %s\n"

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr "Fehlerklasse-Code: %s\n"

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr "Fehlerklasse-Information: %s\n"

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr "ErklÃ¤rung: %s"

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, fuzzy, python-format
msgid "    Extinct package:  %s"
msgstr "Paket erwartet, nicht: %s"

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
#, fuzzy
msgid "Linking packages to channels"
msgstr "Konflikt zwischen Basis-Channels"

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
#, fuzzy
msgid "base-channels"
msgstr "Konflikt zwischen Basis-Channels"

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, fuzzy, python-format
msgid "Unable to save file %s: %s"
msgstr "System kann nicht berechtigt werden"

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
#, fuzzy
msgid "print the configuration and exit"
msgstr "Konfigurations-Channel existiert nicht"

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
#, fuzzy
msgid "  12 - Channel do not exist"
msgstr "Der angegebene Channel existiert nicht."

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""

#~ msgid "Your system was not found in the RHN database"
#~ msgstr "Ihr System wurde in der RHN Datenbank nicht gefunden"

#~ msgid "ISS is disabled on this satellite."
#~ msgstr "ISS ist auf diesem Satellite deaktiviert."

#~ msgid "Spacewalk Proxy service not enabled for server profile: \"%s\""
#~ msgstr "Spacewalk-Proxy-Dienst nicht fÃ¼r Server-Profil \"%s\" aktiviert"

#~ msgid "Red Hat Satellite Welcome Message"
#~ msgstr "Red Hat Network Willkommensmitteilung"

#~ msgid "Red Hat Satellite Privacy Statement"
#~ msgstr "SUSE Manager DatenschutzerklÃ¤rung"
07070100000066000081B40000000000000000000000015FBBE8EE0000B5F0000000000000000000000000000000000000001E00000000spacewalk-backend/po/de_CH.po # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: de_CH\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
07070100000067000081B40000000000000000000000015FBBE8EE0000B63E000000000000000000000000000000000000001B00000000spacewalk-backend/po/el.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Nikos Charonitakis <charosn@her.forthnet.gr>, 2002, 2004.
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Greek <trans-el@lists.fedoraproject.org>\n"
"Language: el\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
  07070100000068000081B40000000000000000000000015FBBE8EE0001155A000000000000000000000000000000000000001B00000000spacewalk-backend/po/en.po    # Red Hat Network.
# Copyright (c) 2000--2017 Red Hat, Inc.
# Cristian Gafton <gafton@redhat.com>, 2000, 2001.
#
msgid ""
msgstr ""
"Project-Id-Version: RHN 2.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2000-08-08 16:51-0400\n"
"Last-Translator: Cristian Gafton <gafton@redhat.com>\n"
"Language-Team: English <rhns-i18n@redhat.com>\n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr "Invalid system release version requested"

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
#, fuzzy
msgid "Privacy Statement"
msgstr ""
" We think our customers understand better than anyone else how Red\n"
" Hat can most effectively serve their needs.  Because of this, Red\n"
" Hat makes every effort to allow our customers to define the\n"
" relationship they will have with us.  We ask customers how they\n"
" would like Red Hat to communicate with them, if at all.  We disclose\n"
" how we will be using our customers' information through documents\n"
" like this one, or by answering individual questions customers may\n"
" ask.  Our policy is not to sell or provide to others our customers'\n"
" information without making it clear that we intend to do to in this\n"
" statement or at the time the information is collected.  Note that\n"
" when you purchase a product or service from us, we may need to\n"
" contact you to follow up on the product or service.  However, our\n"
" policy is not to contact you for anything unrelated to the product\n"
" or service unless you have \"opted in\" to such contact when you\n"
" signed up.  You should be aware that in certain circumstances, Red\n"
" Hat may be required to disclose information pursuant to applicable\n"
" law or government orders.\n"
" \n"
" Red Hat has self-certified as adhering to the European Union \"safe\n"
" harbor\" principles with the United States Department of Commerce,\n"
" and has chosen to cooperate with the European Union Data Protection\n"
" Authorities for unresolved privacy complaints.  If you have any\n"
" questions or complaints regarding the use of your personal\n"
" information, please contact feedback@redhat.com.\n"
" \n"
" Below you will find a detailed account of Red Hat's privacy\n"
" practices.  If you have any questions about any of these practices\n"
" or Red Hat's use of your personal information, please feel free to\n"
" contact us at feedback@redhat.com.\n"
" \n"
" \n"
" Information Collected Online\n"
" \n"
" Our website sometimes requires you to give us personal information\n"
" when you do things like purchase products in our Web store or\n"
" register your products with redhat.com.  Red Hat uses your personal\n"
" information only for marketing, customer service, delivery of\n"
" products, aftercare service and related activities thereof.  In\n"
" situations such as these, you will be given a choice as to whether\n"
" you would like Red Hat or our business partners to contact you in\n"
" the future.  This is an \"opt-in\" process.  If you opt-in, we rely on\n"
" your consent to send you information, special offers, and\n"
" promotional materials.  In many cases, you may choose whether you\n"
" would like to be contacted via mail, email, phone, or not at all.\n"
" We will only contact you via the methods you choose.  An exception\n"
" will be made in the rare case that we find a significant issue with\n"
" a product or service that requires your immediate attention.  For\n"
" your protection, we may contact you via phone or email as the\n"
" situation warrants.\n"
" \n"
" Also, our website sometimes requires you to give us personal\n"
" information in order to do things like access webcasts, download\n"
" whitepapers, or participate in online surveys.  In situations like\n"
" these, where you are accessing free products and services from Red\n"
" Hat and/or our business partners, we recognize your interest in the\n"
" product or service and consider that  to be \"opting in\" to allow Red\n"
" Hat and appropriate business partners to contact you with\n"
" information, special offers, or promotional materials in the future.\n"
" Red Hat may transfer your personal information to or share it with\n"
" the business partner only for future marketing, development of new\n"
" products, customer service, delivery of products, aftercare service\n"
" and related activities thereof.  If you do not wish to be contacted,\n"
" we ask that you refrain from accessing these free products and\n"
" services offered to you by Red Hat and our partners.\n"
" \n"
" Red Hat trains its employees on our privacy policy guidelines and\n"
" makes our privacy policy available to our business partners. Also\n"
" our website uses Secure Socket Layer (SSL) which encrypts your\n"
" personal information when you send your personal information on our\n"
" website. In addition, Red Hat and its business partners enter into\n"
" confidentiality agreements which requires care and precautions be\n"
" taken to prevent loss, misuse, or disclosure of your personal\n"
" information.\n"
" \n"
" Out of special concern for children's privacy, we do not accept\n"
" personal information from children who are under the age of 13.\n"
" \n"
" \n"
" Information Collected On Red Hat Network\n"
" \n"
" If you register your system on Red Hat Network, you will be asked to\n"
" provide a system profile when you register. The system profile\n"
" consists of:\n"
" \n"
" 1) An inventory of the .rpm files installed on the system. This\n"
" information helps determine what new software updates may be\n"
" valuable to you in keeping your system secure and available.\n"
" \n"
" 2) An inventory of your system hardware. This information is also\n"
" used by Red Hat to determine what software and support information\n"
" might be useful to you.\n"
" \n"
" You can determine the information in your System Profile prior to\n"
" registering it on Red Hat Network by typing the following at the\n"
" command prompt:\n"
" \n"
" $rhn_register\n"
" \n"
" This command will start the registration program, and all of the\n"
" information contained in the system profile is presented to you for\n"
" review prior to submission to Red Hat.\n"
" \n"
" Once you have registered a system profile, you can browse and edit\n"
" your profile information from your Red Hat Network page.\n"
" \n"
" When requested by you with a command from Red Hat Network, certain\n"
" application configuration information about a particular system may\n"
" be provided to Red Hat and displayed to you in a Web page to assist\n"
" you in configuring your system. At your request, Red Hat may store\n"
" this information for a time to assist you in system recovery should\n"
" you make a mistake in the application configuration. In each case\n"
" where configuration information is stored by Red Hat, it will be at\n"
" your request and only for a period of time sufficient to confirm\n"
" acceptance of new configuration settings.\n"
" \n"
" Other than the System Profile and application configuration you\n"
" request as part of an online service, Red Hat will never retrieve or\n"
" store personal file information from your system as part of any Red\n"
" Hat service.\n"
" \n"
" \n"
" Information Collected in Other Ways\n"
" \n"
" We collect information in other ways, such as running contests on\n"
" our site and at trade shows, in which we ask you for contact\n"
" information (like your email address), unique identifiers (like your\n"
" password), and demographic information (like your occupation).  We\n"
" may use data from these contests and trade shows to contact you or\n"
" to allow appropriate business partners to contact you.  If you do\n"
" not wish to be contacted, we ask that you refrain from participating\n"
" in these promotions.\n"
" \n"
" \n"
" Cookies and Other Browser Information\n"
" \n"
" Our site automatically captures IP addresses.  We use IP addresses\n"
" to help diagnose problems with our server, to administer our\n"
" website, and to help ensure the security of your interaction with\n"
" the website.  Your IP address is used to help identify you and your\n"
" shopping cart.\n"
" \n"
" As part of offering and providing customizable and personalized\n"
" services, Red Hat uses cookies to store and sometimes track\n"
" information about you.  A cookie is a small amount of data that is\n"
" sent to your browser from a Web server and stored on your computer's\n"
" hard drive.  All sections of redhat.com where you are prompted to\n"
" log in or that are customizable require your browser to accept\n"
" cookies.  If you would like to know more about precisely how we use\n"
" cookies, click here.\n"
" \n"
" \n"
" Third Party and Aggregated Data\n"
" \n"
" Under confidentiality agreements, Red Hat may match user information\n"
" with third-party data.  Also, Red Hat discloses aggregated user\n"
" statistics in order to describe our services to current and\n"
" prospective partners and other third parties.  Red Hat has\n"
" agreements with some third parties to perform certain dedicated\n"
" tasks such as product fulfillment, payroll, credit card processing,\n"
" e-mail housing, and marketing, training, and customer service.  In\n"
" these situations, we share your information with these third parties\n"
" for the sole purpose of allowing them to perform these tasks.  Your\n"
" information is not used by the third party in any other way.\n"
" \n"
" \n"
" About Links to Other Sites\n"
" \n"
" This site contains links to other sites.  Red Hat does not control\n"
" the information collection of sites that can be reached through\n"
" links from redhat.com.  If you have questions about the data\n"
" collection procedures of linked sites, please contact those\n"
" companies directly.\n"
" \n"
" \n"
" Public Forums Reminder\n"
" \n"
" This site often makes chat rooms, forums, message boards, and/or\n"
" news groups available to its users.  Please remember that any\n"
" information that is disclosed in these areas becomes public\n"
" information.  Exercise caution when deciding to disclose your\n"
" personal information.  Although we value individual ideas and\n"
" encourage free expression, Red Hat reserves the right to take\n"
" necessary action to preserve the forum's integrity, such as removing\n"
" any posting that is vulgar or inappropriate.\n"
" \n"
" \n"
" Questions and Answers\n"
" \n"
" How Can I Opt Out?\n"
" Red Hat gives you the ability to opt out of receiving communications\n"
" from Red Hat and/or its partners if you choose.  When you register\n"
" or order a product or service, simply choose \"I do not wish to be\n"
" contacted\" underneath the Contact Method section.  If you decide\n"
" that you would like to opt out of communications at a later date,\n"
" you may log in to your account\n"
" (http://www.redhat.com/apps/user/login.html) and modify the Contact\n"
" Method section.  You may also simply unsubscribe to a specific email\n"
" communication by following the unsubscribe directions at the bottom\n"
" of the email or by contacting feedback@redhat.com and requesting\n"
" that you be unsubscribe from that specific communication.\n"
" \n"
" How Can I Modify or Update My Information?\n"
" Red Hat gives you the ability to modify or update your information.\n"
" Please log in and modify your information\n"
" (http://www.redhat.com/apps/user/login.html) or, if necessary,\n"
" contact us at feedback@redhat.com and describe the changes you want\n"
" made to the information you have previously provided.\n"
" \n"
" Red Hat reserves the right to change this policy from time to time.\n"
" If we do make changes, the revised Privacy Statement will be posted\n"
" on this site."

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
#, fuzzy
msgid "Invalid system_id/action_id pair."
msgstr "Invalid system release version requested"

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, fuzzy, python-format
msgid "Invalid RPM package %s requested"
msgstr "Invalid system release version requested"

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
#, fuzzy
msgid "Invalid System Digital ID."
msgstr "Invalid system release version requested"

#: ../common/rhnException.py:59
#, fuzzy
msgid "Invalid System Credentials."
msgstr "Invalid system release version requested"

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
#, fuzzy
msgid "Invalid revision number"
msgstr "Invalid system release version requested"

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
#, fuzzy
msgid "Invalid content encoding"
msgstr "Invalid system release version requested"

#: ../common/rhnException.py:253
#, fuzzy
msgid "Invalid crash name"
msgstr "Invalid system release version requested"

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""

#, fuzzy
#~ msgid "Red Hat Satellite Welcome Message"
#~ msgstr ""
#~ "Now for the first time ever, information, updates, and services\n"
#~ "that enhance the security and reliability of your Red Hat Linux\n"
#~ "systems are available to you in one place-- Red Hat Network.\n"
#~ "Check out these benefits:\n"
#~ "\n"
#~ "-- Red Hat Linux information, updates, and services specific to\n"
#~ "   your systems\n"
#~ "-- Fast access and proactive delivery of updates (security errata,\n"
#~ "   bug fixes, enhancements)\n"
#~ "-- The latest news from Red Hat when new products and services\n"
#~ "   are available\n"
#~ "\n"
#~ "Joining is easy-- just follow this three step process:\n"
#~ "\n"
#~ "Step 1: Review the Red Hat privacy policy\n"
#~ "Step 2: Register a user account with Red Hat.\n"
#~ "        a. This registration program can take care of that for you\n"
#~ "        b. You can also register an account by going to\n"
#~ "           https://rhn.redhat.com/newlogin.pxt\n"
#~ "Step 3: Register a system profile on Red Hat Network\n"
#~ "\n"
#~ "Click on the \"Next\" button to register now, or click \"Cancel\"\n"
#~ "to banish this program forever."

#, fuzzy
#~ msgid "Red Hat Satellite Privacy Statement"
#~ msgstr ""
#~ " We think our customers understand better than anyone else how Red\n"
#~ " Hat can most effectively serve their needs.  Because of this, Red\n"
#~ " Hat makes every effort to allow our customers to define the\n"
#~ " relationship they will have with us.  We ask customers how they\n"
#~ " would like Red Hat to communicate with them, if at all.  We disclose\n"
#~ " how we will be using our customers' information through documents\n"
#~ " like this one, or by answering individual questions customers may\n"
#~ " ask.  Our policy is not to sell or provide to others our customers'\n"
#~ " information without making it clear that we intend to do to in this\n"
#~ " statement or at the time the information is collected.  Note that\n"
#~ " when you purchase a product or service from us, we may need to\n"
#~ " contact you to follow up on the product or service.  However, our\n"
#~ " policy is not to contact you for anything unrelated to the product\n"
#~ " or service unless you have \"opted in\" to such contact when you\n"
#~ " signed up.  You should be aware that in certain circumstances, Red\n"
#~ " Hat may be required to disclose information pursuant to applicable\n"
#~ " law or government orders.\n"
#~ " \n"
#~ " Red Hat has self-certified as adhering to the European Union \"safe\n"
#~ " harbor\" principles with the United States Department of Commerce,\n"
#~ " and has chosen to cooperate with the European Union Data Protection\n"
#~ " Authorities for unresolved privacy complaints.  If you have any\n"
#~ " questions or complaints regarding the use of your personal\n"
#~ " information, please contact feedback@redhat.com.\n"
#~ " \n"
#~ " Below you will find a detailed account of Red Hat's privacy\n"
#~ " practices.  If you have any questions about any of these practices\n"
#~ " or Red Hat's use of your personal information, please feel free to\n"
#~ " contact us at feedback@redhat.com.\n"
#~ " \n"
#~ " \n"
#~ " Information Collected Online\n"
#~ " \n"
#~ " Our website sometimes requires you to give us personal information\n"
#~ " when you do things like purchase products in our Web store or\n"
#~ " register your products with redhat.com.  Red Hat uses your personal\n"
#~ " information only for marketing, customer service, delivery of\n"
#~ " products, aftercare service and related activities thereof.  In\n"
#~ " situations such as these, you will be given a choice as to whether\n"
#~ " you would like Red Hat or our business partners to contact you in\n"
#~ " the future.  This is an \"opt-in\" process.  If you opt-in, we rely on\n"
#~ " your consent to send you information, special offers, and\n"
#~ " promotional materials.  In many cases, you may choose whether you\n"
#~ " would like to be contacted via mail, email, phone, or not at all.\n"
#~ " We will only contact you via the methods you choose.  An exception\n"
#~ " will be made in the rare case that we find a significant issue with\n"
#~ " a product or service that requires your immediate attention.  For\n"
#~ " your protection, we may contact you via phone or email as the\n"
#~ " situation warrants.\n"
#~ " \n"
#~ " Also, our website sometimes requires you to give us personal\n"
#~ " information in order to do things like access webcasts, download\n"
#~ " whitepapers, or participate in online surveys.  In situations like\n"
#~ " these, where you are accessing free products and services from Red\n"
#~ " Hat and/or our business partners, we recognize your interest in the\n"
#~ " product or service and consider that  to be \"opting in\" to allow Red\n"
#~ " Hat and appropriate business partners to contact you with\n"
#~ " information, special offers, or promotional materials in the future.\n"
#~ " Red Hat may transfer your personal information to or share it with\n"
#~ " the business partner only for future marketing, development of new\n"
#~ " products, customer service, delivery of products, aftercare service\n"
#~ " and related activities thereof.  If you do not wish to be contacted,\n"
#~ " we ask that you refrain from accessing these free products and\n"
#~ " services offered to you by Red Hat and our partners.\n"
#~ " \n"
#~ " Red Hat trains its employees on our privacy policy guidelines and\n"
#~ " makes our privacy policy available to our business partners. Also\n"
#~ " our website uses Secure Socket Layer (SSL) which encrypts your\n"
#~ " personal information when you send your personal information on our\n"
#~ " website. In addition, Red Hat and its business partners enter into\n"
#~ " confidentiality agreements which requires care and precautions be\n"
#~ " taken to prevent loss, misuse, or disclosure of your personal\n"
#~ " information.\n"
#~ " \n"
#~ " Out of special concern for children's privacy, we do not accept\n"
#~ " personal information from children who are under the age of 13.\n"
#~ " \n"
#~ " \n"
#~ " Information Collected On Red Hat Network\n"
#~ " \n"
#~ " If you register your system on Red Hat Network, you will be asked to\n"
#~ " provide a system profile when you register. The system profile\n"
#~ " consists of:\n"
#~ " \n"
#~ " 1) An inventory of the .rpm files installed on the system. This\n"
#~ " information helps determine what new software updates may be\n"
#~ " valuable to you in keeping your system secure and available.\n"
#~ " \n"
#~ " 2) An inventory of your system hardware. This information is also\n"
#~ " used by Red Hat to determine what software and support information\n"
#~ " might be useful to you.\n"
#~ " \n"
#~ " You can determine the information in your System Profile prior to\n"
#~ " registering it on Red Hat Network by typing the following at the\n"
#~ " command prompt:\n"
#~ " \n"
#~ " $rhn_register\n"
#~ " \n"
#~ " This command will start the registration program, and all of the\n"
#~ " information contained in the system profile is presented to you for\n"
#~ " review prior to submission to Red Hat.\n"
#~ " \n"
#~ " Once you have registered a system profile, you can browse and edit\n"
#~ " your profile information from your Red Hat Network page.\n"
#~ " \n"
#~ " When requested by you with a command from Red Hat Network, certain\n"
#~ " application configuration information about a particular system may\n"
#~ " be provided to Red Hat and displayed to you in a Web page to assist\n"
#~ " you in configuring your system. At your request, Red Hat may store\n"
#~ " this information for a time to assist you in system recovery should\n"
#~ " you make a mistake in the application configuration. In each case\n"
#~ " where configuration information is stored by Red Hat, it will be at\n"
#~ " your request and only for a period of time sufficient to confirm\n"
#~ " acceptance of new configuration settings.\n"
#~ " \n"
#~ " Other than the System Profile and application configuration you\n"
#~ " request as part of an online service, Red Hat will never retrieve or\n"
#~ " store personal file information from your system as part of any Red\n"
#~ " Hat service.\n"
#~ " \n"
#~ " \n"
#~ " Information Collected in Other Ways\n"
#~ " \n"
#~ " We collect information in other ways, such as running contests on\n"
#~ " our site and at trade shows, in which we ask you for contact\n"
#~ " information (like your email address), unique identifiers (like your\n"
#~ " password), and demographic information (like your occupation).  We\n"
#~ " may use data from these contests and trade shows to contact you or\n"
#~ " to allow appropriate business partners to contact you.  If you do\n"
#~ " not wish to be contacted, we ask that you refrain from participating\n"
#~ " in these promotions.\n"
#~ " \n"
#~ " \n"
#~ " Cookies and Other Browser Information\n"
#~ " \n"
#~ " Our site automatically captures IP addresses.  We use IP addresses\n"
#~ " to help diagnose problems with our server, to administer our\n"
#~ " website, and to help ensure the security of your interaction with\n"
#~ " the website.  Your IP address is used to help identify you and your\n"
#~ " shopping cart.\n"
#~ " \n"
#~ " As part of offering and providing customizable and personalized\n"
#~ " services, Red Hat uses cookies to store and sometimes track\n"
#~ " information about you.  A cookie is a small amount of data that is\n"
#~ " sent to your browser from a Web server and stored on your computer's\n"
#~ " hard drive.  All sections of redhat.com where you are prompted to\n"
#~ " log in or that are customizable require your browser to accept\n"
#~ " cookies.  If you would like to know more about precisely how we use\n"
#~ " cookies, click here.\n"
#~ " \n"
#~ " \n"
#~ " Third Party and Aggregated Data\n"
#~ " \n"
#~ " Under confidentiality agreements, Red Hat may match user information\n"
#~ " with third-party data.  Also, Red Hat discloses aggregated user\n"
#~ " statistics in order to describe our services to current and\n"
#~ " prospective partners and other third parties.  Red Hat has\n"
#~ " agreements with some third parties to perform certain dedicated\n"
#~ " tasks such as product fulfillment, payroll, credit card processing,\n"
#~ " e-mail housing, and marketing, training, and customer service.  In\n"
#~ " these situations, we share your information with these third parties\n"
#~ " for the sole purpose of allowing them to perform these tasks.  Your\n"
#~ " information is not used by the third party in any other way.\n"
#~ " \n"
#~ " \n"
#~ " About Links to Other Sites\n"
#~ " \n"
#~ " This site contains links to other sites.  Red Hat does not control\n"
#~ " the information collection of sites that can be reached through\n"
#~ " links from redhat.com.  If you have questions about the data\n"
#~ " collection procedures of linked sites, please contact those\n"
#~ " companies directly.\n"
#~ " \n"
#~ " \n"
#~ " Public Forums Reminder\n"
#~ " \n"
#~ " This site often makes chat rooms, forums, message boards, and/or\n"
#~ " news groups available to its users.  Please remember that any\n"
#~ " information that is disclosed in these areas becomes public\n"
#~ " information.  Exercise caution when deciding to disclose your\n"
#~ " personal information.  Although we value individual ideas and\n"
#~ " encourage free expression, Red Hat reserves the right to take\n"
#~ " necessary action to preserve the forum's integrity, such as removing\n"
#~ " any posting that is vulgar or inappropriate.\n"
#~ " \n"
#~ " \n"
#~ " Questions and Answers\n"
#~ " \n"
#~ " How Can I Opt Out?\n"
#~ " Red Hat gives you the ability to opt out of receiving communications\n"
#~ " from Red Hat and/or its partners if you choose.  When you register\n"
#~ " or order a product or service, simply choose \"I do not wish to be\n"
#~ " contacted\" underneath the Contact Method section.  If you decide\n"
#~ " that you would like to opt out of communications at a later date,\n"
#~ " you may log in to your account\n"
#~ " (http://www.redhat.com/apps/user/login.html) and modify the Contact\n"
#~ " Method section.  You may also simply unsubscribe to a specific email\n"
#~ " communication by following the unsubscribe directions at the bottom\n"
#~ " of the email or by contacting feedback@redhat.com and requesting\n"
#~ " that you be unsubscribe from that specific communication.\n"
#~ " \n"
#~ " How Can I Modify or Update My Information?\n"
#~ " Red Hat gives you the ability to modify or update your information.\n"
#~ " Please log in and modify your information\n"
#~ " (http://www.redhat.com/apps/user/login.html) or, if necessary,\n"
#~ " contact us at feedback@redhat.com and describe the changes you want\n"
#~ " made to the information you have previously provided.\n"
#~ " \n"
#~ " Red Hat reserves the right to change this policy from time to time.\n"
#~ " If we do make changes, the revised Privacy Statement will be posted\n"
#~ " on this site."
  07070100000069000081B40000000000000000000000015FBBE8EE0000B635000000000000000000000000000000000000001E00000000spacewalk-backend/po/en_GB.po # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/"
"fedora/language/en_GB/)\n"
"Language: en_GB\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
   0707010000006A000081B40000000000000000000000015FBBE8EE0000ED9F000000000000000000000000000000000000001B00000000spacewalk-backend/po/es.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# David Barzilay <barzilay@redhat.com>, 2004.
#  <ehespinosa@ya.com>, 2013.
# Gladys Guerrero <gguerrer@redhat.com>, 2010.
# Luis Mayoral <mayoral@linuxadicto.org>, 2003.
# Manuel Ospina <mospina@redhat.com>, 2005, 2006, 2007.
# Nuria Soriano <nsoriano@redhat.es>, 2001.
# Yelitza Louze <ylouze@redhat.com>, 2004.
# Jiri Dostal <jdostal@redhat.com>, 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2020-10-15 19:49+0000\n"
"Last-Translator: Pau Garcia Quiles <pau.garcia@suse.com>\n"
"Language-Team: Spanish <https://l10n.opensuse.org/projects/uyuni/backend/es/"
">\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.6.1\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr "ficha de autenticaciÃ³n en proxy incompleta: %s"

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr "Enviada firma de proxy %s no coincide con la nuestra %s."

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr "autenticaciÃ³n de proxy declinada"

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr "PeticiÃ³n no vÃ¡lida recibida (%s)"

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr "SIGUE MENSAJE IMPORTANTE: %s"

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr "Mientras corre â€˜%sâ€™: capturado %s : %s\n"

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr "URI no vÃ¡lido %s"

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""
"\n"
"                   %s La cuenta ha sido desactivada en este servidor. \n"
"                   Por favor contacte con el administrador de su "
"organizaciÃ³n para mÃ¡s ayuda."

#: ../server/handlers/applet/applet.py:78
#, fuzzy, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr "Su sistema no se encuentra en la base de datos {PRODUCT_NAME}"

#: ../server/handlers/sat/auth.py:45
#, fuzzy
msgid "ISS is disabled on this server."
msgstr "ISS estÃ¡ deshabilitado en este servidor."

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr "Servidor â€œ%sâ€ no estÃ¡ habilitado para ISS"

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr "Se esperaba un nombre de paquete, no: %s"

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr "Se esperaba un paquete, no: %s"

#: ../server/handlers/xmlrpc/proxy.py:65
#, fuzzy, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""
"El servicio SUSE Manager Proxy no estÃ¡ habilitado para el perfil del "
"servidor: â€œ%sâ€"

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr "Clave de sesiÃ³n no vÃ¡lida"

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr "El identificador de servidor ya no existe"

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr "El tipo de valor de la acciÃ³n es invÃ¡lido %s (%s)"

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr "La acciÃ³n %s no pertenece al servidor %s"

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr "Faltan datos requeridos"

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr "Faltan miembros requeridos"

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr "Intentando registrar un sistema a un nombre de usuario no vÃ¡lido"

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr "Solicitada versiÃ³n de sistema no vÃ¡lida"

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
#, fuzzy
msgid "Privacy Statement"
msgstr "DeclaraciÃ³n de Privacidad de la Red Red Hat"

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr "Se esperaba un diccionario como argumento de producto"

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr "Valor no vÃ¡lido â€˜%sâ€™ para %s (%s)"

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr "Par system_id/action_id invÃ¡lido."

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr "Valor no vÃ¡lido %s (%s)"

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr "Usted no estÃ¡ autorizado a gestionar paquetes en la organizaciÃ³n null"

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr "Usted no tiene permitido gestionar paquetes en la organizaciÃ³n %s"

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr "Usted no tiene permitido llevar a cabo tareas administrativas"

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr "Usted no tiene permitido manejar el canal %s o ese canal no existe"

#: ../server/importlib/userAuth.py:204
#, fuzzy, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""
"\n"
"%s La cuenta ha sido desactivada en este servidor. Por favor contacte con su "
"administrador de sistema para mÃ¡s ayuda."

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""
"Su cuenta no tiene acceso a ninguno de los canales coincidentes "
"(lanzamiento=â€™%(release)sâ€™, arquitectura=%(arch)sâ€™)%(www_activation)s"

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""
"\n"
"Si usted tiene un nÃºmero de registro, por favor regÃ­strelo primero en http://"
"www.redhat.com/apps/activate/ y despuÃ©s intÃ©ntelo otra vez.\n"

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr "Permisos de suscripciÃ³n insuficientes para lanzamiento (%s, %s"

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr "Sistema Registrado pero Inactivo"

#: ../server/rhnChannel.py:2277
#, fuzzy, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""
"\n"
"CombinaciÃ³n de Arquitectura y SO no vÃ¡lida (%s, %s). Su sistema ha sido "
"registrado, pero no recibirÃ¡ actualizaciones porque no estÃ¡ suscrito a un "
"canal. Si usted no tiene todavÃ­a activado su producto para servicio, por "
"favor visite nuestra web en: http://www.redhat.com/apps/activate/ â€¦para "
"activar su producto."

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""
"\n"
"CombinaciÃ³n de Arquitectura y SO no vÃ¡lida (%s, %s). Su sistema ha sido "
"registrado, pero no recibirÃ¡ actualizaciones porque podrÃ­a no estar suscrito "
"a un canal base. Por favor contacte con el administrador de su organizaciÃ³n "
"para asistencia.\n"

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""
"\n"
"Este sistema ha sido registrado con Ã©xito, pero no todavÃ­a intitulado al "
"servicio. Para titular este sistema al servicio, acceda al sitio web en "
"%(entitlement_url)s\n"

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""
"\n"
"Este sistema ha sido registrado con Ã©xito, pero no hay disponibles derechos "
"al servicio. Para titular este sistema al servicio, acceda al sitio web en "
"%(entitlement_url)s\n"

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr "Servicio no habilitado para perfil del sistema: â€œ%sâ€"

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr "Paquete RPM %s pedido no vÃ¡lido"

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr "Paquete no encontrado"

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr "Arquitectura '%s' no soportada"

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr "La ficha '%s' tiene mÃ¡s de un canal base asignado"

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr "Canales base en conflicto"

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr "Fallo al aÃ±adir servidor al grupo %s"

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr "La cuenta mÃ¡xima de utilizaciÃ³n de %s alcanzada"

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""
"El apilado de vuelta a registrar fichas con diferentes tÃ­tulos de base no se "
"soporta"

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr "No podrÃ­a encontrar ficha '%s'"

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr "Fichas de organizaciones no coincidentes"

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr "Kickstart de sesiÃ³n no coincidente"

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr "El apilado de vuelta a registrar fichas no se soporta"

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr "CombinaciÃ³n de nombre de usuario/contraseÃ±a no vÃ¡lida"

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr "Nombre de usuario â€˜%sâ€™ no ha sido reservado"

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr "DirecciÃ³n de correo electrÃ³nico no especificada"

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr "nombre de usuario deberÃ­a tener al menos %d caracteres"

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr "nombre de usuario deberÃ­a ser menos de %d caracteres"

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr "nombre de usuario = â€˜%sâ€™, carÃ¡cter no vÃ¡lido â€˜%sâ€™"

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr "Por favor limite su direcciÃ³n de correo electrÃ³nico a %s caracteres"

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr "contraseÃ±a debe ser al menos %d caracteres"

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr "ContraseÃ±a debe ser mÃ¡s corta de %d caracteres"

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr "contraseÃ±a contiene carÃ¡cter â€˜%sâ€™"

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr "nombre de usuario deberÃ­a ser al menos %d caracteres de largo"

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr "No puedo registrar nombres de usuario que terminen con %s"

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr "Esto no parece ser un nombre de usuario vÃ¡lido."

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr "CombinaciÃ³n de nombre de usuario y contraseÃ±a no vÃ¡lida."

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr "Este acceso ya estÃ¡ tomado, o la contraseÃ±a es incorrecta."

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr "Permiso denegado."

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr "Objeto no encontrado."

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr "ID de Sistema Digital no vÃ¡lida."

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr "Credenciales del Sistema no vÃ¡lidas."

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr "No puede recuperar datos del usuario de la base de datos."

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr "Se requiere nombre de usuario vÃ¡lido."

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr "Se requiere contraseÃ±a vÃ¡lida."

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr "ViolaciÃ³n de la longitud mÃ­nima de nombre de usuario."

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr "ViolaciÃ³n de la longitud mÃ­nima de contraseÃ±a."

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr "El nombre de usuario contiene caracteres no vÃ¡lidos."

#: ../common/rhnException.py:66
msgid "File not found."
msgstr "Fichero no encontrado."

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr "CombinaciÃ³n de Arquitectura y versiÃ³n de SO no estÃ¡ soportada."

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr "CombinaciÃ³n de Arquitectura y versiÃ³n de SO no estÃ¡ soportada."

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr "Argumentos pasados a la funciÃ³n no vÃ¡lidos."

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr "Incapaz de recuperar la entrada pedida."

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr "No podrÃ­a actualizar la entrada de la base de datos."

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr "Arquitectura de servidor no soportada."

#: ../common/rhnException.py:73
#, fuzzy, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""
"\n"
"La funcionalidad anÃ³nima del servidor no estÃ¡ ya disponible. Por favor "
"vuelva a registrar este sistema ejecutando rhn_register (o up2date â€“register "
"en Red Hat Enterprise Linux 3+) como root. Por favor visite https://"
"%(hostname)s/rhn/systems/SystemEntitlements.do o acceda a https://"
"%(hostname)s, y desde el tabular â€œOverviewâ€, seleccione â€œSubscription "
"Managementâ€ para habilitar el servicio RHN para este sistema"

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr "Registro no disponible en la base de datos."

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr "Valor para la entrada no vÃ¡lido."

#: ../common/rhnException.py:83
#, fuzzy, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""
"\n"
"Este sistema no tiene un tÃ­tulo vÃ¡lido para Red Hat Network. Por favor "
"visite https://%(hostname)s/rhn/systems/SystemEntitlements.do o acceda a "
"https://%(hostname)s, y desde el tabular â€œOverviewâ€, seleccione "
"â€œSubscription Managementâ€ para habilitar el servicio RHN para este sistema"

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr "Error de canal"

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr "La ficha de la sesiÃ³n cliente no es vÃ¡lida."

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr "La ficha de la sesiÃ³n cliente ha expirado."

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr "Usted no estÃ¡ autorizado para recuperar el objeto pedido."

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr "AcciÃ³n no vÃ¡lida"

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""
"Usted no tiene permitido llevar a cabo tareas administrativas sobre este "
"sistema."

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr "El sistema ya estÃ¡ suscrito al canal especificado."

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr "El sistema no estÃ¡ actualmente suscrito al canal especificado."

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr "El canal especificado no existe."

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr "VersiÃ³n del canal no vÃ¡lida."

#: ../common/rhnException.py:100
#, fuzzy
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""
"\n"
"LÃ­mites de afiliaciÃ³n al grupo de usuario excedida. El ajuste actual de su "
"cuenta no le permite aÃ±adir otra cuenta de usuario. Por favor compruebe con "
"el administrador de su organizaciÃ³n para su cuenta si el nÃºmero mÃ¡ximo de "
"usuarios permitidos para suscribirse a RHN necesita ser cambiado."

#: ../common/rhnException.py:108
#, fuzzy
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""
"\n"
"LÃ­mites de afiliaciÃ³n a grupo de sistema excedido. El ajuste actual para su "
"cuenta no le permite aÃ±adir otro perfil de sistema. Por favor consulte con "
"el administrador de la organizaciÃ³n para su cuenta para modificar el nÃºmero "
"mÃ¡ximo de perfiles de sistema que pueden ser suscritos en su cuenta RHN."

#: ../common/rhnException.py:116
#, fuzzy
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""
"\n"
"Arquitectura no vÃ¡lida. El arquitectura del paquete no se soporta por Red "
"Hat Network"

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr "Cabecera RPM no vÃ¡lida"

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr "InformaciÃ³n no vÃ¡lida subida al servidor"

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr "Error subiendo la configuraciÃ³n de las interfaces de red."

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""
"\n"
"La Subida del Paquete Fallo debido a una violaciÃ³n de restricciÃ³n singular. "
"AsegÃºrese que el paquete no tiene ninguna dependencia duplicada o que no "
"existe ya en el servidor"

#: ../common/rhnException.py:134
#, fuzzy
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""
"\n"
"La opciÃ³n â€“force rhnpush estÃ¡ deshabilitada en este servidor. Por favor "
"contacte con su administrador SatÃ©lite para mÃ¡s informaciÃ³n."

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""
"\n"
"La ficha de activaciÃ³n especificada podrÃ­a no encontrarse en este servidor. "
"Por favor reintÃ©ntelo con una clave vÃ¡lida."

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr "Demasiados sistemas registrados usando esta ficha de registro"

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr "La ficha contiene ajustes no vÃ¡lidos, obsoletos o insuficientes"

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr "Fichas de activaciÃ³n en conflicto"

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""
"\n"
"Usted no tiene permiso de suscripciÃ³n al cana designado. Por favor vaya a su "
"canal de organizaciÃ³n o administradores de organizaciÃ³n para mÃ¡s detalles."

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr "Usted no puede darse de baja del canal base."

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr "Hubo un error mientras intentaba unir el sistema a sus grupos"

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr "Incapaz de titular sistema"

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr "ViolaciÃ³n de la longitud mÃ¡xima de correo electrÃ³nico."

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr "Este sistema ha sido registrado previamente."

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr "Nombre de usuario no vÃ¡lido"

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr "Incapaz de buscar servidor"

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr "Argumento requerido desaparecido"

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr "No hay informaciÃ³n de derecho ligada al hardware"

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr "El nÃºmero de instalaciÃ³n no da derecho"

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr "ViolaciÃ³n de la longitud mÃ¡xima del nombre de usuario"

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr "ViolaciÃ³n de la longitud mÃ¡xima de la contraseÃ±a"

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
#, fuzzy
msgid "System Name cannot be less than 1 character"
msgstr "nombre de usuario deberÃ­a ser menos de %d caracteres"

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
#, fuzzy
msgid "SUSE Manager Proxy error."
msgstr "Error del Proxy RHN."

#: ../common/rhnException.py:191
#, fuzzy
msgid "SUSE Manager Proxy unable to login."
msgstr "RHN Proxy incapaz de acceder"

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
#, fuzzy
msgid "SUSE Manager Proxy session token is invalid."
msgstr "La ficha de sesiÃ³n de Proxy RHN no es vÃ¡lida."

#: ../common/rhnException.py:198
#, fuzzy
msgid "SUSE Manager Proxy session token has expired."
msgstr "La ficha de sesiÃ³n de Proxy RHN ha expirado."

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
#, fuzzy
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""
"\n"
"La creaciÃ³n de un usuario de RHN Satellite no estÃ¡ permitida por medio de "
"rhn_register (o up2date â€“register sonre Red Hat Enterprise Linux 3 o "
"posteriores); por favor contacte con su administrador del sistema para tener "
"su cuenta creada."

#: ../common/rhnException.py:206
#, fuzzy
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""
"\n"
"Este servidor satÃ©lite no tiene permitido usar Inter Satellite Sync sobre "
"este satÃ©lite"

#: ../common/rhnException.py:209
#, fuzzy
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""
"\n"
"Inter Satellite Sync estÃ¡ deshabilitado sobre este satÃ©lite"

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr "Tipo de datos pasado no vÃ¡lido"

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr "Incapaz de recuperar el canal"

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr "Incapaz de recuperar el paquete"

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr "Incapaz de recuperar errata"

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr "Fichero desaparecido"

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr "Error en la recuperaciÃ³n de funciÃ³n"

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr "Error de ejecuciÃ³n de funciÃ³n"

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr "Cadena de versiÃ³n desaparecida"

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr "Cadena de versiÃ³n no vÃ¡lida"

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr "Versiones no coincidentes"

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr "VersiÃ³n de canal no vÃ¡lida"

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr "NingÃºn archivo comps para el canal"

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr "Incapaz de recuperar fichero comps"

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr "ConfiguraciÃ³n de la acciÃ³n desaparecida"

#: ../common/rhnException.py:230
msgid "File too large"
msgstr "Fichero demasiado largo"

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr "Fichero contiene datos binarios"

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr "La configuraciÃ³n del canal no estÃ¡ vacÃ­a"

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr "Error de permiso"

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr "Contenido desaparecido para el fichero de configuraciÃ³n"

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr "Delimitadores de la plantilla no especificados"

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr "ConfiguraciÃ³n del canal no existe"

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr "ConfiguraciÃ³n del canal ya existe"

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr "Fichero desaparecido de la configuraciÃ³n del canal"

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr "Un lanzamiento diferente de este archivo ha sido subido"

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr "Fichero ya subido a la configuraciÃ³n del canal"

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr "El fichero supera la cuota de espacio restante"

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr "La ruta completa del fichero debe ser especificada"

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr "NÃºmero de revisiÃ³n no vÃ¡lido"

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr "No puedo comparar ficheros con tipo de fichero diferente"

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
#, fuzzy
msgid "Invalid content encoding"
msgstr "CÃ³digo de hito no vÃ¡lido"

#: ../common/rhnException.py:253
#, fuzzy
msgid "Invalid crash name"
msgstr "Nombre de paquete no vÃ¡lido"

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
#, fuzzy
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""
"\n"
"     Ha ocurrido un error mientras se procesaba su peticiÃ³n. Si este "
"problema\n"
"     persiste por favor introduzca un reporte de error en bugzilla.redhat."
"com.\n"
"     Si usted elige enviar el reporte de error, por favor asegÃºrese de "
"incluir\n"
"     detalles de lo que estaba intentando hacer cuando ocurriÃ³ el error y \n"
"     detalles sobre como reproducir el problema.\n"

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""
"Mensaje de Error:\n"
"    %s\n"

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr "CÃ³digo de Clase de Error: %s\n"

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr "InformaciÃ³n de Clase de Error: %s\n"

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr "ExplicaciÃ³n: %s"

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, fuzzy, python-format
msgid "    Extinct package:  %s"
msgstr "Se esperaba un paquete, no: %s"

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
#, fuzzy
msgid "Linking packages to channels"
msgstr "Canales base en conflicto"

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
#, fuzzy
msgid "base-channels"
msgstr "Canales base en conflicto"

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr "XXX: canales importados: %s"

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr "XXX:   canales en antememoria: %s"

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr "XXX: enumerar canales llamados"

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr "ERROR: estos canales o no existen o no estÃ¡n disponibles:"

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""
"       (para ver una lista de etiquetas de canales: %s --list-channels)"

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr "Descargando paquetes rpm"

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr "NO FALTA NINGUNO"

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr "Se completÃ³ el procesamiento de los paquetes rpm"

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr "Descargando metadatos de paquetes"

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr "Descargando paquetes srpm"

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, fuzzy, python-format
msgid "Unable to save file %s: %s"
msgstr "Incapaz de titular sistema"

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr "ERROR: la ruta bajo server.mount_point (%s)  no existe"

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr "LÃ­nea de comandos: %s"

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
#, fuzzy
msgid "print the configuration and exit"
msgstr "ConfiguraciÃ³n del canal no existe"

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, fuzzy, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr "Incapaz de buscar servidor"

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr "CÃ³digos de error: los cÃ³digos devueltos significan:"

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr " -1.â€” No se pudo bloquear el archivo, KeyboardInterrupt o SystemExit"

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr "  0.â€” InterrupciÃ³n de usuario o salida intencionada"

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr "  1.â€” Se intenta ejecutar mÃ¡s de una copia de mgr-inter-sync."

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr "  2.â€” No pueden encontrarse las herramientas de sincronizaciÃ³n."

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr "  3.â€” se produjo una excepciÃ³n general con el zÃ³calo"

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""
"  4.â€” Se produjo un error SSL. Compruebe nuevamente su configuraciÃ³n de SSL."

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr "  5.â€” Error con ISS"

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr "  6.â€” Se produjo una excepciÃ³n no controlada"

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr "  7.â€” Error de sincronizaciÃ³n desconocido"

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr "  8.â€” ERROR: debe ser Â«rootÂ» para ejecutar"

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr "  9.â€” problema con rpclib durante el inicio de la sincronizaciÃ³n"

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr "  10.â€” error al iniciar la sincronizaciÃ³n"

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr "  11.â€” Error al procesar la transmisiÃ³n de XML"

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr "  12.â€” El canal no existe"

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr "  13.â€” Error con SQL al importar los metadatos del paquete"

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr "  14.â€” Error con SQL al enlazar los paquetes de canal"

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr "  15.â€” Error con SQL al procesar el XML"

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr "  16.â€” No se definiÃ³ server.mount_point en el archivo de configuraciÃ³n"

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""
"  17.â€” Error con SQL al recuperar los canales ya importados en la base de "
"datos de SUSE Manager"

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr "  18.â€” Cadena de conexiÃ³n de BD incorrecta en rhn.conf"

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr "  19.â€” Argumentos incorrectos"

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr "  20.â€” No se pudo conectar con la BD."

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr "  21.â€” Nivel de depuraciÃ³n incorrecto"

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr "  22.â€” Paso no vÃ¡lido"

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr "  24.â€” No existe este archivo"

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr "  25.â€” No existe este directorio"

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr "  26.â€” no existe mount_point"

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr "  27.â€” No existe esta organizaciÃ³n"

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr "  28.â€” Error: --master solo es vÃ¡lido con --mount-point"

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr "ERROR: versiÃ³n de volcado desconocida; pruebe una de %s"

#~ msgid "Your system was not found in the RHN database"
#~ msgstr "Su sistema no se encuentra en la base de datos RHN"

#~ msgid "ISS is disabled on this satellite."
#~ msgstr "ISS estÃ¡ deshabilitado en este satÃ©lite"

#, fuzzy
#~ msgid "Spacewalk Proxy service not enabled for server profile: \"%s\""
#~ msgstr ""
#~ "El servicio RHN Proxy no estÃ¡ habilitado para el perfil del servidor: â€œ%sâ€"

#, fuzzy
#~ msgid "Red Hat Satellite Welcome Message"
#~ msgstr "Mensaje de Bienvenida de la Red Red Hat"

#, fuzzy
#~ msgid "Red Hat Satellite Privacy Statement"
#~ msgstr "DeclaraciÃ³n de Privacidad de la Red Red Hat"
 0707010000006B000081B40000000000000000000000015FBBE8EE0000B61F000000000000000000000000000000000000001B00000000spacewalk-backend/po/et.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Estonian (http://www.transifex.com/projects/p/fedora/language/"
"et/)\n"
"Language: et\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
 0707010000006C000081B40000000000000000000000015FBBE8EE0000B7F9000000000000000000000000000000000000001B00000000spacewalk-backend/po/eu.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Asier Iturralde Sarasola <asier.iturralde@gmail.com>, 2012.
# Jiri Dostal <jdostal@redhat.com>, 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2018-03-16 10:54+0000\n"
"Last-Translator: Copied by Zanata <copied-by-zanata@zanata.org>\n"
"Language-Team: Basque (http://www.transifex.com/projects/p/fedora/language/"
"eu/)\n"
"Language: eu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Zanata 4.6.2\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr "URI baliogabea %s"

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr "Ez da paketea aurkitu"

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr "E-posta helbidea ez da zehaztu"

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr "Objektua ez da aurkitu."

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr "Baliozko erabiltzaile-izena behar da."

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr "Baliozko pasahitza behar da."

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr "Fitxategia ez da aurkitu."

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr "Ekintza baliogabea"

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr "RPM goiburu baliogabea"

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr "Erabiltzaile-izen baliogabea"

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
#, fuzzy
msgid "Invalid content encoding"
msgstr "Ekintza baliogabea"

#: ../common/rhnException.py:253
#, fuzzy
msgid "Invalid crash name"
msgstr "Erabiltzaile-izen baliogabea"

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
   0707010000006D000081B40000000000000000000000015FBBE8EE0000B6D5000000000000000000000000000000000000001B00000000spacewalk-backend/po/fa.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Ali Yousefi Sabzevar <aysabzevar@gmail.com>, 2010.
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2020-07-28 12:34+0000\n"
"Last-Translator: hayyan rostami <hayyan71@yahoo.com>\n"
"Language-Team: Persian <https://l10n.opensuse.org/projects/uyuni/backend/fa/"
">\n"
"Language: fa\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 3.6.1\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr "Ù„Ø·ÙØ§ rhn_register Ø±Ø§ Ø¨Ù‡ Ø¹Ù†ÙˆØ§Ù† Ø±ÛŒØ´Ù‡ Ø¨Ø± Ø±ÙˆÛŒ Ø§ÛŒÙ† Ù…Ø´ØªØ±ÛŒ Ø§Ø¬Ø±Ø§ Ú©Ù†ÛŒØ¯"

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
   0707010000006E000081B40000000000000000000000015FBBE8EE0000B6A1000000000000000000000000000000000000001B00000000spacewalk-backend/po/fi.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Esa Aaltonen <esa.aaltonen@pp.sonera.net>, 2004.
# Lauri Nurmi <lanurmi@iki.fi>, 2003, 2005.
# Mikko Ikola <ikola@iki.fi>, 2004.
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Finnish (http://www.transifex.com/projects/p/fedora/language/"
"fi/)\n"
"Language: fi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
   0707010000006F000081B40000000000000000000000015FBBE8EE0000EA6F000000000000000000000000000000000000001B00000000spacewalk-backend/po/fr.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Alain PORTAL <aportal@univ-montp2.fr>, 2006.
# Audrey Simons <asimons@redhat.com>, 2004-2005.
# Bettina De Monti <bdemonti@redhat.it>, 2001.
# Damien Durand <splinux@fedoraproject.org>, 2006.
# Decroux Fabien <fdecroux@redhat.com>, 2006-2007.
# JÃ©rÃ´me Fenal <jfenal@gmail.com>, 2012.
#   <jfenal@gmail.com>, 2011.
# jfenal <jfenal@gmail.com>, 2011.
# Myriam Malga <mmalga@redhat.com>, 2007.
# Stephane Raimbault <stephane.raimbault@free.fr>, 2004.
# Jiri Dostal <jdostal@redhat.com>, 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2018-03-16 10:54+0000\n"
"Last-Translator: Copied by Zanata <copied-by-zanata@zanata.org>\n"
"Language-Team: French <trans-fr@lists.fedoraproject.org>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Zanata 4.6.2\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr "Jeton d'authentification proxy incomplet : %s"

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr "La signature de proxy envoyÃ©e %s ne correspond pas Ã  la nÃ´tre : %s."

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr "authentification proxy rejetÃ©e"

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr "RÃ©ception de requÃªte invalide (%s)"

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""
"UN MESSAGE IMPORTANT SUIT :\n"
"%s"

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""
"Lors de l'exÃ©cution de '%s': exception levÃ©e\n"
"%s : %s\n"

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr "URI invalide %s"

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""
"\n"
"                   Le compte %s a Ã©tÃ© dÃ©sactivÃ© sur ce serveur.\n"
"                   Veuillez contacter votre administrateur d'organisation "
"pour plus d'assistance."

#: ../server/handlers/applet/applet.py:78
#, fuzzy, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr "Votre systÃ¨me n'a pas Ã©tÃ© trouvÃ© dans la base de donnÃ©es RHN"

#: ../server/handlers/sat/auth.py:45
#, fuzzy
msgid "ISS is disabled on this server."
msgstr "ISS est dÃ©sactivÃ© sur ce satellite."

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr "Serveur \"%s\" n'est pas autorisÃ© pour ISS."

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr "Nom de paquet attendu, pas : %s"

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr "Paquet attendu, pas : %s"

#: ../server/handlers/xmlrpc/proxy.py:65
#, fuzzy, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr "Service RHN Proxy non activÃ© pour le profil de serveur : \"%s\""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr "ClÃ© de session invalide"

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr "Cet identifiant de serveur n'existe plus"

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr "Type d'action %s invalide (%s)"

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr "L'action %s n'appartient pas au serveur %s"

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr "DonnÃ©es requises manquantes"

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr "Membres requis manquantes"

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr "Essai d'enregistrer un systÃ¨me avec un nom d'utilisateur invalide"

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr "Version de systÃ¨me demandÃ©e invalide"

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
#, fuzzy
msgid "Privacy Statement"
msgstr "DÃ©claration de respect de la vie privÃ©e de Red Hat Network"

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr "J'attendais un dictionnaire en tant qu'arguement produit"

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr "Valeur incorrecte '%s' pour %s (%s)"

#: ../server/handlers/xmlrpc/scap.py:104
#, fuzzy
msgid "Invalid system_id/action_id pair."
msgstr "Informations d'identification du systÃ¨me invalides."

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr "Valeur %s invalide (%s)"

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""
"Vous n'Ãªtes pas autorisÃ© Ã  administrer les paquets de l'organisation null"

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""
"Vous n'Ãªtes pas autorisÃ© Ã  administrer les paquets de l'organisation %s"

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr "Vous n'Ãªtes pas autorisÃ© Ã  rÃ©aliser des tÃ¢ches d'administration"

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""
"Vous n'Ãªtes pas autorisÃ© Ã  administrer le canal %s, ou ce canal n'existe pas"

#: ../server/importlib/userAuth.py:204
#, fuzzy, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""
"\n"
"                   Le compte %s a Ã©tÃ© dÃ©sactivÃ© sur ce serveur.\n"
"                   Veuillez contacter votre administrateur d'organisation "
"pour plus d'assistance."

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""
"Votre compte n'a pas accÃ¨s Ã  aucun canal correspondant Ã  "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""
"\n"
"Si vous avez un numÃ©ro d'installation, veuillez d'abord l'enregistrer Ã  "
"http://www.redhat.com/apps/activate/ puis de rÃ©essayer.\n"
"\n"

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr "Permissions de souscriptions insuffisantes pour la version (%s, %s"

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr "SystÃ¨me EnregistrÃ© mais Inactif"

#: ../server/rhnChannel.py:2277
#, fuzzy, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""
"\n"
"Combinaison d'architecture et de version de l'OS (%s, %s) invalide.\n"
"Votre systÃ¨me a Ã©tÃ© enregistrÃ©, mais ne recevra pas de\n"
"mises Ã  jour car il n'est pas abonnÃ© Ã  un canal de base. Si vous n'avez\n"
"pas encore activÃ© votre produit pour le service, veuillez visiter notre site "
"web Ã  :\n"
"  \n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...pour activer votre produit."

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""
"\n"
"Combinaison d'architecture et de version de l'OS (%s, %s) invalide.\n"
"Votre systÃ¨me a Ã©tÃ© enregistrÃ©, mais ne recevra pas de\n"
"mises Ã  jour car il n'est pas abonnÃ© Ã  un canal de base.\n"
"Contacter l'administrateur de votre organisation pour une assistance.\n"

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""
"\n"
"  Ce systÃ¨me a Ã©tÃ© inscrit avec succÃ¨s, mais n'a aucun droit d'accÃ¨s\n"
"  au service. Pour attribuer Ã  ce systÃ¨me un droit d'accÃ¨s au service,\n"
"  se connecter au site web Ã  l'adresse suivanteÂ :\n"
"\n"
"  %(entitlement_url)s\n"

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""
"\n"
"  Ce systÃ¨me a Ã©tÃ© inscrit avec succÃ¨s, mais aucun droit d'accÃ¨s au service\n"
"  n'est disponible. Pour attribuer Ã  ce systÃ¨me un droit d'accÃ¨s au "
"service,\n"
"  se connecter au site web Ã  l'adresse suivanteÂ :\n"
"\n"
"  %(entitlement_url)s\n"

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr "Service dÃ©sactivÃ© pour le profil de systÃ¨me : \"%s\""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr "Paquet RPM %s demandÃ© invalide"

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr "Paquet non trouvÃ©"

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr "L'architecture `%s' n'est pas supportÃ©e"

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr "Le jeton `%s' a plus d'un canal de base assignÃ©"

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr "Canaux de base conflictuels"

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr "Ã‰chec dans l'ajout du serveur au groupe %s"

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr "Limite d'utilisation maximale de %s atteinte"

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""
"L'empilement de jetons de rÃ©enregistrement avec des droits de base "
"diffÃ©rents n'est pas supportÃ©"

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr "Jeton '%s' introuvable"

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr "Jetons provenant d'organisation incompatibles"

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr "InadÃ©quation de session kickstart"

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr "L'empilement de jetons de rÃ©enregistrement n'est pas supportÃ©"

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr "Combinaison utilisateur/mot de passe invalide"

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr "Le nom d'utilisateur `%s' n'a pas Ã©tÃ© rÃ©servÃ©"

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr "Adresse courriel non spÃ©cifiÃ©e"

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr "Le nom d'utilisateur doit comporter au moins %d caractÃ¨res"

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr "Le nom d'utilisateur doit comporter au plus %d caractÃ¨res"

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr "nom d'utilisateur = `%s', caractÃ¨re invalide `%s'"

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr "Veuillez limiter votre adresse courriel Ã  %s caractÃ¨res"

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr "Le mot de passe doit comporter au moins %d caractÃ¨res"

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr "Le mot de passe doit comporter au plus %d caractÃ¨res"

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr "le mot de passe contient le caractÃ¨re `%s'"

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr "Le nom d'utilisateur doit comporter au moins %d caractÃ¨res"

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr "Impossible d'enregistrer un nom d'utilisateur se terminant par %s"

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr "Ceci ne semble pas Ãªtre un nom d'utilisateur invalide."

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr "Combinaison utilisateur et mot de passe invalide."

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr "Cet identifiant est dÃ©jÃ  utilisÃ©, ou le mot de passe est incorrect."

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr "Permission refusÃ©e."

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr "Objet non trouvÃ©."

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr "Identifiant numÃ©rique de systÃ¨me invalide."

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr "Informations d'identification du systÃ¨me invalides."

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr "DonnÃ©es utilisateur non trouvÃ©es dans la base."

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr "Nom d'utilisateur valide requis."

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr "Mot de passe valide requis."

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr "Violation de la limite minimale de longueur du nom d'utilisateur."

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr "Violation de la limite minimale de longueur du mot de passe."

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr "Le nom d'utilisateur contient des caractÃ¨res invalides."

#: ../common/rhnException.py:66
msgid "File not found."
msgstr "Fichier non trouvÃ©."

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr "Combinaison architecture et OS non supportÃ©e."

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr "Impossible de rÃ©cupÃ©rer les donnÃ©es du systÃ¨me."

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr "Arguments invalides passÃ©s Ã  la fonction."

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr "Impossible de rÃ©cupÃ©rer l'entrÃ©e demandÃ©e."

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr "Impossible de mettre Ã  jour l'entrÃ©e de base de donnÃ©es."

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr "Architecture serveur non supportÃ©e."

#: ../common/rhnException.py:73
#, fuzzy, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""
"\n"
"     La fonctionnalitÃ© serveur anonyme n'est plus disponible.\n"
"\n"
"     Veuillez rÃ©inscrire ce systÃ¨me en utilisant rhn_register\n"
"     (ou up2date --register sur Red Hat Enterprise Linux 3+) en tant que "
"root.\n"
"     Veuillez consulter https://%(hostname)s/rhn/systems/SystemEntitlements."
"do\n"
"     ou vous connecter sur https://%(hostname)s, et depuis l'onglet AperÃ§u,\n"
"     sÃ©lectionner Â« Gestion des Abonnements Â» pour activer le service RHN "
"sur\n"
"     ce systÃ¨me.\n"
"     "

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr "Enregistrement non disponible dans la base de donnÃ©es."

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr "Valeur invalide pour l'entrÃ©e."

#: ../common/rhnException.py:83
#, fuzzy, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""
"\n"
"     Ce systÃ¨me n'a pas de droit valide pour accÃ©der Ã  Red Hat Network.\n"
"     Veuillez consulter https://%(hostname)s/rhn/systems/SystemEntitlements."
"do\n"
"     ou vous connecter sur https://%(hostname)s, et depuis l'onglet AperÃ§u,\n"
"     sÃ©lectionner Â« Gestion des Abonnements Â» pour activer le service RHN "
"sur\n"
"     ce systÃ¨me.\n"
"     "

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr "Erreur de canal"

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr "Le jeton de session cliente est invalide."

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr "Le jeton de session cliente a expirÃ©."

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr "Vous n'Ãªtes pas autorisÃ© Ã  rÃ©cupÃ©rer l'objet demandÃ©."

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr "Action invalide"

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""
"Vous n'Ãªtes pas autorisÃ© Ã  rÃ©aliser les tÃ¢ches d'administration sur ce "
"systÃ¨me."

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr "Ce systÃ¨me est dÃ©jÃ  abonnÃ© au canal spÃ©cifiÃ©."

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr "Ce systÃ¨me n'est pas abonnÃ© au canal spÃ©cifiÃ©."

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr "Le canal spÃ©cifiÃ© n'existe pas."

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr "Version de canal invalide."

#: ../common/rhnException.py:100
#, fuzzy
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""
"\n"
"     DÃ©passement de la limite d'adhÃ©sion Ã  des groupes d'utilisateur.\n"
"\n"
"     Les rÃ©glages actuels de votre compte ne vous autorisent pas Ã  crÃ©er\n"
"     un compte utilisateur. Veuillez vÃ©rifier avec l'administrateur de "
"votre\n"
"     organisation de votre compte si le nombre maximal d'utilisateurs "
"autorisÃ©s\n"
"     Ã  se connecter Ã  RHN doit Ãªtre modifiÃ©.\n"
"     "

#: ../common/rhnException.py:108
#, fuzzy
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""
"\n"
"     DÃ©passement de la limite d'adhÃ©sion Ã  des groupes de systÃ¨mes.\n"
"\n"
"     Les rÃ©glages actuels de votre compte ne vous autorisent pas Ã  crÃ©er\n"
"     un nouveau profil de systÃ¨me. Veuillez vÃ©rifier avec l'administrateur\n"
"     de votre organisation de votre compte si le nombre maximal de systÃ¨mes\n"
"     autorisÃ©s Ã  s'inscrire sur RHN doit Ãªtre modifiÃ©.\n"
"     "

#: ../common/rhnException.py:116
#, fuzzy
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""
"\n"
"     Architecture invalide.\n"
"\n"
"     L'architecture de ce paquet n'est pas prise en charge par Red Hat "
"Network\n"
"     "

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr "En-tÃªte RPM invalide"

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr "Information invalide transmise au serveur"

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr "Erreur lors de l'envoi de la configuration des interfaces rÃ©seau."

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""
"\n"
"     Le transfert de paquet a Ã©chouÃ© du fait de la violation de la\n"
"     contrainte d'unicitÃ©. Assurez-vous que le paquet ne possÃ¨de pas\n"
"     de dÃ©pendance dupliquÃ©e ou n'existe pas dÃ©jÃ  sur le serveur.\n"
"     "

#: ../common/rhnException.py:134
#, fuzzy
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""
"\n"
"     L'option --force de rhnpush est dÃ©sactivÃ©e sur ce serveur.\n"
"     Veuillez contacter votre administrateur de Satellite pour\n"
"     obtenir de l'aide.\n"
"     "

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""
"\n"
"     La clÃ© d'activation spÃ©cifiÃ©e est introuvable sur le serveur.\n"
"     Retenter avec une clÃ© valide.\n"
"     "

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr "Trop de systÃ¨mes enregistrÃ©s avec ce jeton d'enregistrement."

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""
"Le jeton contient des configurations invalides, obsolÃ¨tes ou insuffisantes."

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr "Jetons d'activation en conflit"

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""
"\n"
"     Vous n'avez pas d'abonnement autorisant l'accÃ¨s au canal dÃ©signÃ©.\n"
"     Veuillez consulter vos administrateurs de canaux ou d'organisation\n"
"     pour plus de dÃ©tails.\n"
"     "

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr "Vous ne pouvez pas vous dÃ©sabonner du canal de base."

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""
"Une erreur est survenue en essayant de faire adhÃ©rer le systÃ¨me Ã  ses groupes"

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr "Impossible d'accorder des droits au systÃ¨me"

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr "Limite de taille de courriel dÃ©passÃ©e."

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr "Ce systÃ¨me est dÃ©jÃ  enregistrÃ©."

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr "Nom d'utilisateur invalide"

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr "Impossible de rechercher le serveur"

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr "Un paramÃ¨tre indispensable est manquant"

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr "Aucune information de droit n'est liÃ©e au matÃ©riel"

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr "Le numÃ©ro d'installation n'ouvre aucun droit"

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr "Violation de la limite maximale de longueur du nom d'utilisateur"

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr "Violation de la limite minimale de longueur du mot de passe"

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
#, fuzzy
msgid "System Name cannot be less than 1 character"
msgstr "Le nom d'utilisateur doit comporter au plus %d caractÃ¨res"

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
#, fuzzy
msgid "SUSE Manager Proxy error."
msgstr "Erreur de RHN Proxy."

#: ../common/rhnException.py:191
#, fuzzy
msgid "SUSE Manager Proxy unable to login."
msgstr "Le Proxy RHN est incapable de se connecter."

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
#, fuzzy
msgid "SUSE Manager Proxy session token is invalid."
msgstr "Le jeton de session du Proxy RHN est invalide."

#: ../common/rhnException.py:198
#, fuzzy
msgid "SUSE Manager Proxy session token has expired."
msgstr "Le jeton de session du Proxy RHN a expirÃ©."

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
#, fuzzy
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""
"\n"
"     La crÃ©ation d'un utilisateur sur RHN Satellite n'est pas autorisÃ©e\n"
"     via rhn_register (ou up2date --register sur Red Hat\n"
"     Enterprise Linux 3 ou plus) ; veuillez contacter votre      "
"administrateur systÃ¨me afin qu'il puisse crÃ©er votre\n"
"     compte utilisateur.\n"
"     "

#: ../common/rhnException.py:206
#, fuzzy
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""
"\n"
"     Ce serveur satellite n'est pas autorisÃ© Ã  utiliser la synchronisation "
"inter-satellite\n"
"     "

#: ../common/rhnException.py:209
#, fuzzy
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""
"\n"
"     La synchronisation inter-satellite est dÃ©sactivÃ©e sur ce satellite.\n"
"     "

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr "Type de donnÃ©es invalide passÃ©"

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr "Impossible de rÃ©cupÃ©rer le canal"

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr "Impossible de rÃ©cupÃ©rer le paquet"

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr "Impossible de rÃ©cupÃ©rer l'erratum"

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr "Le fichier est manquant"

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr "Erreur de rÃ©cupÃ©ration de la fonction"

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr "Erreur d'exÃ©cution de la fonction"

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr "ChaÃ®ne de version manquante"

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr "ChaÃ®ne de version invalide"

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr "Versions incompatibles"

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr "Version de canal incompatible"

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr "Pas de fichier comps pour le canal"

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr "Impossible de rÃ©cupÃ©rer le fichier comps"

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr "Action de configuration manquante"

#: ../common/rhnException.py:230
msgid "File too large"
msgstr "Fichier trop grand"

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr "Le fichier contient des donnÃ©es binaires"

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr "Le canal de configuration n'est pas vide"

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr "Erreur d'autorisation"

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr "Contenu du fichier de configuration absent"

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr "DÃ©limiteurs de macro non spÃ©cifiÃ©"

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr "Le canal de configuration n'existe pas"

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr "Le canal de configuration existe dÃ©jÃ "

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr "Fichier absent du canal de configuration"

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr "Une rÃ©vision diffÃ©rente de ce fichier a dÃ©jÃ  Ã©tÃ© transmise"

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr "Ce fichier a dÃ©jÃ  Ã©tÃ© transmis Ã  ce canal de configuration"

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr "La taille du fichier excÃ¨de le quota restant"

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr "Le chemin complet du fichier doit Ãªtre indiquÃ©"

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr "NumÃ©ro de rÃ©vision invalide"

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr "Impossible de comparer des fichiers de types diffÃ©rents"

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
#, fuzzy
msgid "Invalid content encoding"
msgstr "Code item invalide"

#: ../common/rhnException.py:253
#, fuzzy
msgid "Invalid crash name"
msgstr "Nom de paquetage invalide"

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
#, fuzzy
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""
"\n"
"     Une erreur est survenue pendant le traitement de votre demande. Si\n"
"     le problÃ¨me persiste, merci de crÃ©er un rapport d'anomalie sur\n"
"     bugzilla.redhat.com. Si vous choisissez de soumettre ce rapport\n"
"     d'anomalie, assurez-vous d'y adjoindre les dÃ©tails de ce que vous "
"Ã©tiez\n"
"     en train de faire lorsque l'erreur est survenue, ainsi que les dÃ©tails\n"
"     sur la faÃ§on de reproduire le problÃ¨me.\n"

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""
"Message d'erreurÂ :\n"
"    %s\n"

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr "Code de classe d'erreurÂ : %s\n"

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr "Information de classe d'erreurÂ : %s\n"

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr "ExplicationÂ : %s"

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, fuzzy, python-format
msgid "    Extinct package:  %s"
msgstr "Paquet attendu, pas : %s"

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
#, fuzzy
msgid "Linking packages to channels"
msgstr "Canaux de base conflictuels"

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
#, fuzzy
msgid "base-channels"
msgstr "Canaux de base conflictuels"

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, fuzzy, python-format
msgid "Unable to save file %s: %s"
msgstr "Impossible d'accorder des droits au systÃ¨me"

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
#, fuzzy
msgid "print the configuration and exit"
msgstr "Le canal de configuration n'existe pas"

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, fuzzy, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr "Impossible de rechercher le serveur"

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
#, fuzzy
msgid "  12 - Channel do not exist"
msgstr "Le canal spÃ©cifiÃ© n'existe pas."

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""

#~ msgid "Your system was not found in the RHN database"
#~ msgstr "Votre systÃ¨me n'a pas Ã©tÃ© trouvÃ© dans la base de donnÃ©es RHN"

#~ msgid "ISS is disabled on this satellite."
#~ msgstr "ISS est dÃ©sactivÃ© sur ce satellite."

#, fuzzy
#~ msgid "Spacewalk Proxy service not enabled for server profile: \"%s\""
#~ msgstr "Service RHN Proxy non activÃ© pour le profil de serveur : \"%s\""

#, fuzzy
#~ msgid "Red Hat Satellite Welcome Message"
#~ msgstr "Message de bienvenue de Red Hat Network"

#, fuzzy
#~ msgid "Red Hat Satellite Privacy Statement"
#~ msgstr "DÃ©claration de respect de la vie privÃ©e de Red Hat Network"
 07070100000070000081B40000000000000000000000015FBBE8EE0000B63F000000000000000000000000000000000000001B00000000spacewalk-backend/po/gu.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Ankit Patel <ankit@redhat.com>, 2004, 2005, 2006, 2007.
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Gujarati <trans-gu@lists.fedoraproject.org>\n"
"Language: gu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
 07070100000071000081B40000000000000000000000015FBBE8EE0000B603000000000000000000000000000000000000001B00000000spacewalk-backend/po/he.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Hebrew <he-users@lists.fedoraproject.org>\n"
"Language: he\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
 07070100000072000081B40000000000000000000000015FBBE8EE0000B644000000000000000000000000000000000000001B00000000spacewalk-backend/po/hi.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Rajesh Ranjan <rranjan@redhat.com>, 2004, 2005, 2006, 2007.
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Hindi <indlinux-hindi@lists.sourceforge.net>\n"
"Language: hi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
07070100000073000081B40000000000000000000000015FBBE8EE0000B907000000000000000000000000000000000000001B00000000spacewalk-backend/po/hu.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Arpad Biro <biro_arpad@yahoo.com>, 2004, 2005.
# Tamas Szanto <tszanto@mol.hu>, 2004.
# Zoltan HoppÃ¡r <hopparz@gmail.com>, 2012.
# Jiri Dostal <jdostal@redhat.com>, 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2018-03-16 10:54+0000\n"
"Last-Translator: Copied by Zanata <copied-by-zanata@zanata.org>\n"
"Language-Team: Hungarian <trans-hu@lists.fedoraproject.org>\n"
"Language: hu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Zanata 4.6.2\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr "CsomagnÃ©vre szÃ¡mÃ­tott a rendszer, nem erre: %s "

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr "Csomagra szÃ¡mÃ­tott a rendszer, nem erre: %s"

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr "Ã‰rvÃ©nytelen folyamat azonosÃ­tÃ³"

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr "Ez a kiszolgÃ¡lÃ³ ID nem lÃ©tezik tÃ¶bbÃ©"

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr "SzÃ¼ksÃ©ges adat hiÃ¡nyzik"

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr "SzÃ¼ksÃ©ges tagok hiÃ¡nyoznak"

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
#, fuzzy
msgid "Privacy Statement"
msgstr "Red Hat Network Privacy Statement"

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr "SzÃ³tÃ¡rra szÃ¡mÃ­tott mint termÃ©kparamÃ©terre"

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr "Ã‰rvÃ©nytelen Ã©rtÃ©k '%s' for %s (%s)"

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr "Ã‰rvÃ©nytelen Ã©rtÃ©k %s (%s)"

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, fuzzy, python-format
msgid "    Extinct package:  %s"
msgstr "Csomagra szÃ¡mÃ­tott a rendszer, nem erre: %s"

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""

#, fuzzy
#~ msgid "Red Hat Satellite Privacy Statement"
#~ msgstr "Red Hat Network Privacy Statement"
 07070100000074000081B40000000000000000000000015FBBE8EE0001141D000000000000000000000000000000000000001B00000000spacewalk-backend/po/id.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2020-09-12 19:48+0000\n"
"Last-Translator: Kukuh Syafaat <syafaatkukuh@gmail.com>\n"
"Language-Team: Indonesian <https://l10n.opensuse.org/projects/uyuni/backend/"
"id/>\n"
"Language: id\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 3.6.1\n"

#: ../server/apacheAuth.py:66
#, fuzzy, python-format
msgid "incomplete proxy authentication token: %s"
msgstr "token otentikasi proksi tidak lengkap: %s"

#: ../server/apacheAuth.py:84
#, fuzzy, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr "Tanda tangan proksi terkirim %s tidak cocok dengan %s kita."

#: ../server/apacheAuth.py:119
#, fuzzy
msgid "declined proxy authentication"
msgstr "otentikasi proxy yang ditolak"

#: ../server/apacheRequest.py:59
#, fuzzy, python-format
msgid "Invalid request received (%s)."
msgstr "Permintaan tidak valid diterima (%s)."

#: ../server/apacheRequest.py:120
#, fuzzy, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""
"PESAN PENTING BERIKUT:\n"
"%s"

#: ../server/apacheRequest.py:149
#, fuzzy, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""
"Saat menjalankan '%s': tertangkap\n"
"%s : %s (Dalam Bahasa Inggris)"

#: ../server/apacheRequest.py:606
#, fuzzy, python-format
msgid "Invalid URI %s"
msgstr "URI â€œ%sâ€ Tidak Sah"

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, fuzzy, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""
"Akun %s telah dinonaktifkan pada server ini.\n"
"                   Silakan hubungi administrator Organisasi Anda untuk "
"bantuan lebih lanjut."

#: ../server/handlers/applet/applet.py:78
#, fuzzy, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr "Sistem Anda tidak ditemukan dalam rhn database"

#: ../server/handlers/sat/auth.py:45
#, fuzzy
msgid "ISS is disabled on this server."
msgstr "ISS dinonaktifkan di server ini."

#: ../server/handlers/sat/auth.py:50
#, fuzzy, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr "Server \"%s\" tidak diaktifkan untuk ISS."

#: ../server/handlers/xmlrpc/errata.py:64
#, fuzzy, python-format
msgid "Expected a package name, not: %s"
msgstr "Diduga sebuah nama paket, bukan: %s"

#: ../server/handlers/xmlrpc/errata.py:115
#, fuzzy, python-format
msgid "Expected a package, not: %s"
msgstr "Diduga sebuah paket, bukan: %s"

#: ../server/handlers/xmlrpc/proxy.py:65
#, fuzzy, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""
"Layanan Proksi Manajer SUSE tidak diaktifkan untuk profil server: \"%s\""

#: ../server/handlers/xmlrpc/proxy.py:85
#, fuzzy
msgid "Invalid session key"
msgstr "Kunci sesi tidak valid"

#: ../server/handlers/xmlrpc/proxy.py:93
#, fuzzy
msgid "This server ID no longer exists"
msgstr "ID server ini tidak ada lagi"

#: ../server/handlers/xmlrpc/queue.py:433
#, fuzzy, python-format
msgid "Invalid action value type %s (%s)"
msgstr "Tipe nilai tindakan %s (%s) tidak valid"

#: ../server/handlers/xmlrpc/queue.py:464
#, fuzzy, python-format
msgid "Action %s does not belong to server %s"
msgstr "Tindakan %s bukan milik server %s"

#: ../server/handlers/xmlrpc/registration.py:194
#, fuzzy
msgid "Required data missing"
msgstr "Data yang diperlukan hilang"

#: ../server/handlers/xmlrpc/registration.py:198
#, fuzzy
msgid "Required members missing"
msgstr "Anggota yang diperlukan hilang"

#: ../server/handlers/xmlrpc/registration.py:207
#, fuzzy
msgid "Attempt to register a system to an invalid username"
msgstr "Mencoba mendaftarkan sistem ke nama pengguna yang tidak valid"

#: ../server/handlers/xmlrpc/registration.py:839
#, fuzzy
msgid "Invalid system release version requested"
msgstr "Versi rilis sistem tidak valid yang diminta"

#: ../server/handlers/xmlrpc/registration.py:1063
#, fuzzy
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""
"Tidak dapat menemukan antarmuka jaringan yang valid, ipaddr dan ip6addr "
"tidak ditemukan."

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
#, fuzzy
msgid "Privacy Statement"
msgstr "Red Hat Pernyataan Privasi Satelit"

#: ../server/handlers/xmlrpc/registration.py:1146
#, fuzzy
msgid "Expected a dictionary as a product argument"
msgstr "Mengharapkan kamus sebagai argumen produk"

#: ../server/handlers/xmlrpc/registration.py:1374
#, fuzzy, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr "Nilai '%s' tidak valid untuk %s (%s)"

#: ../server/handlers/xmlrpc/scap.py:104
#, fuzzy
msgid "Invalid system_id/action_id pair."
msgstr "Pasangan system_id/action_id tidak valid."

#: ../server/handlers/xmlrpc/up2date.py:233
#, fuzzy, python-format
msgid "Invalid value %s (%s)"
msgstr "Nilai %s (%s) tidak valid"

#: ../server/importlib/userAuth.py:98
#, fuzzy
msgid "You are not authorized to manage packages in the null org"
msgstr "Anda tidak berwenang untuk mengelola paket di null org"

#: ../server/importlib/userAuth.py:103
#, fuzzy, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr "Anda tidak diizinkan untuk mengelola paket dalam organisasi %s"

#: ../server/importlib/userAuth.py:121
#, fuzzy
msgid "You are not allowed to perform administrative tasks"
msgstr "Anda tidak diizinkan untuk melakukan tugas administratif"

#: ../server/importlib/userAuth.py:144
#, fuzzy, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""
"Anda tidak diizinkan untuk mengelola saluran %s, atau saluran tersebut tidak "
"ada"

#: ../server/importlib/userAuth.py:204
#, fuzzy, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""
"Akun %s telah dinonaktifkan pada server ini.\n"
"               Silakan hubungi administrator Organisasi Anda untuk bantuan "
"lebih lanjut."

#: ../server/rhnChannel.py:1992
#, fuzzy, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""
"Akun Anda tidak memiliki akses ke saluran apa pun yang cocok "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"

#: ../server/rhnChannel.py:2002
#, fuzzy
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""
"Jika Anda memiliki nomor registrasi, silakan mendaftar dengan terlebih "
"dahulu di http://www.redhat.com/apps/activate/ dan kemudian coba lagi."

#: ../server/rhnChannel.py:2012
#, fuzzy, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr "Izin berlangganan tidak cukup untuk rilis (%s, %s"

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
#, fuzzy
msgid "System Registered but Inactive"
msgstr "Sistem Terdaftar tetapi Tidak Aktif"

#: ../server/rhnChannel.py:2277
#, fuzzy, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""
"Kombinasi pelepas Arsitektur dan OS tidak valid (%s, %s).\n"
"Sistem Anda telah terdaftar, tetapi tidak akan menerima pembaruan\n"
"karena tidak berlangganan saluran. Jika Anda belum\n"
"mengaktifkan produk Anda untuk layanan, silakan kunjungi website kami di:\n"
"\n"
"http://www.redhat.com/apps/activate/\n"
"\n"
"... untuk mengaktifkan produk Anda."

#: ../server/rhnChannel.py:2288
#, fuzzy, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""
"Kombinasi pelepas Arsitektur dan OS tidak valid (%s, %s).\n"
"Sistem Anda telah terdaftar, tetapi tidak akan menerima pembaruan\n"
"karena tidak dapat di subscribe ke base channel.\n"
"Hubungi administrator organisasi Anda untuk mendapatkan bantuan."

#: ../server/rhnChannel.py:2295
#, fuzzy, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""
"Sistem ini telah berhasil didaftarkan, namun belum\n"
"  layanan.  Untuk memberikan hak sistem ini ke layanan, login ke situs web "
"di:\n"
"\n"
"%(entitlement_url)s (Dalam Bahasa Inggris)"

#: ../server/rhnChannel.py:2303
#, fuzzy, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""
"Sistem ini telah berhasil didaftarkan, tetapi tidak ada hak layanan\n"
"  tersedia.  Untuk memberikan hak sistem ini ke layanan, login ke situs web "
"di:\n"
"\n"
"%(entitlement_url)s (Dalam Bahasa Inggris)"

#: ../server/rhnHandler.py:62
#, fuzzy
msgid "Please run rhn_register as root on this client"
msgstr "Silakan jalankan rhn_register sebagai root pada klien ini"

#: ../server/rhnHandler.py:75
#, fuzzy, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr "Layanan tidak diaktifkan untuk profil sistem: \"%s\""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, fuzzy, python-format
msgid "Invalid RPM package %s requested"
msgstr "Paket RPM %s tidak valid diminta"

#: ../server/rhnPackage.py:112
#, fuzzy
msgid "Package not found"
msgstr "Paket tidak ditemukan"

#: ../server/rhnServer/server_class.py:97
#, fuzzy, python-format
msgid "Architecture `%s' is not supported"
msgstr "Arsitektur '%s' tidak didukung"

#: ../server/rhnServer/server_token.py:78
#, fuzzy, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr "Token '%s' memiliki lebih dari satu saluran dasar yang ditugaskan"

#: ../server/rhnServer/server_token.py:80
#, fuzzy
msgid "Conflicting base channels"
msgstr "Saluran dasar yang bertentangan"

#: ../server/rhnServer/server_token.py:190
#, fuzzy, python-format
msgid "Failed to add server to group %s"
msgstr "Gagal menambahkan server ke grup %s"

#: ../server/rhnServer/server_token.py:503
#, fuzzy, python-format
msgid "Maximum usage count of %s reached"
msgstr "Jumlah penggunaan maksimum dari %s tercapai"

#: ../server/rhnServer/server_token.py:744
#, fuzzy
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""
"Penumpukan token pendaftaran ulang dengan hak dasar yang berbeda tidak "
"didukung"

#: ../server/rhnServer/server_token.py:811
#, fuzzy, python-format
msgid "Could not find token '%s'"
msgstr "Tidak dapat menemukan token '%s'"

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
#, fuzzy
msgid "Tokens from mismatching orgs"
msgstr "Token dari organisasi yang tidak cocok"

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
#, fuzzy
msgid "Kickstart session mismatch"
msgstr "Ketidakcocokan sesi kickstart"

#: ../server/rhnServer/server_token.py:877
#, fuzzy
msgid "Stacking of re-registration tokens is not supported"
msgstr "Penumpukan token pendaftaran ulang tidak didukung"

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
#, fuzzy
msgid "Invalid username/password combination"
msgstr "Kombinasi nama pengguna/kata sandi tidak valid"

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, fuzzy, python-format
msgid "Username `%s' has not been reserved"
msgstr "Nama pengguna '%s' belum dicadangkan"

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
#, fuzzy
msgid "E-mail address not specified"
msgstr "Alamat e-mail tidak ditentukan"

#: ../server/rhnUser.py:509
#, fuzzy, python-format
msgid "username should be at least %d characters"
msgstr "nama pengguna harus setidaknya %d karakter"

#: ../server/rhnUser.py:512
#, fuzzy, python-format
msgid "username should be less than %d characters"
msgstr "nama pengguna harus kurang dari %d karakter"

#: ../server/rhnUser.py:523
#, fuzzy, python-format
msgid "username = `%s', invalid character `%s'"
msgstr "username = '%s', karakter '%s' tidak valid"

#: ../server/rhnUser.py:542
#, fuzzy, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr "Batasi alamat e-mail Anda ke %s chars"

#: ../server/rhnUser.py:623
#, fuzzy, python-format
msgid "password must be at least %d characters"
msgstr "kata sandi harus setidaknya %d karakter"

#: ../server/rhnUser.py:626
#, fuzzy, python-format
msgid "Password must be shorter than %d characters"
msgstr "Kata sandi harus lebih pendek dari karakter %d"

#: ../server/rhnUser.py:644
#, fuzzy, python-format
msgid "password contains character `%s'"
msgstr "kata sandi berisi karakter '%s'"

#: ../server/rhnUser.py:651
#, fuzzy, python-format
msgid "username should be at least %d characters long"
msgstr "username harus setidaknya %d karakter panjang"

#: ../server/rhnUser.py:662
#, fuzzy, python-format
msgid "Cannot register usernames ending with %s"
msgstr "Tidak dapat mendaftarkan nama pengguna yang diakhiri dengan %s"

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
#, fuzzy
msgid "This does not appear to be a valid username."
msgstr "Ini tampaknya tidak menjadi nama pengguna yang valid."

#: ../common/rhnException.py:54
#, fuzzy
msgid "Invalid username and password combination."
msgstr "Kombinasi nama pengguna dan kata sandi tidak valid."

#: ../common/rhnException.py:55
#, fuzzy
msgid "This login is already taken, or the password is incorrect."
msgstr "Login ini sudah diambil, atau sandi tidak benar."

#: ../common/rhnException.py:56
#, fuzzy
msgid "Permission denied."
msgstr "Hak akses ditolak."

#: ../common/rhnException.py:57
#, fuzzy
msgid "Object not found."
msgstr "Objek tidak ditemukan"

#: ../common/rhnException.py:58
#, fuzzy
msgid "Invalid System Digital ID."
msgstr "ID Digital sistem tidak valid."

#: ../common/rhnException.py:59
#, fuzzy
msgid "Invalid System Credentials."
msgstr "Kredensial sistem tidak valid."

#: ../common/rhnException.py:60
#, fuzzy
msgid "Could not retrieve user data from database."
msgstr "Tak bisa mengambil data pengguna dari pangkalan data."

#: ../common/rhnException.py:61
#, fuzzy
msgid "Valid username required."
msgstr "Diperlukan nama pengguna yang valid."

#: ../common/rhnException.py:62
#, fuzzy
msgid "Valid password required."
msgstr "Diperlukan kata sandi yang valid."

#: ../common/rhnException.py:63
#, fuzzy
msgid "Minimum username length violation."
msgstr "Pelanggaran panjang nama pengguna minimum."

#: ../common/rhnException.py:64
#, fuzzy
msgid "Minimum password length violation."
msgstr "Pelanggaran panjang kata sandi minimum."

#: ../common/rhnException.py:65
#, fuzzy
msgid "The username contains invalid characters."
msgstr "Nama pengguna berisi karakter yang tidak valid."

#: ../common/rhnException.py:66
#, fuzzy
msgid "File not found."
msgstr "Berkas tidak ditemukan."

#: ../common/rhnException.py:67
#, fuzzy
msgid "Architecture and OS version combination is not supported."
msgstr "Kombinasi versi arsitektur dan OS tidak didukung."

#: ../common/rhnException.py:68
#, fuzzy
msgid "Could not retrieve system data from database."
msgstr "Tidak dapat mengambil data sistem dari database."

#: ../common/rhnException.py:69
#, fuzzy
msgid "Invalid arguments passed to function."
msgstr "Argumen tidak valid diteruskan ke fungsi."

#: ../common/rhnException.py:70
#, fuzzy
msgid "Unable to retrieve requested entry."
msgstr "Tidak dapat mengambil entri yang diminta."

#: ../common/rhnException.py:71
#, fuzzy
msgid "Could not update database entry."
msgstr "Tidak dapat memperbarui entri database."

#: ../common/rhnException.py:72
#, fuzzy
msgid "Unsupported server architecture."
msgstr "Arsitektur server yang tidak didukung."

#: ../common/rhnException.py:73
#, fuzzy, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""
"Fungsionalitas server anonim tidak lagi tersedia.\n"
"\n"
"Silakan mendaftar ulang sistem ini dengan menjalankan mgr_register sebagai "
"root.\n"
"     Silakan kunjungi https://%(hostname)s/rhn/systems/SystemEntitlements."
"do\n"
"     atau login di https://%(hostname)s, dan dari tab \"Ikhtisar\",\n"
"     pilih \"Manajemen Langganan\" untuk mengaktifkan layanan untuk sistem "
"ini."

#: ../common/rhnException.py:81
#, fuzzy
msgid "Record not available in the database."
msgstr "Catatan tidak tersedia dalam database."

#: ../common/rhnException.py:82
#, fuzzy
msgid "Invalid value for entry."
msgstr "Nilai tidak valid untuk entri."

#: ../common/rhnException.py:83
#, fuzzy, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""
"Sistem ini tidak memiliki hak yang valid untuk Manajer SUSE.\n"
"     Silakan kunjungi https://%(hostname)s/rhn/systems/SystemEntitlements."
"do\n"
"     atau login di https://%(hostname)s, dan dari tab \"Ikhtisar\",\n"
"     pilih \"Manajemen Langganan\" untuk mengaktifkan layanan untuk sistem "
"ini."

#: ../common/rhnException.py:89
#, fuzzy
msgid "Channel error"
msgstr "Kesalahan saluran"

#: ../common/rhnException.py:90
#, fuzzy
msgid "Client session token is invalid."
msgstr "Token sesi klien tidak valid."

#: ../common/rhnException.py:91
#, fuzzy
msgid "Client session token has expired."
msgstr "Token sesi klien telah kedaluwarsa."

#: ../common/rhnException.py:92
#, fuzzy
msgid "You are not authorized to retrieve the requested object."
msgstr "Anda tidak berwenang untuk mengambil objek yang diminta."

#: ../common/rhnException.py:93
#, fuzzy
msgid "Invalid action"
msgstr "Tindakan tidak sah"

#: ../common/rhnException.py:94
#, fuzzy
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""
"Anda tidak diizinkan untuk melakukan tugas administratif pada sistem ini."

#: ../common/rhnException.py:96
#, fuzzy
msgid "The system is already subscribed to the specified channel."
msgstr "Sistem ini sudah berlangganan ke saluran yang ditentukan."

#: ../common/rhnException.py:97
#, fuzzy
msgid "The system is not currently subscribed to the specified channel."
msgstr "Sistem saat ini tidak berlangganan saluran yang ditentukan."

#: ../common/rhnException.py:98
#, fuzzy
msgid "The specified channel does not exist."
msgstr "Saluran yang ditentukan tidak ada."

#: ../common/rhnException.py:99
#, fuzzy
msgid "Invalid channel version."
msgstr "Versi saluran tidak valid."

#: ../common/rhnException.py:100
#, fuzzy
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""
"Batas keanggotaan grup pengguna terlampaui.\n"
"\n"
"Pengaturan saat ini untuk akun Anda tidak memungkinkan Anda menambahkan\n"
"     akun pengguna. Silakan hubungi administrator organisasi untuk\n"
"     akun jika jumlah maksimum pengguna yang diizinkan untuk berlangganan "
"kebutuhan server\n"
"     untuk diubah."

#: ../common/rhnException.py:108
#, fuzzy
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""
"Batas keanggotaan grup sistem terlampaui.\n"
"\n"
"Pengaturan saat ini untuk akun Anda tidak memungkinkan Anda menambahkan\n"
"     profil sistem. Silakan hubungi administrator organisasi untuk\n"
"     akun untuk memodifikasi jumlah maksimum profil sistem yang dapat\n"
"     berlangganan akun Anda."

#: ../common/rhnException.py:116
#, fuzzy
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""
"Arsitektur tidak valid.\n"
"\n"
"Arsitektur paket tidak didukung oleh"

#: ../common/rhnException.py:121
#, fuzzy
msgid "Invalid RPM header"
msgstr "Header RPM tidak valid"

#: ../common/rhnException.py:122
#, fuzzy
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""
"Sistem ini sudah terdaftar sebagai Salt Minion. Jika Anda ingin "
"mendaftarkannya sebagai klien tradisional\n"
"    silakan hapus terlebih dahulu melalui UI web atau API dan kemudian "
"daftarkan menggunakan alat tradisional."

#. For the uploading tools
#: ../common/rhnException.py:127
#, fuzzy
msgid "Invalid information uploaded to the server"
msgstr "Informasi tidak valid yang diunggah ke server"

#: ../common/rhnException.py:128
#, fuzzy
msgid "Error uploading network interfaces configuration."
msgstr "Galat saat mengunggah konfigurasi antarmuka jaringan."

#: ../common/rhnException.py:129
#, fuzzy
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""
"Upload Paket Gagal karena pelanggaran kendala keunikan.\n"
"     Pastikan paket tidak memiliki dependensi duplikat atau\n"
"     belum ada di server"

#: ../common/rhnException.py:134
#, fuzzy
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""
"Opsi --force rhnpush dinonaktifkan di server ini.\n"
"     Hubungi administrator SUSE Manager Anda untuk bantuan lebih lanjut."

#. 60-70: token errors
#: ../common/rhnException.py:140
#, fuzzy
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""
"Token aktivasi yang ditentukan tidak dapat ditemukan di server.\n"
"     Silakan coba lagi dengan kunci yang valid."

#: ../common/rhnException.py:144
#, fuzzy
msgid "Too many systems registered using this registration token"
msgstr "Terlalu banyak sistem yang terdaftar menggunakan token pendaftaran ini"

#: ../common/rhnException.py:145
#, fuzzy
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr "Token berisi pengaturan yang tidak valid, usang, atau tidak memadai"

#: ../common/rhnException.py:146
#, fuzzy
msgid "Conflicting activation tokens"
msgstr "Token aktivasi yang bertentangan"

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
#, fuzzy
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr "Tidak ada saluran dasar yang cocok yang ditemukan untuk sistem Anda."

#: ../common/rhnException.py:152
#, fuzzy
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""
"Anda tidak memiliki izin berlangganan ke saluran yang ditentukan.\n"
"     Lihat channel atau organisasi organisasi Anda\n"
"     administrator untuk rincian lebih lanjut."

#: ../common/rhnException.py:157
#, fuzzy
msgid "You can not unsubscribe from base channel."
msgstr "Anda tidak dapat berhenti berlangganan dari saluran dasar."

#: ../common/rhnException.py:158
#, fuzzy
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr "Manajer SUSE atau saluran Proxy tidak dapat di subscribe."

#. 80-90: server group errors
#: ../common/rhnException.py:161
#, fuzzy
msgid "There was an error while trying to join the system to its groups"
msgstr ""
"Ada kesalahan saat mencoba untuk bergabung dengan sistem untuk kelompok-"
"kelompok"

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
#, fuzzy
msgid "Unable to entitle system"
msgstr "Tidak dapat memberikan hak sistem"

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
#, fuzzy
msgid "Maximum e-mail length violation."
msgstr "Pelanggaran panjang e-mail maksimum."

#: ../common/rhnException.py:168
#, fuzzy
msgid "This system has been previously registered."
msgstr "Sistem ini sebelumnya telah terdaftar."

#: ../common/rhnException.py:169
#, fuzzy
msgid "Invalid username"
msgstr "Username tidak valid"

#. 140-159 applet errors
#: ../common/rhnException.py:172
#, fuzzy
msgid "Unable to look up server"
msgstr "Tidak dapat mencari server"

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
#, fuzzy
msgid "Required argument is missing"
msgstr "Diperlukan argumen yang hilang."

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
#, fuzzy
msgid "No entitlement information tied to hardware"
msgstr "Tidak ada informasi penetapan yang terkait dengan perangkat keras"

#: ../common/rhnException.py:179
#, fuzzy
msgid "Installation number is not entitling"
msgstr "Nomor instalasi tidak entitling"

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
#, fuzzy
msgid "Maximum username length violation"
msgstr "Pelanggaran panjang nama pengguna maksimum"

#: ../common/rhnException.py:183
#, fuzzy
msgid "Maximum password length violation"
msgstr "Pelanggaran panjang kata sandi maksimum"

#: ../common/rhnException.py:184
#, fuzzy
msgid "This user has read only API access. Action denied."
msgstr "Pengguna ini hanya memiliki akses API. Tindakan ditolak."

#: ../common/rhnException.py:186
#, fuzzy
msgid "System Name cannot be less than 1 character"
msgstr "Nama sistem tidak boleh kurang dari 1 karakter"

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
#, fuzzy
msgid "SUSE Manager Proxy error."
msgstr "Galat Proksi Manajer SUSE."

#: ../common/rhnException.py:191
#, fuzzy
msgid "SUSE Manager Proxy unable to login."
msgstr "SUSE Manager Proxy tidak dapat login."

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
#, fuzzy
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""
"ID sistem Proksi Manajer SUSE tidak cocok dengan Server Proksi Spacewalk\n"
"     dalam database."

#: ../common/rhnException.py:197
#, fuzzy
msgid "SUSE Manager Proxy session token is invalid."
msgstr "Token sesi Proksi Manajer SUSE tidak valid."

#: ../common/rhnException.py:198
#, fuzzy
msgid "SUSE Manager Proxy session token has expired."
msgstr "Token sesi Proxy Manajer SUSE telah kedaluwarsa."

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
#, fuzzy
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""
"pembuatan pengguna tidak diperbolehkan melalui mgr_register;\n"
"     silahkan hubungi sysadmin Anda untuk memiliki account Anda dibuat."

#: ../common/rhnException.py:206
#, fuzzy
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""
"Server Manajer SUSE ini tidak diizinkan untuk menggunakan Inter Server Sync "
"di server ini"

#: ../common/rhnException.py:209
#, fuzzy
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr "Inter Server sync dinonaktifkan pada Server manajer SUSE ini."

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
#, fuzzy
msgid "Invalid datatype passed"
msgstr "Tipe data tidak valid dilewatkan"

#: ../common/rhnException.py:215
#, fuzzy
msgid "Unable to retrieve channel"
msgstr "Tidak dapat mengambil saluran"

#: ../common/rhnException.py:216
#, fuzzy
msgid "Unable to retrieve package"
msgstr "Tidak dapat mengambil paket"

#: ../common/rhnException.py:217
#, fuzzy
msgid "Unable to retrieve erratum"
msgstr "Tidak dapat mengambil erratum"

#: ../common/rhnException.py:218
#, fuzzy
msgid "File is missing"
msgstr "Berkas hilang"

#: ../common/rhnException.py:219
#, fuzzy
msgid "Function retrieval error"
msgstr "Galat pengambilan fungsi"

#: ../common/rhnException.py:220
#, fuzzy
msgid "Function execution error"
msgstr "Galat eksekusi fungsi"

#: ../common/rhnException.py:221
#, fuzzy
msgid "Missing version string"
msgstr "String versi hilang"

#: ../common/rhnException.py:222
#, fuzzy
msgid "Invalid version string"
msgstr "String versi tidak valid"

#: ../common/rhnException.py:223
#, fuzzy
msgid "Mismatching versions"
msgstr "Versi yang tidak cocok"

#: ../common/rhnException.py:224
#, fuzzy
msgid "Invalid channel version"
msgstr "Versi saluran tidak valid"

#: ../common/rhnException.py:225
#, fuzzy
msgid "No comps file for channel"
msgstr "Tidak ada file comps untuk saluran"

#: ../common/rhnException.py:226
#, fuzzy
msgid "Unable to retrieve comps file"
msgstr "Tidak dapat mengambil berkas comps"

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
#, fuzzy
msgid "Configuration action missing"
msgstr "Tindakan konfigurasi hilang"

#: ../common/rhnException.py:230
#, fuzzy
msgid "File too large"
msgstr "Berkas terlalu besar"

#: ../common/rhnException.py:231
#, fuzzy
msgid "File contains binary data"
msgstr "File berisi data biner"

#: ../common/rhnException.py:232
#, fuzzy
msgid "Configuration channel is not empty"
msgstr "Saluran konfigurasi tidak kosong"

#: ../common/rhnException.py:233
#, fuzzy
msgid "Permission error"
msgstr "Galat izin"

#: ../common/rhnException.py:234
#, fuzzy
msgid "Content missing for configuration file"
msgstr "Konten hilang untuk file konfigurasi"

#: ../common/rhnException.py:235
#, fuzzy
msgid "Template delimiters not specified"
msgstr "Pembatas templat tidak ditentukan"

#: ../common/rhnException.py:236
#, fuzzy
msgid "Configuration channel does not exist"
msgstr "Saluran konfigurasi tidak ada"

#: ../common/rhnException.py:237
#, fuzzy
msgid "Configuration channel already exists"
msgstr "Saluran konfigurasi sudah ada"

#: ../common/rhnException.py:238
#, fuzzy
msgid "File missing from configuration channel"
msgstr "File hilang dari saluran konfigurasi"

#: ../common/rhnException.py:239
#, fuzzy
msgid "Different revision of this file is uploaded"
msgstr "Revisi yang berbeda dari file ini diunggah"

#: ../common/rhnException.py:240
#, fuzzy
msgid "File already uploaded to configuration channel"
msgstr "File yang sudah diunggah ke saluran konfigurasi"

#: ../common/rhnException.py:241
#, fuzzy
msgid "File size exceeds remaining quota space"
msgstr "Ukuran file melebihi ruang kuota yang tersisa"

#: ../common/rhnException.py:242
#, fuzzy
msgid "Full path of file must be specified"
msgstr "Path lengkap file harus ditentukan"

#: ../common/rhnException.py:243
#, fuzzy
msgid "Invalid revision number"
msgstr "Nomor revisi tidak valid"

#: ../common/rhnException.py:244
#, fuzzy
msgid "Cannot compare files of different file type"
msgstr "Tidak dapat membandingkan berkas jenis berkas yang berbeda"

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
#, fuzzy
msgid "Crash information is invalid or incomplete"
msgstr "Informasi kerusakan tidak valid atau tidak lengkap"

#: ../common/rhnException.py:249
#, fuzzy
msgid "Crash file information is invalid or incomplete"
msgstr "Informasi berkas lumpuh tidak valid atau tidak lengkap"

#: ../common/rhnException.py:250
#, fuzzy
msgid "Error composing crash directory path"
msgstr "Galat saat menyusun jalur direktori crash"

#: ../common/rhnException.py:251
#, fuzzy
msgid "Error composing crash file path"
msgstr "Galat saat menyusun jalur berkas lumpuh"

#: ../common/rhnException.py:252 ../common/rhnException.py:259
#, fuzzy
msgid "Invalid content encoding"
msgstr "Pengkodean konten tidak valid"

#: ../common/rhnException.py:253
#, fuzzy
msgid "Invalid crash name"
msgstr "Nama crash tidak valid"

#: ../common/rhnException.py:254
#, fuzzy
msgid "Crash reporting is disabled for this organization"
msgstr "Pelaporan kerusakan dinonaktifkan untuk organisasi ini"

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
#, fuzzy
msgid "SCAP results file transfer is invalid or incomplete"
msgstr "Transfer berkas hasil SCAP tidak valid atau tidak lengkap"

#: ../common/rhnException.py:257
#, fuzzy
msgid "Error composing directory path for detailed SCAP results"
msgstr "Galat saat menyusun jalur direktori untuk hasil SCAP terperinci"

#: ../common/rhnException.py:258
#, fuzzy
msgid "Error composing file path for detailed SCAP results"
msgstr "Galat saat menyusun jalur berkas untuk hasil SCAP rinci"

#: ../common/rhnException.py:306
#, fuzzy
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""
"Telah terjadi galat saat memproses permintaan Anda. Jika masalah ini\n"
"     tetap ada, silakan masukkan laporan bug di scc.suse.com.\n"
"     Jika Anda memilih untuk mengirimkan laporan bug, pastikan untuk\n"
"     rincian dari apa yang Anda coba lakukan ketika kesalahan ini terjadi "
"dan\n"
"     rincian tentang cara mereproduksi masalah ini."

#: ../common/rhnException.py:358
#, fuzzy, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr "Pesan kesalahan tak tertangani: %s"

#: ../common/rhnException.py:360
#, fuzzy, python-format
msgid "Error Class Code: %s\n"
msgstr "Kode Kelas Galat: %s"

#: ../common/rhnException.py:363
#, fuzzy, python-format
msgid "Error Class Info: %s\n"
msgstr "Galat Info Kelas: %s"

#: ../common/rhnException.py:365
#, fuzzy, python-format
msgid "Explanation: %s"
msgstr "Penjelasan: %s"

#: ../common/rhnTB.py:205
#, fuzzy, python-format
msgid "ERROR: %s %s: %s"
msgstr "GALAT: %s %s: %s"

#: ../common/rhnTB.py:207
#, fuzzy, python-format
msgid "TRACEBACK: %s"
msgstr "TRACEBACK: %s (Dalam Bahasa Inggris)"

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, fuzzy, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr "format dari %s harus setidaknya YYYYMMDD."

#: ../satellite_tools/messages.py:26
#, fuzzy, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""
"GALAT: menjalankan langkah %s. Galat adalah:\n"
"%s"

#: ../satellite_tools/messages.py:31
#, fuzzy, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""
"ERROR: ada masalah saat mengakses data channel dari\n"
"       Repositori. Apakah Anda memigrasikan semua data dari ISO saluran\n"
"       melakukan direktori ini? Jika demikian, silakan periksa kembali "
"saluran ISOs, pastikan\n"
"       bahwa Anda memiliki mereka semua, dan kemudian berulang-ulang dan "
"mengisi kembali\n"
"       repositori sementara (%s)."

#: ../satellite_tools/messages.py:39
#, fuzzy, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""
"GALAT: ada masalah sinkronisasi informasi.\n"
"       Pesan galat: %s"

#: ../satellite_tools/messages.py:44
#, fuzzy, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""
"GALAT: Ada masalah berkomunikasi dengan ISS Master.\n"
"       Tergantung pada rincian kesalahan tertentu, silakan tinjau "
"konfigurasi Anda,\n"
"       konektivitas jaringan dasar, dan/atau resolusi nama, dan coba lagi.\n"
"       Pesan galat: %s"

#: ../satellite_tools/messages.py:51
#, fuzzy, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""
"GALAT: Ada masalah berkomunikasi dengan ISS Master.\n"
"       Jika satelit master lebih tua dari v5.3, itu tidak memiliki kemampuan "
"ISS.\n"
"       Jika tidak, tergantung pada rincian kesalahan tertentu, harap tinjau\n"
"       konfigurasi, konektivitas jaringan dasar, dan/atau resolusi nama, dan "
"coba lagi.\n"
"       Pesan galat: %s"

#: ../satellite_tools/messages.py:59
#, fuzzy, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""
"GALAT: saluran anak tidak dapat disinkronkan tanpa induknya disinkronkan "
"sebagai\n"
"       Baik. Orang tua harus (a) sebelumnya disinkronkan atau (b) "
"disinkronkan\n"
"       bersama-sama dengan saluran anak yang diinginkan. Orang tua yang "
"hilang untuk ini\n"
"       Transaksi:\n"
"       %s"

#: ../satellite_tools/messages.py:67
#, fuzzy, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""
"ERROR: Anda tidak berhak menyinkronkan saluran dalam serangkaian saluran "
"ini.\n"
"Silakan hubungi kontak SUSE Manager Anda\n"
"%s"

#: ../satellite_tools/messages.py:72
#, fuzzy, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr "GALAT: tidak cukup ruang kosong (%s KB) pada perangkat."

#: ../satellite_tools/messages.py:74
#, fuzzy, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr "%3d/%s Fetch berhasil: %s (%s bytes)"

#: ../satellite_tools/messages.py:75
#, fuzzy, python-format
msgid "    Extinct package:  %s"
msgstr "Paket punah: %s"

#: ../satellite_tools/messages.py:76
#, fuzzy, python-format
msgid "   Total size: %s"
msgstr "Total ukuran: %s"

#: ../satellite_tools/messages.py:77
#, fuzzy, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr "Diunduh %s dari %s. Perkiraan sisa waktu: %s"

#: ../satellite_tools/messages.py:78
#, fuzzy, python-format
msgid "    Fetch unsuccessful: %s"
msgstr "Fetch gagal: %s"

#: ../satellite_tools/messages.py:79
#, fuzzy, python-format
msgid "   RPM fetch summary: %s"
msgstr "Ringkasan pengambilan RPM: %s"

#: ../satellite_tools/messages.py:80
#, fuzzy, python-format
msgid "       success: %d"
msgstr "sukses: %d"

#: ../satellite_tools/messages.py:81
#, fuzzy, python-format
msgid "       failed:  %d"
msgstr "Impor yang gagal (%d)"

#: ../satellite_tools/messages.py:82
#, fuzzy, python-format
msgid "       extinct: %d"
msgstr "punah: %d"

#: ../satellite_tools/messages.py:84
#, fuzzy, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr "Mengambil / mem-parsing *relevan* metadata paket: %s (%s)"

#: ../satellite_tools/messages.py:85
#, fuzzy, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr "Mengambil / mengurai data errata: %s (%s)"

#: ../satellite_tools/messages.py:86
#, fuzzy, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr "Mengambil / mengurai data kickstart: %s (%s)"

#: ../satellite_tools/messages.py:87
#, fuzzy, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr "Mengambil / mengurai berkas pohon kickstart: %s (%s)"

#: ../satellite_tools/messages.py:88
#, fuzzy, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr "Mengimpor metadata paket *relevant*: %s (%s)"

#: ../satellite_tools/messages.py:89
#, fuzzy
msgid "   * WARNING: this may be a slow process."
msgstr "* PERINGATAN: ini mungkin proses yang lambat."

#: ../satellite_tools/messages.py:90
#, fuzzy
msgid "Linking packages to channels"
msgstr "Menautkan paket ke saluran"

#: ../satellite_tools/messages.py:91
#, fuzzy, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr "Mengimpor *relevan* errata: %s (%s)"

#: ../satellite_tools/messages.py:92
#, fuzzy
msgid "   No new kickstartable tree to import"
msgstr "Tidak ada pohon kickstartable baru untuk mengimpor"

#: ../satellite_tools/messages.py:93
#, fuzzy, python-format
msgid "Importing kickstartable trees (%d)"
msgstr "Mengimpor pohon kickstartable (%d)"

#: ../satellite_tools/messages.py:94
#, fuzzy, python-format
msgid "Imported kickstartable trees (%d)"
msgstr "Pohon kickstartable impor (%d)"

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
#, fuzzy
msgid "+++ sending log as an email +++"
msgstr "+++ mengirim log sebagai email +++"

#: ../satellite_tools/reposync.py:114
#, fuzzy, python-format
msgid "%s sync. report from %s"
msgstr "Sinkronisasi %s. laporan dari %s"

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
#, fuzzy
msgid "+++ email requested, but there is nothing to send +++"
msgstr "+++ email yang diminta, tetapi tidak ada yang bisa dikirim +++"

#: ../satellite_tools/rhn_satellite_activate.py:198
#, fuzzy, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""
"\"%s\" (ditentukan dalam baris perintah)\n"
"tidak dapat dibuka dan dibaca:\n"
"%s"

#: ../satellite_tools/rhn_satellite_activate.py:205
#, fuzzy, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""
"\"%s\" tidak dapat dibuka\n"
"dan/atau tertulis kepada:\n"
"%s"

#: ../satellite_tools/satsync.py:258
#, fuzzy, python-format
msgid "No handler for step %s"
msgstr "Tidak ada handler untuk langkah %s"

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
#, fuzzy
msgid "Environment changed, trying again..."
msgstr "Lingkungan berubah, mencoba lagi ..."

#: ../satellite_tools/satsync.py:277
#, fuzzy
msgid "ERROR: Encountered IntegrityError: \n"
msgstr "GALAT: Mengalami IntegrityError:"

#: ../satellite_tools/satsync.py:285
#, fuzzy
msgid "Repeated failures"
msgstr "Kegagalan berulang"

#: ../satellite_tools/satsync.py:290
#, fuzzy, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""
"Impor selesai:\n"
"        Waktu mulai: %s\n"
"        Waktu akhir: %s\n"
"        Berlalu: %s"

#: ../satellite_tools/satsync.py:311
#, fuzzy
msgid "hours"
msgstr "jam"

#: ../satellite_tools/satsync.py:311
#, fuzzy
msgid "minutes"
msgstr "menit"

#: ../satellite_tools/satsync.py:311
#, fuzzy
msgid "seconds"
msgstr "detik"

#: ../satellite_tools/satsync.py:357
#, fuzzy
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""
"GALAT: Dump hilang paket data, gunakan --no-rpms untuk melewati langkah ini "
"atau memperbaiki konten untuk menyertakan paket data."

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
#, fuzzy
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr "Master Manajer SUSE tidak mendukung sinkronisasi data organisasi."

#: ../satellite_tools/satsync.py:404
#, fuzzy
msgid "Skipping..."
msgstr "Melewatkan: %s\n"

#: ../satellite_tools/satsync.py:442
#, fuzzy, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr "Sinkronisasi SUSE Manager Inter Server. laporan dari %s"

#: ../satellite_tools/satsync.py:521
#, fuzzy
msgid " - file-system synchronization"
msgstr "- Sinkronisasi sistem file"

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
#, fuzzy
msgid " - live synchronization"
msgstr "- Sinkronisasi langsung"

#: ../satellite_tools/satsync.py:534
#, fuzzy, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""
"KESALAHAN: Sinkronisasi konten langsung dengan RHN Classic Hosted tidak lagi "
"didukung.\n"
"Silakan gunakan perintah cdn-sync sebagai gantinya kecuali Jika Anda mencoba "
"untuk menyinkronkan dari Satelit lain melalui Inter-Satelite-Sync (ISS), "
"atau dari konten lokal pada disk melalui Channel Dump ISOs."

#: ../satellite_tools/satsync.py:542
#, fuzzy, python-format
msgid "   url: %s"
msgstr "URL: %s"

#: ../satellite_tools/satsync.py:543
#, fuzzy, python-format
msgid "   debug/output level: %s"
msgstr "tingkat debug/keluaran: %s"

#: ../satellite_tools/satsync.py:553
#, fuzzy
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr "GALAT: server ini harus terdaftar di SUSE Manager."

#: ../satellite_tools/satsync.py:575
#, fuzzy, python-format
msgid "Retrieving / parsing %s data"
msgstr "Mengambil / mengurai data %s"

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
#, fuzzy
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr "SISTEM INTERUPSI DISEBUT ***"

#: ../satellite_tools/satsync.py:593
#, fuzzy
msgid "ERROR: fatal parser exception occurred "
msgstr "GALAT: pengecualian parser fatal terjadi"

#: ../satellite_tools/satsync.py:594
#, fuzzy, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr "(baris: %s, col: %s msg: %s)"

#: ../satellite_tools/satsync.py:598
#, fuzzy, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr "GALAT: pengecualian parser terjadi: %s"

#: ../satellite_tools/satsync.py:603
#, fuzzy
msgid "ERROR: exception (during parse) occurred: "
msgstr "GALAT: pengecualian (selama parse) terjadi:"

#: ../satellite_tools/satsync.py:604
#, fuzzy, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""
"Mengalami beberapa kesalahan dengan data %s (lihat log (%s) untuk informasi "
"lebih lanjut)"

#: ../satellite_tools/satsync.py:606
#, fuzzy, python-format
msgid "   Encountered some errors with %s data:"
msgstr "Mengalami beberapa kesalahan dengan data %s:"

#: ../satellite_tools/satsync.py:607
#, fuzzy, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr "------- GALAT PARSE/IMPORT %s -------"

#: ../satellite_tools/satsync.py:609
#, fuzzy
msgid "   ---------------------------------------"
msgstr "---------------------------------------"

#: ../satellite_tools/satsync.py:612
#, fuzzy, python-format
msgid "%s data complete"
msgstr "%s data selesai"

#: ../satellite_tools/satsync.py:665
#, fuzzy
msgid "Retrieving / parsing channel data"
msgstr "Mengambil / mengurai data saluran"

#: ../satellite_tools/satsync.py:718
#, fuzzy
msgid "Channel data complete"
msgstr "Data saluran selesai"

#: ../satellite_tools/satsync.py:736
#, fuzzy, python-format
msgid "%10s import from %s"
msgstr "%10s mengimpor dari %s"

#: ../satellite_tools/satsync.py:739
#, fuzzy, python-format
msgid "%10s import from %s - %s"
msgstr "%10s mengimpor dari %s - %s"

#: ../satellite_tools/satsync.py:743
#, fuzzy, python-format
msgid "%10s"
msgstr "-10s"

#: ../satellite_tools/satsync.py:750
#, fuzzy
msgid "p"
msgstr "P"

#: ../satellite_tools/satsync.py:752
#, fuzzy
msgid "."
msgstr "."

#: ../satellite_tools/satsync.py:758
#, fuzzy
msgid "   p = previously imported/synced channel"
msgstr "p = saluran yang diimpor/disinkronkan sebelumnya"

#: ../satellite_tools/satsync.py:759
#, fuzzy
msgid "   . = channel not yet imported/synced"
msgstr ". = saluran belum diimpor / disinkronkan"

#: ../satellite_tools/satsync.py:765
#, fuzzy
msgid "   e = channel no longer supported (end-of-service)"
msgstr "e = saluran tidak lagi didukung (akhir layanan)"

#: ../satellite_tools/satsync.py:767
#, fuzzy
msgid "   ? = channel label invalid --- typo?"
msgstr "? = label saluran tidak --- kesalahan ketik?"

#: ../satellite_tools/satsync.py:771
#, fuzzy, python-format
msgid "   %s:"
msgstr "Untuk: %s"

#: ../satellite_tools/satsync.py:772
#, fuzzy, python-format
msgid "      %s %-40s %4s %s"
msgstr "%s %-40s %4s %s"

#: ../satellite_tools/satsync.py:773
#, fuzzy
msgid "base-channels"
msgstr "saluran dasar"

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
#, fuzzy
msgid "NONE RELEVANT"
msgstr "TIDAK ADA YANG RELEVAN"

#: ../satellite_tools/satsync.py:808
#, fuzzy
msgid "end-of-service"
msgstr "akhir layanan"

#: ../satellite_tools/satsync.py:809
#, fuzzy
msgid "e"
msgstr "e"

#: ../satellite_tools/satsync.py:815
#, fuzzy
msgid "   typos:"
msgstr "Typos:"

#: ../satellite_tools/satsync.py:816
#, fuzzy
msgid "?"
msgstr "?"

#: ../satellite_tools/satsync.py:831
#, fuzzy, python-format
msgid "XXX: imported channels: %s"
msgstr "XXX: saluran yang diimpor: %s"

#: ../satellite_tools/satsync.py:832
#, fuzzy, python-format
msgid "XXX:   cached channels: %s"
msgstr "XXX: saluran cache: %s"

#: ../satellite_tools/satsync.py:837
#, fuzzy
msgid "XXX: list channels called"
msgstr "XXX: daftar saluran yang disebut"

#: ../satellite_tools/satsync.py:855
#, fuzzy
msgid "ERROR: these channels either do not exist or are not available:"
msgstr "GALAT: saluran ini tidak ada atau tidak tersedia:"

#: ../satellite_tools/satsync.py:859
#, fuzzy, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr "(untuk melihat daftar label saluran: %s --list-channels)"

#: ../satellite_tools/satsync.py:904
#, fuzzy, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr "Mengambil / mengurai metadata paket pendek: %s (%s)"

#: ../satellite_tools/satsync.py:965
#, fuzzy, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr "Metadata paket diffing (apa yang hilang secara lokal?): %s"

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
#, fuzzy
msgid "Diffing:    "
msgstr "Diffing:"

#: ../satellite_tools/satsync.py:988
#, fuzzy
msgid "ERROR: incremental dump skipped"
msgstr "GALAT: inkremental dump dilewati"

#: ../satellite_tools/satsync.py:1079
#, fuzzy
msgid "Downloading rpm packages"
msgstr "Mengunduh paket rpm"

#: ../satellite_tools/satsync.py:1084
#, fuzzy, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr "Mengambil RPM yang hilang: %s (%s)"

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
#, fuzzy
msgid "NONE MISSING"
msgstr "TIDAK ADA YANG HILANG"

#: ../satellite_tools/satsync.py:1094
#, fuzzy
msgid "Processing rpm packages complete"
msgstr "Memproses paket rpm lengkap"

#: ../satellite_tools/satsync.py:1121
#, fuzzy
msgid "Downloading package metadata"
msgstr "Mengunduh metadata paket"

#: ../satellite_tools/satsync.py:1146
#, fuzzy
msgid "Downloading srpm packages"
msgstr "Mengunduh paket srpm"

#: ../satellite_tools/satsync.py:1152
#, fuzzy, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr "Mengambil SRPM yang hilang: %s (%s)"

#: ../satellite_tools/satsync.py:1249
#, fuzzy, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr "Metadata paket sumber diffing (apa yang hilang secara lokal?): %s"

#: ../satellite_tools/satsync.py:1260
#, fuzzy
msgid "Downloading source package metadata"
msgstr "Mengunduh metadata paket sumber"

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, fuzzy, python-format
msgid "Unable to save file %s: %s"
msgstr "Tidak dapat menyimpan berkas %s: %s"

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, fuzzy, python-format
msgid "Failed to fetch file %s"
msgstr "Gagal mengambil berkas %s"

#: ../satellite_tools/satsync.py:1350
#, fuzzy
msgid "Downloading kickstartable trees metadata"
msgstr "Mengunduh metadata pohon kickstartable"

#: ../satellite_tools/satsync.py:1365
#, fuzzy
msgid "Downloading kickstartable trees files"
msgstr "Mengunduh file pohon kickstartable"

#: ../satellite_tools/satsync.py:1504
#, fuzzy, python-format
msgid "Grabbing all patches for channel %s"
msgstr "Meraih semua patch untuk saluran %s"

#: ../satellite_tools/satsync.py:1554
#, fuzzy
msgid "Downloading patch data"
msgstr "Mengunduh data patch"

#: ../satellite_tools/satsync.py:1556
#, fuzzy
msgid "Forcing download of all patch data for requested channels."
msgstr "Memaksa pengunduhan semua data patch untuk saluran yang diminta."

#: ../satellite_tools/satsync.py:1571
#, fuzzy
msgid "Downloading patch data complete"
msgstr "Mengunduh data patch selesai"

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
#, fuzzy
msgid "Downloading:"
msgstr "Unduh:"

#: ../satellite_tools/satsync.py:1579
#, fuzzy
msgid " - complete"
msgstr "%s Selesai"

#: ../satellite_tools/satsync.py:1624
#, fuzzy
msgid "Importing source package metadata"
msgstr "Mengimpor metadata paket sumber"

#: ../satellite_tools/satsync.py:1627
#, fuzzy
msgid "Importing package metadata"
msgstr "Mengimpor metadata paket"

#: ../satellite_tools/satsync.py:1635
#, fuzzy
msgid "Importing:  "
msgstr "Mengimpor..."

#. not in the cache
#: ../satellite_tools/satsync.py:1703
#, fuzzy
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""
"Paket tidak ditemukan di Cache, Kosongkan Cache untuk meregenerasi itu.Paket "
"tidak ditemukan di Cache, Kosongkan Cache untuk meregenerasi itu."

#: ../satellite_tools/satsync.py:1709
#, fuzzy
msgid "Importing channel patches"
msgstr "Mengimpor patch saluran"

#: ../satellite_tools/satsync.py:1714
#, fuzzy, python-format
msgid "Importing %s patches for channel %s."
msgstr "Mengimpor patch %s untuk saluran %s."

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
#, fuzzy
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr "GALAT: server.mount_point tidak ditetapkan dalam berkas konfigurasi"

#: ../satellite_tools/satsync.py:2117
#, fuzzy, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr "GALAT: server.mount_point %s tidak ada"

#: ../satellite_tools/satsync.py:2122
#, fuzzy, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr "GALAT: jalur di server.mount_point (%s) tidak ada"

#: ../satellite_tools/satsync.py:2199
#, fuzzy, python-format
msgid "Commandline: %s"
msgstr "Baris perintah: %s"

#: ../satellite_tools/satsync.py:2202
#, fuzzy, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""
"DEBUG HANYA: max. batch-size untuk XML/database-import processing (1..%s).\" "
"manusia satelit-sync\" untuk informasi lebih lanjut."

#: ../satellite_tools/satsync.py:2205
#, fuzzy
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr "alternatif SSL CA Cert (fullpath ke cert file)"

#: ../satellite_tools/satsync.py:2207
#, fuzzy
msgid "process data for this channel only"
msgstr "data proses untuk saluran ini saja"

#: ../satellite_tools/satsync.py:2209
#, fuzzy
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""
"dump disk akan dianggap sebagai ekspor penuh; lihat \"man satellite-sync\" "
"untuk informasi lebih lanjut."

#: ../satellite_tools/satsync.py:2212
#, fuzzy
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr "saluran kustom yang ada juga akan disinkronkan (kecuali -c digunakan)"

#: ../satellite_tools/satsync.py:2214
#, fuzzy, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""
"menimpa tingkat debug yang ditetapkan dalam /etc/rhn/rhn.conf (yang saat ini "
"disedingkan di %s)."

#: ../satellite_tools/satsync.py:2216
#, fuzzy, python-format
msgid "requested version of XML dump (default: %s)"
msgstr "versi yang diminta dari dump XML (default: %s)"

#: ../satellite_tools/satsync.py:2218
#, fuzzy
msgid "e-mail a report of what was synced/imported"
msgstr "e-mail laporan tentang apa yang disinkronkan / diimpor"

#: ../satellite_tools/satsync.py:2220
#, fuzzy
msgid "forcibly process all (not a diff of) patch metadata"
msgstr "secara paksa memproses semua (bukan diff) patch metadata"

#: ../satellite_tools/satsync.py:2222
#, fuzzy
msgid "Do not use an http proxy under any circumstances."
msgstr "Jangan gunakan proxy http dalam keadaan apa pun."

#: ../satellite_tools/satsync.py:2224
#, fuzzy
msgid "alternative http proxy (hostname:port)"
msgstr "alternatif http proxy (hostname:port)"

#: ../satellite_tools/satsync.py:2226
#, fuzzy
msgid "alternative http proxy username"
msgstr "alternatif http proxy username"

#: ../satellite_tools/satsync.py:2228
#, fuzzy
msgid "alternative http proxy password"
msgstr "kata sandi proxy http alternatif"

#: ../satellite_tools/satsync.py:2230
#, fuzzy
msgid "parent SUSE Manager to import content from"
msgstr "induk SUSE Manager untuk mengimpor konten dari"

#: ../satellite_tools/satsync.py:2232
#, fuzzy
msgid "list all available channels and exit"
msgstr "daftar semua saluran yang tersedia dan keluar"

#: ../satellite_tools/satsync.py:2234
#, fuzzy
msgid "help on all error codes mgr-inter-sync returns"
msgstr "bantuan pada semua kode kesalahan mgr-inter-sync kembali"

#: ../satellite_tools/satsync.py:2236
#, fuzzy
msgid "source mount point for import - disk update only"
msgstr "titik pasang sumber untuk impor - hanya pembaruan disk"

#: ../satellite_tools/satsync.py:2238
#, fuzzy
msgid "do not process patch data"
msgstr "jangan memproses data patch"

#: ../satellite_tools/satsync.py:2240
#, fuzzy
msgid "do not process kickstart data (provisioning only)"
msgstr "jangan memproses data kickstart (hanya penyediaan)"

#: ../satellite_tools/satsync.py:2242
#, fuzzy
msgid "do not process full package metadata"
msgstr "tidak memproses metadata paket lengkap"

#: ../satellite_tools/satsync.py:2244
#, fuzzy
msgid "do not download, or process any RPMs"
msgstr "tidak mengunduh, atau memproses RPM apa pun"

#: ../satellite_tools/satsync.py:2246
#, fuzzy
msgid "turn off SSL (not recommended)"
msgstr "menonaktifkan SSL (tidak disarankan)"

#: ../satellite_tools/satsync.py:2248
#, fuzzy
msgid "org to which the sync imports data. defaults to the admin account"
msgstr "organisasi tempat sinkronisasi mengimpor data. default ke akun admin"

#: ../satellite_tools/satsync.py:2250
#, fuzzy
msgid "print the configuration and exit"
msgstr "mencetak konfigurasi dan keluar"

#: ../satellite_tools/satsync.py:2252
#, fuzzy
msgid "alternative server with which to connect (hostname)"
msgstr "server alternatif yang digunakan untuk menghubungkan (nama host)"

#: ../satellite_tools/satsync.py:2254
#, fuzzy
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""
"sinkronisasi ke langkah ini (man satellite-sync untuk info lebih lanjut)"

#: ../satellite_tools/satsync.py:2256
#, fuzzy
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr "menulis data lengkap ke tempfile sebelum streaming ke sisa aplikasi"

#: ../satellite_tools/satsync.py:2258
#, fuzzy
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr "DEBUG HANYA: jalur alternatif ke id sistem digital"

#: ../satellite_tools/satsync.py:2260
#, fuzzy
msgid "alternative email address(es) for sync output (--email option)"
msgstr "alamat email alternatif untuk output sinkronisasi (--opsi email)"

#: ../satellite_tools/satsync.py:2262
#, fuzzy
msgid "do not remove rpms when importing from local dump"
msgstr "tidak menghapus rpm saat mengimpor dari dump lokal"

#: ../satellite_tools/satsync.py:2264
#, fuzzy
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""
"nama domain yang memenuhi syarat dari satelit master. Hanya valid dengan --"
"mount-point. Diperlukan jika Anda ingin mengimpor data organisasi dan izin "
"saluran."

#: ../satellite_tools/satsync.py:2274
#, fuzzy, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""
"GALAT: argumen ini tidak masuk akal dalam konteks ini (coba --help): "
"%sGALAT: argumen ini tidak masuk akal dalam konteks ini (coba --help): %s"

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, fuzzy, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr "GALAT: Tidak dapat menyambung ke pangkalan data: %s"

#: ../satellite_tools/satsync.py:2287
#, fuzzy
msgid "ERROR: Check if your database is running."
msgstr "GALAT: Periksa apakah database Anda berjalan."

#: ../satellite_tools/satsync.py:2322
#, fuzzy, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr "GALAT: --debug-level mengambil nilai bilangan bulat dalam kisaran %s."

#: ../satellite_tools/satsync.py:2324
#, fuzzy
msgid "  0  - little logging/messaging."
msgstr "0 - sedikit penebangan / pesan."

#: ../satellite_tools/satsync.py:2325
#, fuzzy
msgid "  1  - minimal logging/messaging."
msgstr "1 - minimal penebangan / pesan."

#: ../satellite_tools/satsync.py:2326
#, fuzzy
msgid "  2  - normal level of logging/messaging."
msgstr "2 - tingkat normal penebangan / pesan."

#: ../satellite_tools/satsync.py:2327
#, fuzzy
msgid "  3  - lots of logging/messaging."
msgstr "3 - banyak penebangan / pesan."

#: ../satellite_tools/satsync.py:2328
#, fuzzy
msgid "  4+ - excessive logging/messaging."
msgstr "4+ - penebangan/pesan yang berlebihan."

#: ../satellite_tools/satsync.py:2341
#, fuzzy
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr "GALAT: Opsi --master hanya berlaku dengan opsi --mount-point"

#: ../satellite_tools/satsync.py:2351
#, fuzzy, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr "GALAT: Tidak dapat mencari Id Organisasi %s"

#: ../satellite_tools/satsync.py:2360
#, fuzzy
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""
"PERINGATAN: Opsi --list-channels menimpa opsi --step apa pun. --langkah "
"diabaikan."

#: ../satellite_tools/satsync.py:2375
#, fuzzy, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""
"GALAT: '%s' bukan langkah yang valid. Lihat 'man satellite-sync' untuk "
"detail lebih lanjut."

#: ../satellite_tools/satsync.py:2407
#, fuzzy
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""
"GALAT: Tidak ada saluran yang saat ini diimpor; coba mgr-inter-sync --list-"
"channels; kemudian mgr-inter-sync -c chn0 -c chn1..."

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
#, fuzzy
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr "GALAT: --batch-size harus memiliki nilai dalam kisaran: 1..50"

#: ../satellite_tools/satsync.py:2469
#, fuzzy, python-format
msgid "ERROR: no such directory %s"
msgstr "Galat sewaktu membuat direktori %s."

#: ../satellite_tools/satsync.py:2474
#, fuzzy
msgid "Error Codes: Returned codes means:"
msgstr "Kode kesalahan: Kode yang dikembalikan berarti:"

#: ../satellite_tools/satsync.py:2475
#, fuzzy
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr "-1 - Tidak dapat mengunci file atau KeyboardInterrupt atau SystemExit"

#: ../satellite_tools/satsync.py:2476
#, fuzzy
msgid "  0  - User interrupted or intentional exit"
msgstr "0 - Pengguna terganggu atau disengaja keluar"

#: ../satellite_tools/satsync.py:2477
#, fuzzy
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr "1 - mencoba untuk menjalankan lebih dari satu contoh mgr-inter-sync."

#: ../satellite_tools/satsync.py:2478
#, fuzzy
msgid "  2  - Unable to find synchronization tools."
msgstr "2 - Tidak dapat menemukan alat sinkronisasi."

#: ../satellite_tools/satsync.py:2479
#, fuzzy
msgid "  3  - a general socket exception occurred"
msgstr "3 - pengecualian soket umum terjadi"

#: ../satellite_tools/satsync.py:2480
#, fuzzy
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr "4 - terjadi kesalahan SSL. Periksa kembali pengaturan SSL Anda."

#: ../satellite_tools/satsync.py:2481
#, fuzzy
msgid "  5  - ISS error"
msgstr "5 - Kesalahan ISS"

#: ../satellite_tools/satsync.py:2482
#, fuzzy
msgid "  6  - unhandled exception occurred"
msgstr "6 - pengecualian ditangani terjadi"

#: ../satellite_tools/satsync.py:2483
#, fuzzy
msgid "  7  - unknown sync error"
msgstr "7 - kesalahan sinkronisasi tidak diketahui"

#: ../satellite_tools/satsync.py:2484
#, fuzzy
msgid "  8  - ERROR: must be root to execute"
msgstr "8 - ERROR: harus root untuk mengeksekusi"

#: ../satellite_tools/satsync.py:2485
#, fuzzy
msgid "  9  - rpclib fault during synchronization init"
msgstr "9 - rpclib kesalahan selama sinkronisasi init"

#: ../satellite_tools/satsync.py:2486
#, fuzzy
msgid "  10 - synchronization init error"
msgstr "10 - sinkronisasi init kesalahan"

#: ../satellite_tools/satsync.py:2487
#, fuzzy
msgid "  11 - Error parsing XML stream"
msgstr "11 - Kesalahan parsing XML stream"

#: ../satellite_tools/satsync.py:2488
#, fuzzy
msgid "  12 - Channel do not exist"
msgstr "12 - Saluran tidak ada"

#: ../satellite_tools/satsync.py:2489
#, fuzzy
msgid "  13 - SQL error during importing package metadata"
msgstr "13 - Galat SQL selama mengimpor metadata paket"

#: ../satellite_tools/satsync.py:2490
#, fuzzy
msgid "  14 - SQL error during linking channel packages"
msgstr "14 - Galat SQL selama menghubungkan paket saluran"

#: ../satellite_tools/satsync.py:2491
#, fuzzy
msgid "  15 - SQL error during xml processing"
msgstr "15 - Galat SQL selama pemrosesan xml"

#: ../satellite_tools/satsync.py:2492
#, fuzzy
msgid "  16 - server.mount_point not set in the configuration file"
msgstr "16 - server.mount_point tidak ditetapkan dalam file konfigurasi"

#: ../satellite_tools/satsync.py:2493
#, fuzzy
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""
"17 - GALAT SQL selama mengambil saluran yang sudah diimpor dalam database "
"SUSE Manager"

#: ../satellite_tools/satsync.py:2494
#, fuzzy
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr "18 - String koneksi db salah di rhn.conf"

#: ../satellite_tools/satsync.py:2495
#, fuzzy
msgid "  19 - Bad arguments"
msgstr "19 - Argumen buruk"

#: ../satellite_tools/satsync.py:2496
#, fuzzy
msgid "  20 - Could not connect to db."
msgstr "20 - Tidak dapat terhubung ke db."

#: ../satellite_tools/satsync.py:2497
#, fuzzy
msgid "  21 - Bad debug level"
msgstr "21 - Tingkat debug buruk"

#: ../satellite_tools/satsync.py:2498
#, fuzzy
msgid "  22 - Not valid step"
msgstr "22 - Tidak berlaku langkah"

#: ../satellite_tools/satsync.py:2499
#, fuzzy
msgid "  24 - no such file"
msgstr "24 - tidak ada file tersebut"

#: ../satellite_tools/satsync.py:2500
#, fuzzy
msgid "  25 - no such directory"
msgstr "25 - tidak ada direktori tersebut"

#: ../satellite_tools/satsync.py:2501
#, fuzzy
msgid "  26 - mount_point does not exist"
msgstr "26 - mount_point tidak ada"

#: ../satellite_tools/satsync.py:2502
#, fuzzy
msgid "  27 - No such org"
msgstr "27 - Tidak ada organisasi seperti itu"

#: ../satellite_tools/satsync.py:2503
#, fuzzy
msgid "  28 - error: --master is only valid with --mount-point"
msgstr "28 - error: --master hanya berlaku dengan --mount-point"

#: ../satellite_tools/satsync.py:2510
#, fuzzy, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr "GALAT: versi dump tidak diketahui, coba salah satu dari %s"

#, fuzzy
#~ msgid "Red Hat Satellite Welcome Message"
#~ msgstr "Red Hat Satelit Selamat Datang Pesan"
   07070100000075000081B40000000000000000000000015FBBE8EE0000B648000000000000000000000000000000000000001B00000000spacewalk-backend/po/is.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Richard Allen <ra@ra.is>, 2002, 2006.
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Icelandic (http://www.transifex.com/projects/p/fedora/"
"language/is/)\n"
"Language: is\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
07070100000076000081B40000000000000000000000015FBBE8EE0000B8A8000000000000000000000000000000000000001B00000000spacewalk-backend/po/it.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Bettina De Monti <bdemonti@redhat.it>, 2001.
# Francesco Valente <fvalen@redhat.com>, 2003, 2004.
# Lorenzo Stobbione <lorenzo.stobbione@clsengineering.it>, 2004, 2005, 2006, 2007.
# Valentina Besi <valentina@redhat.it>, 2001.
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2020-10-15 23:49+0000\n"
"Last-Translator: Marina Latini <marina.latini@suse.com>\n"
"Language-Team: Italian <https://l10n.opensuse.org/projects/uyuni/backend/it/"
">\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.6.1\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr "token di autenticazione del proxy incompleto: %s"

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr "La firma inviata del proxy %s non corrisponde alla nostra %s."

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr "autenticazione proxy respinta"

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""
"\n"
"                   %s account Ã¨ stato disattivato su questo server.\n"
"                   Per favore, rivolgiti al tuo amministratore dell'Org per "
"ulteriori informazioni."

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr "Il tuo sistema non Ã¨ presente nel database di {PRODUCT_NAME}"

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
07070100000077000081B40000000000000000000000015FBBE8EE00013510000000000000000000000000000000000000001B00000000spacewalk-backend/po/ja.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Hirofumi Saito <hi_saito@yk.rim.or.jp>, 2004.
# kiyoto james hashida <khashida@brisbane.redhat.com>, 2007.
# Kiyoto James Hashida <khashida@redhat.com>, 2006.
# Noriko Mizumoto <noriko@redhat.com>, 2004-2007.
# noriko <noriko@fedoraproject.org>, 2011.
# Tadashi Jokagi <fedora@elf.no-ip.org>, 2005.
# Yukihiro Nakai <ynakai@redhat.com>, 2001.
# Jiri Dostal <jdostal@redhat.com>, 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2020-09-26 01:48+0000\n"
"Last-Translator: Yasuhiko Kamata <belphegor@belbel.or.jp>\n"
"Language-Team: Japanese <https://l10n.opensuse.org/projects/uyuni/backend/ja/"
">\n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 3.6.1\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr "ä¸å®Œå…¨ãªãƒ—ãƒ­ã‚­ã‚·èªè¨¼ãƒˆãƒ¼ã‚¯ãƒ³ã§ã™: %s"

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr "é€ä¿¡ã•ã‚ŒãŸãƒ—ãƒ­ã‚­ã‚·ç½²å %s ãŒã“ã¡ã‚‰å´ã® %s ã¨ä¸€è‡´ã—ã¾ã›ã‚“ã€‚"

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr "ãƒ—ãƒ­ã‚­ã‚·èªè¨¼ãŒæ‹’å¦ã•ã‚Œã¾ã—ãŸ"

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr "ç„¡åŠ¹ãªè¦æ±‚ã‚’å—ã‘å–ã‚Šã¾ã—ãŸ (%s)ã€‚"

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""
"é‡è¦ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã§ã™:\n"
"%s"

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""
"ã€Œ%sã€ã®å®Ÿè¡Œä¸­: æ¬¡ã‚’ã‚­ãƒ£ãƒƒãƒã—ã¾ã—ãŸ\n"
"%s : %s\n"

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr "ç„¡åŠ¹ãª URI %s"

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""
"\n"
"                   %s ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯æœ¬ã‚µãƒ¼ãƒãƒ¼ä¸Šã§ã¯éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã«ãªã£ã¦ã„ã¾"
"ã™ã€‚\n"
"                   çµ„ç¹”ã®ç®¡ç†è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„ã€‚"

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr "ã‚·ã‚¹ãƒ†ãƒ ãŒ {PRODUCT_NAME} ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å†…ã«ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr "ã“ã®ã‚µãƒ¼ãƒã§ã¯ ISS ãŒç„¡åŠ¹åŒ–ã•ã‚Œã¦ã„ã¾ã™ã€‚"

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr "ã‚µãƒ¼ãƒãƒ¼ã€Œ%sã€ã¯ ISS ã«æœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã›ã‚“ã€‚"

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr "ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸åãŒæœŸå¾…ã•ã‚Œã¦ã„ã¾ã™ã€æ¬¡ã§ã¯ã‚ã‚Šã¾ã›ã‚“: %s"

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr "ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ãŒæœŸå¾…ã•ã‚Œã¦ã„ã¾ã™ã€ æ¬¡ã§ã¯ã‚ã‚Šã¾ã›ã‚“: %s"

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""
"ã‚µãƒ¼ãƒãƒ—ãƒ­ãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦ SUSE Manager Proxy ã‚µãƒ¼ãƒ“ã‚¹ãŒæœ‰åŠ¹åŒ–ã•ã‚Œã¦ã„ã¾ã›"
"ã‚“: \"%s\""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr "ç„¡åŠ¹ãªã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚­ãƒ¼"

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr "ã“ã®ã‚µãƒ¼ãƒãƒ¼ ID ã¯æ—¢ã«ãªããªã‚Šã¾ã—ãŸ"

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr "ç„¡åŠ¹ãªå‹•ä½œå€¤ã‚¿ã‚¤ãƒ— %s (%s)"

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr "å‹•ä½œ %s ã¯ã‚µãƒ¼ãƒãƒ¼ %s ã«å±žã—ã¦ã„ã¾ã›ã‚“"

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr "å¿…è¦ãªãƒ‡ãƒ¼ã‚¿ãŒè¶³ã‚Šã¾ã›ã‚“"

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr "å¿…è¦ãªãƒ¡ãƒ³ãƒãƒ¼ãŒè¶³ã‚Šã¾ã›ã‚“"

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr "ã‚·ã‚¹ãƒ†ãƒ ã‚’ç„¡åŠ¹ãªãƒ¦ãƒ¼ã‚¶ãƒ¼åã«ç™»éŒ²ã—ã‚ˆã†ã¨ã—ã¦ã„ã¾ã™"

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr "ç„¡åŠ¹ãªã‚·ã‚¹ãƒ†ãƒ ãƒªãƒªãƒ¼ã‚¹ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’è¦æ±‚ã—ã¦ã„ã¾ã™"

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""
"é©åˆ‡ãªãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ã‚¤ã‚¹ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ ipaddr ã¨ ip6addr "
"ã®ä¸¡æ–¹ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã€‚"

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr "{PRODUCT_NAME} ã‚ˆã†ã“ããƒ¡ãƒƒã‚»ãƒ¼ã‚¸"

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr "ãƒ—ãƒ©ã‚¤ãƒã‚·ãƒ¼ã‚¹ãƒ†ãƒ¼ãƒˆãƒ¡ãƒ³ãƒˆ"

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr "è£½å“ã®å¼•æ•°ã¨ã—ã¦ãƒ‡ã‚£ã‚¯ã‚·ãƒ§ãƒŠãƒªãŒæœŸå¾…ã•ã‚Œã¦ã„ã¾ã™"

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr "ç„¡åŠ¹ãªå€¤ '%s' âˆ’ %s (%s)"

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr "system_id/action_id ã®å¯¾ãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“ã€‚"

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr "ç„¡åŠ¹ãªå€¤  %s (%s)"

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr "null org ã«ã‚ã‚‹ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã‚’ç®¡ç†ã™ã‚‹æ¨©é™ãŒä¸Žãˆã‚‰ã‚Œã¦ã„ã¾ã›ã‚“"

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr "%s org å†…ã®ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã®ç®¡ç†ã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“"

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr "ç®¡ç†ã«é–¢ã™ã‚‹ä½œæ¥­ã‚’è¡Œã†è¨±å¯ãŒã‚ã‚Šã¾ã›ã‚“"

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""
"ãƒãƒ£ãƒ³ãƒãƒ« %s ã®ç®¡ç†ã¯è¨±å¯ã•ã‚Œã¦ã„ãªã„ã‹ã€ ã¾ãŸã¯ã“ã®ãƒãƒ£ãƒ³ãƒãƒ«ã¯å­˜åœ¨ã—ã¦ã„ã¾"
"ã›ã‚“"

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""
"\n"
"               %s ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯æœ¬ã‚µãƒ¼ãƒãƒ¼ä¸Šã§ã¯ç„¡åŠ¹åŒ–ã•ã‚Œã¦ã„ã¾ã™ã€‚\n"
"                   è©³ã—ãã¯çµ„ç¹”ã®ç®¡ç†è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„ã€‚"

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""
"ã”ä½¿ç”¨ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ã¯ (release='%(release)s', "
"arch='%(arch)s')%(www_activation)s ã«ä¸€è‡´ã™ã‚‹ãƒãƒ£ãƒ³ãƒãƒ«ã®ã„ãšã‚Œã«ã‚‚ã‚¢ã‚¯ã‚»ã‚¹ãŒ"
"ã‚ã‚Šã¾ã›ã‚“"

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""
"\n"
"ç™»éŒ²ç•ªå·ã‚’ãŠæŒã¡ã®å ´åˆã¯ã€ ã¾ãšãã®ç•ªå·ã‚’ http://www.redhat.com/apps/"
"activate/ ã«ã¦ç™»éŒ²ã—ã¦ã‹ã‚‰ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„ã€‚\n"
"\n"

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr "ãƒªãƒªãƒ¼ã‚¹ (%s, %s ã«ã¯ã‚µãƒ–ã‚¹ã‚¯ãƒªãƒ—ã‚·ãƒ§ãƒ³è¨±å¯ãŒä¸è¶³ã—ã¦ã„ã¾ã™"

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr "ã‚·ã‚¹ãƒ†ãƒ ã¯ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™ãŒéžã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã«ãªã£ã¦ã„ã¾ã™"

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""
"\n"
"ã‚¢ãƒ¼ã‚­ãƒ†ã‚¯ãƒãƒ£ã¨ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ã®ãƒªãƒªãƒ¼ã‚¹ã®çµ„ã¿åˆã‚ã› (%sã€ %s)\n"
"ãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“ã€‚ã‚·ã‚¹ãƒ†ãƒ ã¯ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™ãŒã€ãƒãƒ£ãƒ³ãƒãƒ«ã®ã‚µãƒ–ã‚¹ã‚¯ãƒªãƒ—"
"ã‚·ãƒ§ãƒ³\n"
"ãŒè¡Œãªã‚ã‚Œã¦ã„ãªã„ãŸã‚æ›´æ–°ã¯è¡Œã‚ã‚Œã¾ã›ã‚“ã€‚ è£½å“ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ™ãƒ¼ã‚·ãƒ§ãƒ³ãŒ\n"
"æœªå®Ÿæ–½ã®å ´åˆã¯ã€ä¸‹è¨˜ã® Web ã‚µã‚¤ãƒˆã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã‚¢ã‚¯ãƒ†ã‚£ãƒ™ãƒ¼ã‚·ãƒ§ãƒ³ã‚’\n"
"è¡Œãªã£ã¦ãã ã•ã„:\n"
"  \n"
"     http://www.redhat.com/apps/activate/"

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""
"\n"
"ã‚¢ãƒ¼ã‚­ãƒ†ã‚¯ãƒãƒ£ã¨ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ã®ãƒªãƒªãƒ¼ã‚¹ã®çµ„ã¿åˆã‚ã› (%sã€ %s)\n"
"ãŒç„¡åŠ¹ã§ã™ã€‚ ã‚·ã‚¹ãƒ†ãƒ ã¯ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™ãŒã€ ãƒ™ãƒ¼ã‚¹ãƒãƒ£ãƒ³ãƒãƒ«ã«ã‚µãƒ–ã‚¹ã‚¯ãƒ©ã‚¤"
"ãƒ–\n"
"ã•ã›ã‚‹ã“ã¨ãŒã§ããªã‹ã£ãŸãŸã‚æ›´æ–°ã¯è¡Œã‚ã‚Œã¾ã›ã‚“ã€‚ è©³ç´°ã«ã¤ã„ã¦ã¯çµ„ç¹”ã®ç®¡ç†è€…"
"ã«\n"
"ãŠå•ã„åˆã‚ã›ãã ã•ã„ã€‚\n"

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""
"\n"
"  ã“ã®ã‚·ã‚¹ãƒ†ãƒ ã¯æ­£å¸¸ã«ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™ãŒã€ ã‚¨ãƒ³ã‚¿ã‚¤ãƒˆãƒ«ãƒ¡ãƒ³ãƒˆãŒã¾ã ä»˜ä¸Žã•ã‚Œã¦"
"ã„ã¾ã›ã‚“ã€‚\n"
"  ã‚·ã‚¹ãƒ†ãƒ ã«ã‚¨ãƒ³ã‚¿ã‚¤ãƒˆãƒ«ãƒ¡ãƒ³ãƒˆã‚’ä»˜ä¸Žã™ã‚‹ã«ã¯æ¬¡ã® Web ã‚µã‚¤ãƒˆã«ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ãã "
"ã•ã„ã€‚\n"
"\n"
"  %(entitlement_url)s\n"

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""
"\n"
"  ã“ã®ã‚·ã‚¹ãƒ†ãƒ ã¯æ­£å¸¸ã«ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™ãŒã€ åˆ©ç”¨ã§ãã‚‹ã‚¨ãƒ³ã‚¿ã‚¤ãƒˆãƒ«ãƒ¡ãƒ³ãƒˆãŒã‚ã‚Š"
"ã¾ã›ã‚“ã§ã—ãŸã€‚\n"
"  ã‚·ã‚¹ãƒ†ãƒ ã«ã‚¨ãƒ³ã‚¿ã‚¤ãƒˆãƒ«ãƒ¡ãƒ³ãƒˆã‚’ä»˜ä¸Žã™ã‚‹ã«ã¯æ¬¡ã® Web ã‚µã‚¤ãƒˆã«ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ãã "
"ã•ã„ã€‚\n"
"\n"
"  %(entitlement_url)s\n"

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""
"ã“ã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆä¸Šã§ root ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ãªã‚Šã€ rhn_register ã‚’å®Ÿè¡Œã—ã¦ãã ã•ã„"

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr "ã‚·ã‚¹ãƒ†ãƒ ãƒ—ãƒ­ãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦ã‚µãƒ¼ãƒ“ã‚¹ãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã›ã‚“: ã€Œ%sã€"

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr "ç„¡åŠ¹ãª RPM ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ %s ã‚’è¦æ±‚ã—ã¦ã„ã¾ã™"

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr "ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr "ã‚¢ãƒ¼ã‚­ãƒ†ã‚¯ãƒãƒ£ `%s' ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“"

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr "ãƒˆãƒ¼ã‚¯ãƒ³ `%s' ã«ã¯ 1 ã¤ä»¥ä¸Šã®ãƒ™ãƒ¼ã‚¹ãƒãƒ£ãƒ³ãƒãƒ«ãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã¾ã™"

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr "ç«¶åˆã—ã¦ã„ã‚‹ãƒ™ãƒ¼ã‚¹ãƒãƒ£ãƒ³ãƒãƒ«"

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr "ã‚°ãƒ«ãƒ¼ãƒ— %s ã¸ã®ã‚µãƒ¼ãƒãƒ¼ã®è¿½åŠ ã«å¤±æ•—ã—ã¾ã—ãŸ"

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr "æœ€å¤§ä½¿ç”¨æ•° %s ã«é”ã—ã¾ã—ãŸ"

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""
"ç•°ãªã‚‹ãƒ™ãƒ¼ã‚¹ã‚¨ãƒ³ã‚¿ã‚¤ãƒˆãƒ«ãƒ¡ãƒ³ãƒˆã§ã®å†ç™»éŒ²ãƒˆãƒ¼ã‚¯ãƒ³ã®ç©ã¿é‡ã­ã«ã¯å¯¾å¿œã—ã¦ã„ã¾ã›"
"ã‚“"

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr "ãƒˆãƒ¼ã‚¯ãƒ³ã€Œ%sã€ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr "ä¸ä¸€è‡´ã® ã€€org ã‹ã‚‰ã®ãƒˆãƒ¼ã‚¯ãƒ³ã§ã™"

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr "ã‚­ãƒƒã‚¯ã‚¹ã‚¿ãƒ¼ãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ä¸ä¸€è‡´ã§ã™"

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr "å†ç™»éŒ²ãƒˆãƒ¼ã‚¯ãƒ³ã®ç©ã¿é‡ã­ã«ã¯å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“"

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr "ç„¡åŠ¹ãªãƒ¦ãƒ¼ã‚¶ãƒ¼åã¨ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰ã®çµ„ã¿åˆã‚ã›ã§ã™"

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr "ãƒ¦ãƒ¼ã‚¶ãƒ¼å `%s' ã¯äºˆç´„ã•ã‚Œã¦ã„ã¾ã›ã‚“"

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr "Email ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr "ãƒ¦ãƒ¼ã‚¶ãƒ¼åã¯å°‘ãªãã¨ã‚‚ %d æ–‡å­—ä»¥ä¸Šã«ã—ã¦ãã ã•ã„"

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr "ãƒ¦ãƒ¼ã‚¶ãƒ¼åã¯ %d æ–‡å­—æœªæº€ã«ã—ã¦ãã ã•ã„"

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr "ãƒ¦ãƒ¼ã‚¶ãƒ¼å = `%s'ã€ ç„¡åŠ¹ãªæ–‡å­— `%s'"

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr "Email ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ %s æ–‡å­—ä»¥å†…ã«ã—ã¦ãã ã•ã„"

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr "ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰ã¯å°‘ãªãã¨ã‚‚ %d æ–‡å­—ã«ä»¥ä¸Šã«ã—ã¦ãã ã•ã„"

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr "ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰ã¯ %d æ–‡å­—ä»¥å†…ã«ã—ã¦ãã ã•ã„"

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr "ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰ã« `%s' æ–‡å­—ãŒå«ã¾ã‚Œã¦ã„ã¾ã™"

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr "ãƒ¦ãƒ¼ã‚¶ãƒ¼åã¯å°‘ãªãã¨ã‚‚ %d æ–‡å­—ä»¥ä¸Šã®é•·ã•ã«ã—ã¦ãã ã•ã„"

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr "%s ã§çµ‚ã‚ã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼åã¯ç™»éŒ²ã§ãã¾ã›ã‚“"

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr "æœ‰åŠ¹ãªãƒ¦ãƒ¼ã‚¶ãƒ¼åã§ã¯ãªã„ã‚ˆã†ã§ã™ã€‚"

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr "ãƒ¦ãƒ¼ã‚¶ãƒ¼åã¨ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰ã®çµ„ã¿åˆã‚ã›ãŒç„¡åŠ¹ã§ã™ã€‚"

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr "ã“ã®ãƒ­ã‚°ã‚¤ãƒ³ã¯æ—¢ã«ä½¿ç”¨æ¸ˆã‹ã€ ã¾ãŸã¯ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰ãŒé–“é•ã£ã¦ã„ã¾ã™ã€‚"

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr "ãƒ‘ãƒ¼ãƒŸãƒƒã‚·ãƒ§ãƒ³ãŒæ‹’å¦ã•ã‚Œã¾ã—ãŸã€‚"

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr "ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã€‚"

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr "ç„¡åŠ¹ãªã‚·ã‚¹ãƒ†ãƒ ãƒ‡ã‚¸ã‚¿ãƒ« ID ã§ã™ã€‚"

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr "ç„¡åŠ¹ãªã‚·ã‚¹ãƒ†ãƒ èªè¨¼æƒ…å ±ã§ã™ã€‚"

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr "ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‹ã‚‰ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ‡ãƒ¼ã‚¿ã‚’èª­ã¿å‡ºã™ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr "æœ‰åŠ¹ãªãƒ¦ãƒ¼ã‚¶ãƒ¼åãŒå¿…è¦ã§ã™ã€‚"

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr "æœ‰åŠ¹ãªãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰ãŒå¿…è¦ã§ã™ã€‚"

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr "ãƒ¦ãƒ¼ã‚¶ãƒ¼åã®æœ€çŸ­ã®é•·ã•ã‚’é•åã—ã¦ã„ã¾ã™ã€‚"

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr "ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰ã®æœ€çŸ­ã®é•·ã•ã‚’é•åã—ã¦ã„ã¾ã™ã€‚"

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr "ãƒ¦ãƒ¼ã‚¶ãƒ¼åã«ç„¡åŠ¹ãªæ–‡å­—ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚"

#: ../common/rhnException.py:66
msgid "File not found."
msgstr "ãƒ•ã‚¡ã‚¤ãƒ«ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã€‚"

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""
"ã‚¢ãƒ¼ã‚­ãƒ†ã‚¯ãƒãƒ£ã¨ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®çµ„ã¿åˆã‚ã›ã¯å¯¾å¿œã—ã¦ã„"
"ã¾ã›ã‚“ã€‚"

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr "ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‹ã‚‰ã‚·ã‚¹ãƒ†ãƒ ã®ãƒ‡ãƒ¼ã‚¿ã‚’èª­ã¿å‡ºã™ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr "é–¢æ•°ã«ç„¡åŠ¹ãªå¼•æ•°ãŒæ¸¡ã•ã‚Œã¾ã—ãŸã€‚"

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr "è¦æ±‚ã•ã‚ŒãŸã‚¨ãƒ³ãƒˆãƒªã‚’èª­ã¿å‡ºã›ã¾ã›ã‚“ã€‚"

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr "ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ã‚¨ãƒ³ãƒˆãƒªã‚’æ›´æ–°ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr "æœªå¯¾å¿œã®ã‚µãƒ¼ãƒãƒ¼ã‚¢ãƒ¼ã‚­ãƒ†ã‚¯ãƒãƒ£ã§ã™ã€‚"

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""
"\n"
"     åŒ¿åã‚µãƒ¼ãƒãƒ¼æ©Ÿèƒ½ã¯åˆ©ç”¨ã§ããªããªã£ã¦ã„ã¾ã™ã€‚\n"
"\n"
"     root ã«ãªã‚Š mgr_register ã‚’å®Ÿè¡Œã—ã¦ã“ã®ã‚·ã‚¹ãƒ†ãƒ ã®å†ç™»éŒ²ã‚’è¡Œã£ã¦ãã ã•"
"ã„ã€‚\n"
"     ã“ã®ã‚·ã‚¹ãƒ†ãƒ ã«å¯¾ã—ã¦ã‚µãƒ¼ãƒ“ã‚¹ã‚’æœ‰åŠ¹ã«ã™ã‚‹å ´åˆã¯ã€ \n"
"     https://%(hostname)s/rhn/systems/SystemEntitlements.do ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹"
"ã‹ã€\n"
"     https://%(hostname)s ã§ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ã‹ã‚‰ \"æ¦‚è¦\" ã‚¿ãƒ–å†…ã® \"ã‚µãƒ–ã‚¹ã‚¯ãƒªãƒ—"
"ã‚·ãƒ§ãƒ³ç®¡ç†\"\n"
"     ã‚’é¸æŠžã—ã¦ãã ã•ã„ã€‚\n"
"     "

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr "ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ä½¿ç”¨ã§ãã‚‹è¨˜éŒ²ãŒã‚ã‚Šã¾ã›ã‚“ã€‚"

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr "ã‚¨ãƒ³ãƒˆãƒªã«ã¯ç„¡åŠ¹ãªå€¤ã§ã™ã€‚"

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""
"\n"
"     ã“ã®ã‚·ã‚¹ãƒ†ãƒ ã«ã¯ SUSE Manager ç”¨ã®æœ‰åŠ¹ãªã‚¨ãƒ³ã‚¿ã‚¤ãƒˆãƒ«ãƒ¡ãƒ³ãƒˆãŒã‚ã‚Šã¾ã›"
"ã‚“ã€‚\n"
"     ã“ã®ã‚·ã‚¹ãƒ†ãƒ ã«å¯¾ã—ã¦ã‚µãƒ¼ãƒ“ã‚¹ã‚’æœ‰åŠ¹ã«ã™ã‚‹å ´åˆã¯ã€\n"
"     https://%(hostname)s/rhn/systems/SystemEntitlements.do ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹"
"ã‹ã€\n"
"     https://%(hostname)s ã§ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ã‹ã‚‰ \"æ¦‚è¦\" ã‚¿ãƒ–å†…ã«ã‚ã‚‹ \"ã‚µãƒ–ã‚¹ã‚¯"
"ãƒªãƒ—ã‚·ãƒ§ãƒ³ç®¡ç†\"\n"
"     ã‚’é¸æŠžã—ã¦ãã ã•ã„ã€‚\n"
"     "

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr "ãƒãƒ£ãƒ³ãƒãƒ«ã‚¨ãƒ©ãƒ¼"

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr "ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒˆãƒ¼ã‚¯ãƒ³ãŒç„¡åŠ¹ã§ã™ã€‚"

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr "ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒˆãƒ¼ã‚¯ãƒ³ã®æœ‰åŠ¹æœŸé™ãŒåˆ‡ã‚Œã¦ã„ã¾ã™ã€‚"

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr "è¦æ±‚ã•ã‚ŒãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’èª­ã¿å‡ºã™æ¨©é™ãŒä¸Žãˆã‚‰ã‚Œã¦ã„ã¾ã›ã‚“ã€‚"

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr "ç„¡åŠ¹ãªå‹•ä½œ"

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr "ã“ã®ã‚·ã‚¹ãƒ†ãƒ ã§ç®¡ç†é–¢é€£ã®ä½œæ¥­ã‚’è¡Œã†è¨±å¯ãŒã‚ã‚Šã¾ã›ã‚“ã€‚"

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr "ã‚·ã‚¹ãƒ†ãƒ ã¯æ—¢ã«æŒ‡å®šãƒãƒ£ãƒ³ãƒãƒ«ã«ã‚µãƒ–ã‚¹ã‚¯ãƒ©ã‚¤ãƒ–ã•ã‚Œã¦ã„ã¾ã™ã€‚"

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr "ç¾åœ¨ã€ ã‚·ã‚¹ãƒ†ãƒ ã¯æŒ‡å®šãƒãƒ£ãƒ³ãƒãƒ«ã«ã‚µãƒ–ã‚¹ã‚¯ãƒ©ã‚¤ãƒ–ã•ã‚Œã¦ã„ã¾ã›ã‚“ã€‚"

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr "æŒ‡å®šã•ã‚ŒãŸãƒãƒ£ãƒ³ãƒãƒ«ãŒå­˜åœ¨ã—ã¦ã„ã¾ã›ã‚“ã€‚"

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr "ç„¡åŠ¹ãªãƒãƒ£ãƒ³ãƒãƒ«ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã™ã€‚"

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""
"\n"
"     ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚·ãƒƒãƒ—ã®ä¸Šé™ã‚’è¶…ãˆã¦ã„ã¾ã™ã€‚\n"
"\n"
"     ãŠä½¿ã„ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ç¾åœ¨ã®è¨­å®šã§ã¯ã€ã“ã‚Œä»¥ä¸Šã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®è¿½åŠ ã¯"
"ã§ãã¾ã›ã‚“ã€‚\n"
"     ã‚µãƒ¼ãƒã«å¯¾ã—ã¦ã‚µãƒ–ã‚¹ã‚¯ãƒªãƒ—ã‚·ãƒ§ãƒ³ã‚’è¨­å®šã§ãã‚‹æœ€å¤§ãƒ¦ãƒ¼ã‚¶æ•°ã‚’å¤‰æ›´ã™ã‚‹å¿…è¦ãŒ"
"ã‚ã‚‹å ´åˆã¯ã€\n"
"     çµ„ç¹”ã®ç®¡ç†è€…ã«ã”ç¢ºèªãã ã•ã„ã€‚\n"
"     "

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""
"\n"
"     ã‚·ã‚¹ãƒ†ãƒ ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚·ãƒƒãƒ—ã®ä¸Šé™ã‚’è¶…ãˆã¦ã„ã¾ã™ã€‚\n"
"\n"
"     ãŠä½¿ã„ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ç¾åœ¨ã®è¨­å®šã§ã¯ã€ã“ã‚Œä»¥ä¸Šã®ã‚·ã‚¹ãƒ†ãƒ ãƒ—ãƒ­ãƒ•ã‚¡ã‚¤ãƒ«ã®è¿½åŠ "
"ã¯ã§ãã¾ã›ã‚“ã€‚\n"
"     ãŠä½¿ã„ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã§ã‚µãƒ–ã‚¹ã‚¯ãƒªãƒ—ã‚·ãƒ§ãƒ³ã‚’è¨­å®šã§ãã‚‹ã‚·ã‚¹ãƒ†ãƒ ãƒ—ãƒ­ãƒ•ã‚¡ã‚¤ãƒ«æ•°"
"ã®æœ€å¤§å€¤ã‚’\n"
"     å¤‰æ›´ã™ã‚‹å¿…è¦ãŒã‚ã‚‹å ´åˆã¯ã€çµ„ç¹”ã®ç®¡ç†è€…ã«ã”ç¢ºèªãã ã•ã„ã€‚\n"
"     "

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""
"\n"
"     ã‚¢ãƒ¼ã‚­ãƒ†ã‚¯ãƒãƒ£ãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“ã€‚\n"
"\n"
"     ã“ã®ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã®ã‚¢ãƒ¼ã‚­ãƒ†ã‚¯ãƒãƒ£ã¯å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“ã€‚\n"
"     "

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr "ç„¡åŠ¹ãª RPM ãƒ˜ãƒƒãƒ€ãƒ¼ã§ã™"

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""
"\n"
"    ã“ã®ã‚·ã‚¹ãƒ†ãƒ ã¯æ—¢ã« Salt Minion ã¨ã—ã¦ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™ã€‚å¾“æ¥åž‹ã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³"
"ãƒˆã¨ã—ã¦ç™»éŒ²ã—ãŸã„å ´åˆã¯ã€\n"
"    Web UI ã‚„ API ã§ã„ã£ãŸã‚“å‰Šé™¤ã‚’è¡Œãªã£ãŸã‚ã¨ã€å†åº¦å¾“æ¥ã®ãƒ„ãƒ¼ãƒ«ã§ç™»éŒ²ã‚’è¡Œ"
"ãªã£ã¦ãã ã•ã„ã€‚\n"
"    "

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr "ã‚µãƒ¼ãƒãƒ¼ã«ç„¡åŠ¹ãªæƒ…å ±ãŒã‚¢ãƒƒãƒ—ãƒ­ãƒ¼ãƒ‰ã•ã‚Œã¾ã—ãŸ"

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""
"ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã®è¨­å®šã‚’ã‚¢ãƒƒãƒ—ãƒ­ãƒ¼ãƒ‰ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""
"\n"
"     ä¸€æ„æ€§åˆ¶ç´„ã®é•åã«ã‚ˆã‚Šãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã®ã‚¢ãƒƒãƒ—ãƒ­ãƒ¼ãƒ‰ãŒå¤±æ•—ã—ã¾ã—ãŸã€‚\n"
"     ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã«é‡è¤‡ã™ã‚‹ä¾å­˜é–¢ä¿‚ãŒãªã„ã“ã¨ã€ ã¾ãŸã¯ã“ã®ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ãŒ\n"
"     ã¾ã ã‚µãƒ¼ãƒãƒ¼ã«å­˜åœ¨ã—ã¦ã„ãªã„ã“ã¨ã‚’ç¢ºèªã—ã¦ãã ã•ã„ã€‚\n"
"     "

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""
"\n"
"     ã“ã®ã‚µãƒ¼ãƒãƒ¼ã§ã¯ --force rhnpush ã®ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã¯ç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚\n"
"     è©³ç´°ã«ã¤ã„ã¦ã¯ SUSE Manager ã®ç®¡ç†è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„ã€‚\n"
"     "

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""
"\n"
"     æŒ‡å®šã•ã‚ŒãŸã‚¢ã‚¯ãƒ†ã‚£ãƒ™ãƒ¼ã‚·ãƒ§ãƒ³ãƒˆãƒ¼ã‚¯ãƒ³ãŒã‚µãƒ¼ãƒãƒ¼ã«è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚\n"
"     æœ‰åŠ¹ãªã‚­ãƒ¼ã§ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„ã€‚\n"
"     "

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr "ã“ã®ç™»éŒ²ãƒˆãƒ¼ã‚¯ãƒ³ã‚’ä½¿ç”¨ã—ã¦ç™»éŒ²ã•ã‚ŒãŸã‚·ã‚¹ãƒ†ãƒ ãŒå¤šã™ãŽã¾ã™"

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""
"ç„¡åŠ¹ãªè¨­å®šã€ ã¾ãŸã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„ã‹ä¸é©åˆ‡ãªè¨­å®šã‚’å«ã‚€ãƒˆãƒ¼ã‚¯ãƒ³ã§ã™"

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr "ã‚¢ã‚¯ãƒ†ã‚£ãƒ™ãƒ¼ã‚·ãƒ§ãƒ³ãƒˆãƒ¼ã‚¯ãƒ³ãŒç«¶åˆã—ã¦ã„ã¾ã™"

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""
"\n"
"     ãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ ã«è©²å½“ã™ã‚‹ãƒ™ãƒ¼ã‚¹ãƒãƒ£ãƒ³ãƒãƒ«ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚\n"
"     "

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""
"\n"
"     æŒ‡å®šãƒãƒ£ãƒ³ãƒãƒ«ã¸ã®ã‚µãƒ–ã‚¹ã‚¯ãƒªãƒ—ã‚·ãƒ§ãƒ³ãƒ‘ãƒ¼ãƒŸãƒƒã‚·ãƒ§ãƒ³ãŒã‚ã‚Šã¾ã›ã‚“ã€‚\n"
"     è©³ç´°ã«ã¤ã„ã¦ã¯çµ„ç¹”ã®ç®¡ç†è€…ã¾ãŸã¯ãƒãƒ£ãƒ³ãƒãƒ«ç®¡ç†è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•"
"ã„ã€‚\n"
"     \n"
"     "

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr "ãƒ™ãƒ¼ã‚¹ãƒãƒ£ãƒ³ãƒãƒ«ã®ã‚µãƒ–ã‚¹ã‚¯ãƒªãƒ—ã‚·ãƒ§ãƒ³ã‚’è§£é™¤ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ã€‚"

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""
"SUSE Manager ã‚‚ã—ãã¯ Proxy ãƒãƒ£ãƒ³ãƒãƒ«ã¯ã‚µãƒ–ã‚¹ã‚¯ãƒªãƒ—ã‚·ãƒ§ãƒ³ã‚’è¨­å®šã§ãã¾ã›ã‚“ã€‚"

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr "ã‚·ã‚¹ãƒ†ãƒ ã‚’ãã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã•ã›ã‚‹é€”ä¸­ã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr "ã‚·ã‚¹ãƒ†ãƒ ã«ã‚¨ãƒ³ã‚¿ã‚¤ãƒˆãƒ«ãƒ¡ãƒ³ãƒˆã‚’ä»˜ä¸Žã§ãã¾ã›ã‚“"

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr "Email ã®æœ€å¤§é•·ã‚’è¶…ãˆã¦ã„ã¾ã™ã€‚"

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr "ã“ã®ã‚·ã‚¹ãƒ†ãƒ ã¯æ—¢ã«ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã™ã€‚"

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr "ç„¡åŠ¹ãªãƒ¦ãƒ¼ã‚¶ãƒ¼å"

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr "ã‚µãƒ¼ãƒãƒ¼ã‚’æ¤œå‡ºã§ãã¾ã›ã‚“"

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr "å¿…è¦ãªå¼•æ•°ãŒã‚ã‚Šã¾ã›ã‚“"

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr "ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã«é–¢é€£ã¥ã‘ã‚‰ã‚Œã¦ã„ã‚‹ã‚¨ãƒ³ã‚¿ã‚¤ãƒˆãƒ«ãƒ¡ãƒ³ãƒˆæƒ…å ±ãŒã‚ã‚Šã¾ã›ã‚“"

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr "ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ç•ªå·ã«ã‚¨ãƒ³ã‚¿ã‚¤ãƒˆãƒ«ãƒ¡ãƒ³ãƒˆãŒä»˜ä¸Žã•ã‚Œã¦ã„ã¾ã›ã‚“"

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr "ãƒ¦ãƒ¼ã‚¶ãƒ¼åã®æœ€å¤§é•·ã‚’è¶…ãˆã¦ã„ã¾ã™"

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr "ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰ã®æœ€å¤§é•·ã‚’è¶…ãˆã¦ã„ã¾ã™"

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""
"ã“ã®ãƒ¦ãƒ¼ã‚¶ã«å¯¾ã—ã¦ã¯èª­ã¿è¾¼ã¿å°‚ç”¨ã® API ã‚¢ã‚¯ã‚»ã‚¹ã®ã¿ãŒæä¾›ã•ã‚Œã¦ã„ã¾ã™ã€‚ã‚¢ã‚¯ã‚»"
"ã‚¹ãŒæ‹’å¦ã•ã‚Œã¾ã—ãŸã€‚"

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr "ã‚·ã‚¹ãƒ†ãƒ åã‚’ 1 æ–‡å­—æœªæº€ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr "SUSE Manager Proxy ã®ã‚¨ãƒ©ãƒ¼ã§ã™ã€‚"

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr "SUSE Manager Proxy ã«ã‚ˆã‚‹ãƒ­ã‚°ã‚¤ãƒ³ãŒã§ãã¾ã›ã‚“ã€‚"

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""
"\n"
"     SUSE Manager Proxy ã®ã‚·ã‚¹ãƒ†ãƒ  ID ã¨ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å†…ã® Spacewalk Proxy "
"Server\n"
"     ã®æƒ…å ±ãŒåˆè‡´ã—ã¾ã›ã‚“ã€‚\n"
"     "

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr "SUSE Manager Proxy ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒˆãƒ¼ã‚¯ãƒ³ãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“ã€‚"

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr "SUSE Manager Proxy ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒˆãƒ¼ã‚¯ãƒ³ã®æœŸé™ãŒåˆ‡ã‚Œã¦ã„ã¾ã™ã€‚"

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""
"\n"
"      mgr_register çµŒç”±ã§ã®ãƒ¦ãƒ¼ã‚¶ä½œæˆã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“;\n"
"     ã‚·ã‚¹ãƒ†ãƒ ç®¡ç†è€…ã«ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ä½œæˆã‚’ä¾é ¼ã—ã¦ãã ã•ã„ã€‚\n"
"     "

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""
"\n"
"     ã“ã® SUSE Manager ã‚µãƒ¼ãƒãƒ¼ã§ã¯ã€ã“ã®ã‚µãƒ¼ãƒã§ã® Inter Server Sync ã®ä½¿ç”¨"
"ãŒè¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“\n"
"     "

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""
"\n"
"     Inter Server Sync ã¯ã€ã“ã® SUSE Manager ã‚µãƒ¼ãƒã§ã¯ç„¡åŠ¹åŒ–ã•ã‚Œã¦ã„ã¾ã™ã€‚\n"
"     "

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr "ç„¡åŠ¹ãªãƒ‡ãƒ¼ã‚¿ã‚¿ã‚¤ãƒ—ãŒæ¸¡ã•ã‚Œã¦ã„ã¾ã™"

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr "ãƒãƒ£ãƒ³ãƒãƒ«ãŒèª­ã¿å‡ºã›ã¾ã›ã‚“"

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr "ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ãŒèª­ã¿å‡ºã›ã¾ã›ã‚“"

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr "ã‚¨ãƒ©ãƒ¼ã‚¿ãŒèª­ã¿å‡ºã›ã¾ã›ã‚“"

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr "ãƒ•ã‚¡ã‚¤ãƒ«ãŒã‚ã‚Šã¾ã›ã‚“"

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr "é–¢æ•°èª­ã¿å‡ºã—ã®ã‚¨ãƒ©ãƒ¼ã§ã™"

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr "é–¢æ•°å®Ÿè¡Œã‚¨ãƒ©ãƒ¼ã§ã™"

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³æ–‡å­—åˆ—ãŒã‚ã‚Šã¾ã›ã‚“"

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr "ç„¡åŠ¹ãªãƒãƒ¼ã‚¸ãƒ§ãƒ³æ–‡å­—åˆ—ã§ã™"

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒä¸€è‡´ã—ã¾ã›ã‚“"

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr "ç„¡åŠ¹ãªãƒãƒ£ãƒ³ãƒãƒ«ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã™"

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr "ãƒãƒ£ãƒ³ãƒãƒ«ç”¨ã® comps ãƒ•ã‚¡ã‚¤ãƒ«ãŒã‚ã‚Šã¾ã›ã‚“"

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr "comps ãƒ•ã‚¡ã‚¤ãƒ«ãŒèª­ã¿å‡ºã›ã¾ã›ã‚“"

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr "è¨­å®šå‹•ä½œãŒã‚ã‚Šã¾ã›ã‚“"

#: ../common/rhnException.py:230
msgid "File too large"
msgstr "ãƒ•ã‚¡ã‚¤ãƒ«ãŒé•·ã™ãŽã¾ã™"

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr "ãƒ•ã‚¡ã‚¤ãƒ«ã«ãƒã‚¤ãƒŠãƒªãƒ‡ãƒ¼ã‚¿ãŒå«ã¾ã‚Œã¦ã„ã¾ã™"

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr "è¨­å®šãƒãƒ£ãƒ³ãƒãƒ«ãŒç©ºã«ãªã£ã¦ã„ã¾ã›ã‚“"

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr "ãƒ‘ãƒ¼ãƒŸãƒƒã‚·ãƒ§ãƒ³ã‚¨ãƒ©ãƒ¼ã§ã™"

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr "è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã®å†…å®¹ãŒã‚ã‚Šã¾ã›ã‚“"

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr "ãƒ†ãƒ³ãƒ—ãƒ¬ãƒ¼ãƒˆã®åŒºåˆ‡ã‚Šæ–‡å­—ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr "è¨­å®šãƒãƒ£ãƒ³ãƒãƒ«ãŒå­˜åœ¨ã—ã¦ã„ã¾ã›ã‚“"

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr "è¨­å®šãƒãƒ£ãƒ³ãƒãƒ«ã¯æ—¢ã«å­˜åœ¨ã—ã¦ã„ã¾ã™"

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr "è¨­å®šãƒãƒ£ãƒ³ãƒãƒ«ã‹ã‚‰ã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒã‚ã‚Šã¾ã›ã‚“"

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr "ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®åˆ¥ã®æ”¹è¨‚ç‰ˆãŒã‚¢ãƒƒãƒ—ãƒ­ãƒ¼ãƒ‰ã•ã‚Œã¦ã„ã¾ã™"

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr "ãƒ•ã‚¡ã‚¤ãƒ«ã¯æ—¢ã«è¨­å®šãƒãƒ£ãƒ³ãƒãƒ«ã«ã‚¢ãƒƒãƒ—ãƒ­ãƒ¼ãƒ‰ã•ã‚Œã¦ã„ã¾ã™"

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr "ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚ºãŒæ®‹ã‚Šã®ä¸Šé™é ˜åŸŸã‚’è¶…ãˆã¦ã„ã¾ã™"

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr "ãƒ•ã‚¡ã‚¤ãƒ«ã®å®Œå…¨ãƒ‘ã‚¹ã‚’æŒ‡å®šã—ã¦ãã ã•ã„"

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr "ç„¡åŠ¹ãªæ”¹è¨‚ç‰ˆç•ªå·ã§ã™"

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr "ã‚¿ã‚¤ãƒ—ãŒç•°ãªã‚‹ãƒ•ã‚¡ã‚¤ãƒ«åŒå£«ã¯æ¯”è¼ƒã§ãã¾ã›ã‚“"

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr "ã‚¯ãƒ©ãƒƒã‚·ãƒ¥æƒ…å ±ãŒæ­£ã—ããªã„ã‹ã€ä¸å®Œå…¨ã§ã™"

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr "ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ãƒ•ã‚¡ã‚¤ãƒ«ã®æƒ…å ±ãŒæ­£ã—ããªã„ã‹ã€ä¸å®Œå…¨ã§ã™"

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr "ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãƒ‘ã‚¹ã®ç”Ÿæˆæ™‚ã«ã‚¨ãƒ©ãƒ¼"

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr "ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ãƒ•ã‚¡ã‚¤ãƒ«ãƒ‘ã‚¹ã®ç”Ÿæˆæ™‚ã«ã‚¨ãƒ©ãƒ¼"

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr "ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“"

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr "ã‚¯ãƒ©ãƒƒã‚·ãƒ¥åãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“"

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr "ã“ã®çµ„ç¹”ã«å¯¾ã—ã¦ã¯ã‚¯ãƒ©ãƒƒã‚·ãƒ¥å ±å‘Šæ©Ÿèƒ½ãŒç„¡åŠ¹åŒ–ã•ã‚Œã¦ã„ã¾ã™"

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr "SCAP results ã®ãƒ•ã‚¡ã‚¤ãƒ«è»¢é€ãŒæ­£ã—ããªã„ã‹ã€ä¸å®Œå…¨ã§ã™"

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr "è©³ç´°ãª SCAP results ã«å¯¾ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãƒ‘ã‚¹ã®ç”Ÿæˆæ™‚ã«ã‚¨ãƒ©ãƒ¼"

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr "è©³ç´°ãª SCAP results ã«å¯¾ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ãƒ‘ã‚¹ã®ç”Ÿæˆæ™‚ã«ã‚¨ãƒ©ãƒ¼"

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""
"\n"
"     è¦æ±‚ã®å‡¦ç†ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ å•é¡ŒãŒè§£æ±ºã—ãªã„å ´åˆã¯ã€\n"
"     scc.suse.com ã«ã¦ãƒã‚°å ±å‘Šã‚’æå‡ºã—ã¦ãã ã•ã„ã€‚\n"
"     ãƒã‚°å ±å‘Šã‚’è¡Œãªã†å ´åˆã¯ã€ ã‚¨ãƒ©ãƒ¼ãŒèµ·ããŸã¨ãã«ä½•ã‚’è¡ŒãªãŠã†ã¨ã—ã¦ã„ãŸã®"
"ã‹ã€\n"
"     ã¾ãŸå•é¡Œã‚’å†ç¾ã™ã‚‹å ´åˆã®æ‰‹é †ãªã©ã‚’è©³ã—ãè¨˜å…¥ã—ã¦ã„ãŸã ã‘ã‚‹ã‚ˆã†\n"
"     ãŠé¡˜ã„ã—ã¾ã™ã€‚\n"

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""
"ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸:\n"
"    %s\n"

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr "ã‚¨ãƒ©ãƒ¼ã‚¯ãƒ©ã‚¹ã‚³ãƒ¼ãƒ‰: %s\n"

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr "ã‚¨ãƒ©ãƒ¼ã‚¯ãƒ©ã‚¹æƒ…å ±: %s\n"

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr "èª¬æ˜Ž: %s"

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr "ã‚¨ãƒ©ãƒ¼: %s %s: %s"

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr "ãƒˆãƒ¬ãƒ¼ã‚¹ãƒãƒƒã‚¯: %s"

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr "%s ã®æ›¸å¼ã¯å°‘ãªãã¨ã‚‚ YYYYMMDD ã§ã‚ã‚‹ã¹ãã§ã™ã€‚\n"

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""
"\n"
"ã‚¨ãƒ©ãƒ¼: ã‚¹ãƒ†ãƒƒãƒ— %s ã®å®Ÿè¡Œæ™‚ã«ã‚¨ãƒ©ãƒ¼:\n"
"%s\n"

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""
"\n"
"ã‚¨ãƒ©ãƒ¼: ä¸€æ™‚ãƒªãƒã‚¸ãƒˆãƒªãƒ¼ã‹ã‚‰ãƒãƒ£ãƒ³ãƒãƒ«ãƒ‡ãƒ¼ã‚¿ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹éš›ã«å•é¡ŒãŒã‚ã‚Šã¾ã—"
"ãŸã€‚\n"
"       ã“ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«å¯¾ã—ã¦ã€ãƒãƒ£ãƒ³ãƒãƒ« ISO ã‹ã‚‰ã®å…¨ã¦ã®ãƒ‡ãƒ¼ã‚¿ã‚’ç§»è¡Œã—ã¦"
"ã‚ã‚Šã¾ã™ã‹ï¼Ÿ\n"
"       ãƒãƒ£ãƒ³ãƒãƒ« ISO ã®å†…å®¹ãŒå…¨ã¦ç§»è¡Œã•ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’ç¢ºèªã—ã¦å†åº¦ãƒžã‚¦ãƒ³ãƒˆã‚’"
"è¡Œãªã„ã€\n"
"       ä¸€æ™‚ãƒªãƒã‚¸ãƒˆãƒªãƒ¼ (%s) å†…ã«å†æŠ•å…¥ã—ã¦ãã ã•ã„ã€‚\n"

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""
"\n"
"ã‚¨ãƒ©ãƒ¼: æƒ…å ±ã‚’åŒæœŸã™ã‚‹éš›ã«å•é¡ŒãŒã‚ã‚Šã¾ã—ãŸã€‚\n"
"       ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸: %s\n"

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""
"\n"
"ã‚¨ãƒ©ãƒ¼: ISS Master ã¨é€šä¿¡ã™ã‚‹éš›ã«å•é¡ŒãŒã‚ã‚Šã¾ã—ãŸã€‚\n"
"       ã‚¨ãƒ©ãƒ¼ã®è©³ç´°ã«ã‚‚ã‚ˆã‚Šã¾ã™ãŒã€è¨­å®šã‚„ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®æŽ¥ç¶šã€åå‰è§£æ±ºãªã©ãŒæ­£"
"ã—ãå‹•ä½œ\n"
"       ã™ã‚‹ã“ã¨ã‚’ã”ç¢ºèªã®ã†ãˆã€ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„ã€‚\n"
"       ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸: %s\n"

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""
"\n"
"ã‚¨ãƒ©ãƒ¼: ISS Master ã¨ã®é€šä¿¡ã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚Šã¾ã—ãŸã€‚\n"
"       ãƒžã‚¹ã‚¿ãƒ¼ Satellite ãŒãƒãƒ¼ã‚¸ãƒ§ãƒ³ 5.3 ã‚ˆã‚Šã‚‚å¤ã„å ´åˆã€ ISS ã®æ©Ÿèƒ½ã¯æä¾›"
"ã•ã‚Œã¦ã„ã¾ã›ã‚“ã€‚\n"
"       ãƒžã‚¹ã‚¿ãƒ¼ Satellite ãŒãƒãƒ¼ã‚¸ãƒ§ãƒ³ 5.3 ã‚‚ã—ãã¯ãã‚Œä»¥é™ã®å ´åˆã¯ã€ã‚¨ãƒ©ãƒ¼ã®"
"è©³ç´°ã«ã‚‚ã‚ˆã‚Šã¾ã™ãŒã€\n"
"       è¨­å®šã‚„ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®æŽ¥ç¶šã€åå‰è§£æ±ºãªã©ãŒæ­£ã—ãå‹•ä½œã™ã‚‹ã“ã¨ã‚’ã”ç¢ºèªã®ã†"
"ãˆã€ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„ã€‚\n"
"       ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸: %s\n"

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""
"\n"
"ã‚¨ãƒ©ãƒ¼: å­ãƒãƒ£ãƒ³ãƒãƒ«ã‚’åŒæœŸã™ã‚‹ã«ã‚ãŸã£ã¦ã¯ã€è¦ªãƒãƒ£ãƒ³ãƒãƒ«ã‚‚åŒæœŸã™ã‚‹å¿…è¦ãŒã‚ã‚Š"
"ã¾ã™ã€‚\n"
"       è¦ªãƒãƒ£ãƒ³ãƒãƒ«ã¯ä»¥å‰ã«åŒæœŸã•ã‚Œã¦ã„ã‚‹ã‹ã€ã‚‚ã—ãã¯å­ãƒãƒ£ãƒ³ãƒãƒ«ã¨ä¸¦è¡Œã—ã¦åŒ"
"æœŸã•ã›ã‚‹\n"
"       å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã«å¯¾ã™ã‚‹è¦ªãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“:\n"
"       %s\n"

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""
"\n"
"ã‚¨ãƒ©ãƒ¼: ã“ã®ãƒãƒ£ãƒ³ãƒãƒ«ã‚»ãƒƒãƒˆå†…ã§ãƒãƒ£ãƒ³ãƒãƒ«ã‚’åŒæœŸã™ã‚‹ãŸã‚ã®ã‚¨ãƒ³ã‚¿ã‚¤ãƒˆãƒ«ãƒ¡ãƒ³ãƒˆ"
"ãŒã‚ã‚Šã¾ã›ã‚“ã€‚\n"
"SUSE Manager ã«é€£çµ¡ã‚’è¡Œãªã£ã¦ãã ã•ã„\n"
"%s"

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr "  ã‚¨ãƒ©ãƒ¼: ãƒ‡ãƒã‚¤ã‚¹ã«ååˆ†ãªç©ºãå®¹é‡ (%s KB) ãŒã‚ã‚Šã¾ã›ã‚“ã€‚"

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr "    %3d/%s ãƒ•ã‚§ãƒƒãƒæˆåŠŸ: %s (%s ãƒã‚¤ãƒˆ)"

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr "    å»ƒæ­¢ã•ã‚ŒãŸãƒ‘ãƒƒã‚±ãƒ¼ã‚¸:  %s"

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr "   åˆè¨ˆã‚µã‚¤ã‚º: %s"

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr "      %s / %s ã‚’ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰æ¸ˆã¿ã§ã™ã€‚äºˆæ¸¬ã•ã‚Œã‚‹æ®‹ã‚Šæ™‚é–“: %s"

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr "    ãƒ•ã‚§ãƒƒãƒæœªæˆåŠŸ: %s"

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr "   RPM ãƒ•ã‚§ãƒƒãƒæ¦‚è¦: %s"

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr "       æˆåŠŸ: %d"

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr "       å¤±æ•—:  %d"

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr "       æ¶ˆæ»…: %d"

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr "   *é–¢é€£ã™ã‚‹* ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’å–å¾—ï¼å‡¦ç†ã—ã¦ã„ã¾ã™: %s (%s)"

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr "   ã‚¨ãƒ©ãƒ¼ã‚¿ã®ãƒ‡ãƒ¼ã‚¿ã‚’å–å¾—ï¼å‡¦ç†ã—ã¦ã„ã¾ã™: %s (%s)"

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr "   ã‚­ãƒƒã‚¯ã‚¹ã‚¿ãƒ¼ãƒˆã®ãƒ‡ãƒ¼ã‚¿ã‚’å–å¾—ï¼å‡¦ç†ã—ã¦ã„ã¾ã™: %s (%s)"

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr "   ã‚­ãƒƒã‚¯ã‚¹ã‚¿ãƒ¼ãƒˆã®ãƒ„ãƒªãƒ¼ãƒ•ã‚¡ã‚¤ãƒ«ã‚’å–å¾—ï¼å‡¦ç†ã—ã¦ã„ã¾ã™: %s (%s)"

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr "   *é–¢é€£ã™ã‚‹* ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’å–ã‚Šè¾¼ã‚“ã§ã„ã¾ã™: %s (%s)"

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr "   * è­¦å‘Š: ã“ã®å‡¦ç†ã«ã¯æ™‚é–“ãŒã‹ã‹ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“ã€‚"

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr "ãƒãƒ£ãƒ³ãƒãƒ«ã«å¯¾ã—ã¦ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã®ãƒªãƒ³ã‚¯ã‚’ä½œæˆã—ã¦ã„ã¾ã™"

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr "   *é–¢é€£ã™ã‚‹* ã‚¨ãƒ©ãƒ¼ã‚¿ã‚’å–ã‚Šè¾¼ã‚“ã§ã„ã¾ã™: %s (%s)"

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr "   å–ã‚Šè¾¼ã‚€ã¹ãæ–°ã—ã„ã‚­ãƒƒã‚¯ã‚¹ã‚¿ãƒ¼ãƒˆå¯èƒ½ãªãƒ„ãƒªãƒ¼ã¯ã‚ã‚Šã¾ã›ã‚“"

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr "ã‚­ãƒƒã‚¯ã‚¹ã‚¿ãƒ¼ãƒˆå¯èƒ½ãªãƒ„ãƒªãƒ¼ã‚’å–ã‚Šè¾¼ã‚“ã§ã„ã¾ã™ (%d)"

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr "ã‚­ãƒƒã‚¯ã‚¹ã‚¿ãƒ¼ãƒˆå¯èƒ½ãªãƒ„ãƒªãƒ¼ã‚’å–ã‚Šè¾¼ã¿ã¾ã—ãŸ (%d)"

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr "+++ é›»å­ãƒ¡ãƒ¼ãƒ«ã§ãƒ­ã‚°ã‚’é€ä¿¡ +++"

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr "%s åŒæœŸã€‚ %s ã‹ã‚‰ã®ãƒ¬ãƒãƒ¼ãƒˆ"

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr "+++ é›»å­ãƒ¡ãƒ¼ãƒ«ã®è¦æ±‚ãŒã‚ã‚Šã¾ã—ãŸãŒã€é€ä¿¡ã™ã¹ãå†…å®¹ãŒã‚ã‚Šã¾ã›ã‚“ +++"

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""
"\"%s\" (ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³å†…ã§æŒ‡å®šã•ã‚Œã¦ã„ã¾ã™)\n"
"ã‚’é–‹ã„ã¦èª­ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“:\n"
"%s"

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""
"\"%s\" ã‚’é–‹ã„ãŸã‚Šæ›¸ãè¾¼ã‚“ã ã‚Šã™ã‚‹\n"
"ã“ã¨ãŒã§ãã¾ã›ã‚“:\n"
"%s"

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr "ã‚¹ãƒ†ãƒƒãƒ— %s ã«å¯¾ã™ã‚‹ãƒãƒ³ãƒ‰ãƒ©ãŒã‚ã‚Šã¾ã›ã‚“"

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr "ç’°å¢ƒãŒå¤‰æ›´ã•ã‚Œã¾ã—ãŸã€‚å†è©¦è¡Œã—ã¦ã„ã¾ã™..."

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr "ã‚¨ãƒ©ãƒ¼: IntegrityError ã«é­é‡ã—ã¾ã—ãŸ: \n"

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr "ç¹°ã‚Šè¿”ã—ã®å¤±æ•—"

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""
"    å–ã‚Šè¾¼ã¿ãŒå®Œäº†ã—ã¾ã—ãŸ:\n"
"        é–‹å§‹æ™‚åˆ»: %s\n"
"        çµ‚äº†æ™‚åˆ»: %s\n"
"        çµŒéŽæ™‚é–“: %s\n"
"          "

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr "æ™‚é–“"

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr "åˆ†"

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr "ç§’"

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""
"ã‚¨ãƒ©ãƒ¼: ãƒ€ãƒ³ãƒ—ã«ã¯ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ãƒ‡ãƒ¼ã‚¿ãŒã‚ã‚Šã¾ã›ã‚“ã€‚ --no-rpms ã‚’æŒ‡å®šã—ã¦ã“ã®ã‚¹"
"ãƒ†ãƒƒãƒ—ã‚’é£›ã°ã™ã‹ã€ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ãƒ‡ãƒ¼ã‚¿ãŒå«ã¾ã‚Œã‚‹ã‚ˆã†ã«å†…å®¹ã‚’ä¿®æ­£ã—ã¦ãã ã•ã„ã€‚"

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr "SUSE Manager ãƒžã‚¹ã‚¿ãƒ¼ã¯çµ„ç¹”ãƒ‡ãƒ¼ã‚¿ã®åŒæœŸã‚’ã‚µãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“ã€‚"

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr "é£›ã°ã—ã¦ã„ã¾ã™..."

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr "SUSE Manager ã‚µãƒ¼ãƒé–“åŒæœŸã§ã™ã€‚ %s ã‹ã‚‰ã®ãƒ¬ãƒãƒ¼ãƒˆ"

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr " - ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ã®åŒæœŸ"

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr " - ãƒ©ã‚¤ãƒ–åŒæœŸ"

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""
"ã‚¨ãƒ©ãƒ¼: RHN Classic Hosted ã‚’åˆ©ç”¨ã—ãŸãƒ©ã‚¤ãƒ–ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®åŒæœŸã¯ã€ã‚‚ã¯ã‚„ã‚µãƒãƒ¼ãƒˆ"
"ã•ã‚Œã¦ã„ã¾ã›ã‚“ã€‚\n"
"ã‚µãƒ¼ãƒé–“åŒæœŸ (ISS) ã‚’ä»‹ã—ã¦ä»–ã® {PRODUCT_NAME} ã‹ã‚‰åŒæœŸã‚’è¡Œãªã£ã¦ã„ã‚‹å ´åˆã‚„ã€"
"ãƒãƒ£ãƒ³ãƒãƒ«ãƒ€ãƒ³ãƒ— ISO ã‚’åˆ©ç”¨ã—ã¦ãƒ‡ã‚£ã‚¹ã‚¯å†…ã®ãƒ­ãƒ¼ã‚«ãƒ«ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã‹ã‚‰åŒæœŸã‚’è¡Œãªã£"
"ã¦ã„ã‚‹å ´åˆã‚’é™¤ãã€ä»£ã‚ã‚Šã« cdn-sync ã‚³ãƒžãƒ³ãƒ‰ã‚’ä½¿ç”¨ã—ã¦ãã ã•ã„ã€‚"

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr "   URL: %s"

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr "   ãƒ‡ãƒãƒƒã‚°ï¼å‡ºåŠ›ãƒ¬ãƒ™ãƒ«: %s"

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr "ã‚¨ãƒ©ãƒ¼: ã“ã®ã‚µãƒ¼ãƒã‚’ SUSE Manager ã§ç™»éŒ²ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ã€‚"

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr "%s ã®ãƒ‡ãƒ¼ã‚¿ã‚’å–å¾—ï¼å‡¦ç†ã—ã¦ã„ã¾ã™"

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr "*** ã‚·ã‚¹ãƒ†ãƒ å‰²ã‚Šè¾¼ã¿ãŒå‘¼ã³å‡ºã•ã‚Œã¾ã—ãŸ ***"

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr "ã‚¨ãƒ©ãƒ¼: è‡´å‘½çš„ãªå‡¦ç†ä¾‹å¤–ãŒç™ºç”Ÿã—ã¾ã—ãŸ "

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr "(è¡Œ: %s, åˆ—: %s ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸: %s)"

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr "ã‚¨ãƒ©ãƒ¼: å‡¦ç†ä¾‹å¤–ãŒç™ºç”Ÿã—ã¾ã—ãŸ: %s"

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr "ã‚¨ãƒ©ãƒ¼: ä¾‹å¤– (å‡¦ç†æ™‚) ãŒç™ºç”Ÿã—ã¾ã—ãŸ: "

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""
"   %s ãƒ‡ãƒ¼ã‚¿ã§ã„ãã¤ã‹ã®ã‚¨ãƒ©ãƒ¼ã«é­é‡ã—ã¾ã—ãŸ (è©³ã—ãã¯ãƒ­ã‚° (%s) ã‚’ãŠèª­ã¿ãã "
"ã•ã„)"

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr "   %s ãƒ‡ãƒ¼ã‚¿ã§ã„ãã¤ã‹ã®ã‚¨ãƒ©ãƒ¼ã«é­é‡ã—ã¾ã—ãŸ:"

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr "   ------- %s å‡¦ç†ï¼å–ã‚Šè¾¼ã¿ã‚¨ãƒ©ãƒ¼ -------"

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr "   ---------------------------------------"

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr "%s ãƒ‡ãƒ¼ã‚¿å®Œäº†"

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr "ãƒãƒ£ãƒ³ãƒãƒ«ãƒ‡ãƒ¼ã‚¿ã®å–å¾—ï¼å‡¦ç†ã‚’è¡Œãªã£ã¦ã„ã¾ã™"

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr "ãƒãƒ£ãƒ³ãƒãƒ«ãƒ‡ãƒ¼ã‚¿å®Œäº†"

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr "%10s %s ã‹ã‚‰å–ã‚Šè¾¼ã¿"

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr "%10s %s - %s ã‹ã‚‰å–ã‚Šè¾¼ã¿"

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr "%10s"

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr "p"

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr "."

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr "   p = ä»¥å‰ã«å–ã‚Šè¾¼ã¿ï¼åŒæœŸã—ãŸãƒãƒ£ãƒ³ãƒãƒ«"

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr "   . = ã¾ã å–ã‚Šè¾¼ã¿ï¼åŒæœŸã—ã¦ã„ãªã„ãƒãƒ£ãƒ³ãƒãƒ«"

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr "   e = ã‚µãƒãƒ¼ãƒˆå¯¾è±¡å¤–ã®ãƒãƒ£ãƒ³ãƒãƒ« (ã‚µãƒ¼ãƒ“ã‚¹çµ‚äº†æ¸ˆã¿)"

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr "   ? = ãƒãƒ£ãƒ³ãƒãƒ«ãƒ©ãƒ™ãƒ«ãŒæ­£ã—ããªã„ã‚‚ã® (æŒ‡å®šãƒŸã‚¹ï¼Ÿ)"

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr "   %s:"

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr "      %s %-40s %4s %s"

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr "ãƒ™ãƒ¼ã‚¹ãƒãƒ£ãƒ³ãƒãƒ«"

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr "é–¢ä¿‚ãªã—"

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr "ã‚µãƒ¼ãƒ“ã‚¹çµ‚äº†"

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr "e"

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr "   èª¤è¨˜:"

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr "?"

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr "XXX: å–ã‚Šè¾¼ã‚“ã ãƒãƒ£ãƒ³ãƒãƒ«: %s"

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr "XXX:   ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã—ãŸãƒãƒ£ãƒ³ãƒãƒ«: %s"

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr "XXX: å‘¼ã³å‡ºã—ãŸãƒãƒ£ãƒ³ãƒãƒ«ã®ä¸€è¦§"

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr "ã‚¨ãƒ©ãƒ¼: ã“ã‚Œã‚‰ã®ãƒãƒ£ãƒ³ãƒãƒ«ã¯å­˜åœ¨ã—ã¦ã„ãªã„ã‹ã€åˆ©ç”¨ãŒã§ãã¾ã›ã‚“:"

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr "       (ãƒãƒ£ãƒ³ãƒãƒ«ãƒ©ãƒ™ãƒ«ã®ä¸€è¦§ã‚’è¡¨ç¤ºã™ã‚‹ã«ã¯: %s --list-channels)"

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr "   çŸ­ã„ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’å–å¾—ï¼å‡¦ç†ã—ã¦ã„ã¾ã™: %s (%s)"

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""
"ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã®å·®åˆ†ã‚’æŠ½å‡ºã—ã¦ã„ã¾ã™ (ãƒ­ãƒ¼ã‚«ãƒ«å´ã«ä½•ãŒç„¡ã„ã®ã‹ã‚’èª¿ã¹"
"ã¦ã„ã¾ã™): %s"

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr "å·®åˆ†ã‚’æŠ½å‡ºã—ã¦ã„ã¾ã™:    "

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr "ã‚¨ãƒ©ãƒ¼: å¢—åˆ†ãƒ€ãƒ³ãƒ—ã‚’é£›ã°ã—ã¾ã—ãŸ"

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr "rpm ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã‚’ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¦ã„ã¾ã™"

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr "   å­˜åœ¨ã—ã¦ã„ãªã„ RPM ã‚’ãƒ•ã‚§ãƒƒãƒã—ã¦ã„ã¾ã™: %s (%s)"

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr "å­˜åœ¨ã—ãªã„ã‚‚ã®ã¯ã‚ã‚Šã¾ã›ã‚“"

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr "rpm ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã®å‡¦ç†ãŒå®Œäº†ã—ã¾ã—ãŸ"

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr "ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¦ã„ã¾ã™"

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr "srpm ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã‚’ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¦ã„ã¾ã™"

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr "   å­˜åœ¨ã—ã¦ã„ãªã„ SRPM ã‚’ãƒ•ã‚§ãƒƒãƒã—ã¦ã„ã¾ã™: %s (%s)"

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""
"ã‚½ãƒ¼ã‚¹ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã®å·®åˆ†ã‚’æŠ½å‡ºã—ã¦ã„ã¾ã™ (ãƒ­ãƒ¼ã‚«ãƒ«å´ã«ä½•ãŒç„¡ã„ã®ã‹"
"ã‚’èª¿ã¹ã¦ã„ã¾ã™): %s"

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr "ã‚½ãƒ¼ã‚¹ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¦ã„ã¾ã™"

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr "ãƒ•ã‚¡ã‚¤ãƒ« %s ã‚’ä¿å­˜ã§ãã¾ã›ã‚“: %s"

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr "ãƒ•ã‚¡ã‚¤ãƒ« %s ã®ãƒ•ã‚§ãƒƒãƒãŒå¤±æ•—ã—ã¾ã—ãŸ"

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr "ã‚­ãƒƒã‚¯ã‚¹ã‚¿ãƒ¼ãƒˆå¯èƒ½ãªãƒ„ãƒªãƒ¼ã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¦ã„ã¾ã™"

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr "ã‚­ãƒƒã‚¯ã‚¹ã‚¿ãƒ¼ãƒˆå¯èƒ½ãªãƒ„ãƒªãƒ¼ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¦ã„ã¾ã™"

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr "ãƒãƒ£ãƒ³ãƒãƒ« %s ã«å¯¾ã™ã‚‹å…¨ã¦ã®ãƒ‘ãƒƒãƒã‚’ã¤ã‹ã‚“ã§ã„ã¾ã™"

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr "ãƒ‘ãƒƒãƒãƒ‡ãƒ¼ã‚¿ã‚’ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¦ã„ã¾ã™"

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""
"è¦æ±‚ã—ãŸãƒãƒ£ãƒ³ãƒãƒ«ã«å¯¾ã™ã‚‹å…¨ã¦ã®ãƒ‘ãƒƒãƒãƒ‡ãƒ¼ã‚¿ã‚’å¼·åˆ¶ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¦ã„ã¾ã™ã€‚"

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr "ãƒ‘ãƒƒãƒãƒ‡ãƒ¼ã‚¿ã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ãŒå®Œäº†ã—ã¾ã—ãŸ"

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr "ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¦ã„ã¾ã™:"

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr " - å®Œäº†"

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr "ã‚½ãƒ¼ã‚¹ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’å–ã‚Šè¾¼ã‚“ã§ã„ã¾ã™"

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr "ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’å–ã‚Šè¾¼ã‚“ã§ã„ã¾ã™"

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr "å–ã‚Šè¾¼ã‚“ã§ã„ã¾ã™:  "

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""
"ã‚­ãƒ£ãƒƒã‚·ãƒ¥å†…ã«ã¯ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã€‚ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’å†ç”Ÿæˆã™ã‚‹ã«ã¯ã‚¯ãƒªã‚¢"
"ã—ã¦ãã ã•ã„ã€‚"

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr "ãƒãƒ£ãƒ³ãƒãƒ«ãƒ‘ãƒƒãƒã‚’å–ã‚Šè¾¼ã‚“ã§ã„ã¾ã™"

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr "%s å€‹ã®ãƒ‘ãƒƒãƒã‚’ãƒãƒ£ãƒ³ãƒãƒ« %s ã«å¯¾ã—ã¦å–ã‚Šè¾¼ã‚“ã§ã„ã¾ã™ã€‚"

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr "ã‚¨ãƒ©ãƒ¼: è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«å†…ã§ server.mount_point ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr "ã‚¨ãƒ©ãƒ¼: server.mount_point %s ãŒå­˜åœ¨ã—ã¾ã›ã‚“"

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr "ã‚¨ãƒ©ãƒ¼: server.mount_point (%s) ä»¥ä¸‹ã®ãƒ‘ã‚¹ãŒå­˜åœ¨ã—ã¦ã„ã¾ã›ã‚“"

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr "ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³: %s"

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""
"ãƒ‡ãƒãƒƒã‚°ã®ã¿: XMLï¼ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å–ã‚Šè¾¼ã¿ã«å¯¾ã™ã‚‹æœ€å¤§ãƒãƒƒãƒã‚µã‚¤ã‚º (1..%s) ã€‚è©³"
"ã—ãã¯ \"man satellite-sync\" ã‚’ãŠèª­ã¿ãã ã•ã„ã€‚"

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr "ä»£æ›¿ SSL CA è¨¼æ˜Žæ›¸ (è¨¼æ˜Žæ›¸ãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã™ã‚‹ãƒ•ãƒ«ãƒ‘ã‚¹)"

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr "ã“ã®ãƒãƒ£ãƒ³ãƒãƒ«ã«å¯¾ã—ã¦ã®ã¿ãƒ‡ãƒ¼ã‚¿ã‚’å‡¦ç†"

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""
"ãƒ‡ã‚£ã‚¹ã‚¯ãƒ€ãƒ³ãƒ—ã¯å®Œå…¨ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚è©³ã—ãã¯ \"man satellite-sync"
"\" ã‚’ãŠèª­ã¿ãã ã•ã„ã€‚"

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr "æ—¢å­˜ã®ç‹¬è‡ªãƒãƒ£ãƒ³ãƒãƒ«ã«ã¤ã„ã¦ã‚‚åŒæœŸãŒè¡Œãªã‚ã‚Œã¾ã™ (-c ã‚’æŒ‡å®šã—ãªã„é™ã‚Š)"

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""
"/etc/rhn/rhn.conf  å†…ã§ãƒ‡ãƒãƒƒã‚°ãƒ¬ãƒ™ãƒ«ã‚’ä¸Šæ›¸ã (ç¾åœ¨ %s ã«è¨­å®šã•ã‚Œã¦ã„ã¾ã™) ã€‚"

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr "XML ãƒ€ãƒ³ãƒ—ã®è¦æ±‚ãƒãƒ¼ã‚¸ãƒ§ãƒ³ (æ—¢å®šå€¤: %s)"

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr "åŒæœŸãŠã‚ˆã³å–ã‚Šè¾¼ã‚“ã ã‚‚ã®ã®ãƒ¬ãƒãƒ¼ãƒˆã‚’é›»å­ãƒ¡ãƒ¼ãƒ«é€ä¿¡"

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr "å…¨ã¦ã®ãƒ‘ãƒƒãƒã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’ (å·®åˆ†å‡¦ç†ã§ã¯ãªã) å¼·åˆ¶å‡¦ç†"

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr "ã©ã®ã‚ˆã†ãªçŠ¶æ³ä¸‹ã§ã‚‚ http ãƒ—ãƒ­ã‚­ã‚·ã‚’ä½¿ç”¨ã—ã¾ã›ã‚“ã€‚"

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr "ä»£æ›¿ http ãƒ—ãƒ­ã‚­ã‚· (ãƒ›ã‚¹ãƒˆå:ãƒãƒ¼ãƒˆ)"

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr "ä»£æ›¿ http ãƒ—ãƒ­ã‚­ã‚·ã®ãƒ¦ãƒ¼ã‚¶å"

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr "ä»£æ›¿ http ãƒ—ãƒ­ã‚­ã‚·ã®ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰"

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr "ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆå…ƒã¨ãªã‚‹è¦ª SUSE Manager"

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr "åˆ©ç”¨å¯èƒ½ãªå…¨ã¦ã®ãƒãƒ£ãƒ³ãƒãƒ«ã‚’ä¸€è¦§è¡¨ç¤ºã—ã¦çµ‚äº†"

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr "mgr-inter-sync ãŒè¿”ã™å…¨ã¦ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã«å¯¾ã™ã‚‹ãƒ˜ãƒ«ãƒ—"

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr "å–ã‚Šè¾¼ã¿å…ƒã¨ãªã‚‹ãƒžã‚¦ãƒ³ãƒˆãƒã‚¤ãƒ³ãƒˆ - ãƒ‡ã‚£ã‚¹ã‚¯æ›´æ–°ã®å ´åˆã®ã¿"

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr "ãƒ‘ãƒƒãƒãƒ‡ãƒ¼ã‚¿ã‚’å‡¦ç†ã—ãªã„"

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr "ã‚­ãƒƒã‚¯ã‚¹ã‚¿ãƒ¼ãƒˆãƒ‡ãƒ¼ã‚¿ã‚’å‡¦ç†ã—ãªã„ (ãƒ—ãƒ­ãƒ“ã‚¸ãƒ§ãƒ‹ãƒ³ã‚°ã®ã¿)"

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr "å®Œå…¨ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’å‡¦ç†ã—ãªã„"

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr "RPM ã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã¨å‡¦ç†ã‚’è¡Œãªã‚ãªã„"

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr "SSL ã‚’ç„¡åŠ¹åŒ–ã™ã‚‹ (éžæŽ¨å¥¨)"

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr "sync ã®ãƒ‡ãƒ¼ã‚¿ã®å–ã‚Šè¾¼ã¿å…ˆã¨ãªã‚‹çµ„ç¹”ã€‚æ—¢å®šå€¤ã¯ç®¡ç†è€…ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ"

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr "è¨­å®šã‚’å°åˆ·ã—ã¦çµ‚äº†"

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr "æŽ¥ç¶šå…ˆã®ä»£æ›¿ã‚µãƒ¼ãƒ (ãƒ›ã‚¹ãƒˆå)"

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr "ã“ã®ã‚¹ãƒ†ãƒƒãƒ—ã¾ã§åŒæœŸ (è©³ã—ãã¯ man satellite-sync ã‚’å‚ç…§)"

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""
"ã‚¢ãƒ—ãƒªã®æ®‹ã‚Šéƒ¨åˆ†ã«ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã™ã‚‹å‰ã«ãƒ†ãƒ³ãƒãƒ©ãƒªãƒ•ã‚¡ã‚¤ãƒ«ã«å®Œå…¨ãªãƒ‡ãƒ¼ã‚¿ã‚’æ›¸"
"ãè¾¼ã‚€"

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr "ãƒ‡ãƒãƒƒã‚°ã®ã¿: ãƒ‡ã‚¸ã‚¿ãƒ«ã‚·ã‚¹ãƒ†ãƒ  ID ã¸ã®ä»£æ›¿ãƒ‘ã‚¹"

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr "åŒæœŸå‡ºåŠ›å‘ã‘ã®ä»£æ›¿é›»å­ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ (--email ã‚ªãƒ—ã‚·ãƒ§ãƒ³)"

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr "ãƒ­ãƒ¼ã‚«ãƒ«ãƒ€ãƒ³ãƒ—ã‹ã‚‰ã®å–ã‚Šè¾¼ã¿æ™‚ã« rpm ã‚’å‰Šé™¤ã—ãªã„"

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""
"ãƒžã‚¹ã‚¿ãƒ¼ Satellite ã®å®Œå…¨ä¿®é£¾ãƒ‰ãƒ¡ã‚¤ãƒ³åã§ã™ã€‚ --mount-point ã¨ä½µç”¨ã—ãŸå ´åˆã«"
"ã®ã¿æœ‰åŠ¹ã§ã™ã€‚çµ„ç¹”ãƒ‡ãƒ¼ã‚¿ã¨ãƒãƒ£ãƒ³ãƒãƒ«è¨±å¯ã‚’å–ã‚Šè¾¼ã¿ãŸã„å ´åˆã«ã¯å¿…è¦ã§ã™ã€‚"

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""
"ã‚¨ãƒ©ãƒ¼: ã“ã‚Œã‚‰ã®ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã¯ã€ã“ã®çŠ¶æ³ä¸‹ã§ã¯æ„å‘³ãŒã‚ã‚Šã¾ã›ã‚“ (è©³ã—ãã¯ --"
"help ã‚’å‚ç…§): %s"

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr "ã‚¨ãƒ©ãƒ¼: ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«æŽ¥ç¶šã§ãã¾ã›ã‚“: %s"

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr "ã‚¨ãƒ©ãƒ¼: ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãŒå‹•ä½œã—ã¦ã„ã‚‹ã‹ã©ã†ã‹ã”ç¢ºèªãã ã•ã„ã€‚"

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr "ã‚¨ãƒ©ãƒ¼: --debug-level ã«ã¯ %s ã®ç¯„å›²å†…ã®æ•´æ•°å€¤ã‚’æŒ‡å®šã—ã¾ã™ã€‚"

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr "  0  - ã”ãã‚ãšã‹ãªãƒ­ã‚°ï¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã¿ã€‚"

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr "  1  - æœ€å°é™ã®ãƒ­ã‚°ï¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã¿ã€‚"

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr "  2  - é€šå¸¸ãƒ¬ãƒ™ãƒ«ã®ãƒ­ã‚°ï¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã€‚"

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr "  3  - å¤šãã®ãƒ­ã‚°ï¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã€‚"

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr "  4+ - éžå¸¸ã«å¤šãã®ãƒ­ã‚°ï¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã€‚"

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""
"ã‚¨ãƒ©ãƒ¼: --master ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã¯ --mount-point ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã¨ä½µç”¨ã—ãŸå ´åˆã«ã®ã¿æœ‰"
"åŠ¹ã§ã™"

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr "ã‚¨ãƒ©ãƒ¼: çµ„ç¹” ID %s ã‚’å‚ç…§ã§ãã¾ã›ã‚“"

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""
"è­¦å‘Š: --list-channels ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã¯ --step ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’ä¸Šæ›¸ãã—ã¦ã—ã¾ã„ã¾ã™ã€‚ "
"--step å´ãŒç„¡è¦–ã•ã‚Œã¾ã™ã€‚"

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""
"ã‚¨ãƒ©ãƒ¼: '%s' ã®ã‚¹ãƒ†ãƒƒãƒ—ãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“ã€‚è©³ã—ãã¯ 'man mgr-inter-sync' ã‚’ãŠ"
"èª­ã¿ãã ã•ã„ã€‚"

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""
"ã‚¨ãƒ©ãƒ¼: ç¾æ™‚ç‚¹ã§ã¯ä½•ã‚‚ãƒãƒ£ãƒ³ãƒãƒ«ã‚’å–ã‚Šè¾¼ã‚“ã§ã„ã¾ã›ã‚“ã€‚ mgr-inter-sync --list-"
"channels ã‚’å®Ÿè¡Œã—ãŸã‚ã¨ mgr-inter-sync -c chn0 -c chn1... ã®ã‚ˆã†ã«å®Ÿè¡Œã—ã¦ã"
"ã ã•ã„ã€‚"

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr "ã‚¨ãƒ©ãƒ¼: --batch-size ã®å€¤ã¯ 1..50 ã¾ã§ã®å€¤ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr "ã‚¨ãƒ©ãƒ¼: ãã®ã‚ˆã†ãªãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¯ã‚ã‚Šã¾ã›ã‚“ %s"

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr "ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰: è¿”ã•ã‚ŒãŸå€¤ã®æ„å‘³ã¯ä¸‹è¨˜ã®ã¨ãŠã‚Šã§ã™:"

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""
" -1  - ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ãƒ­ãƒƒã‚¯ã§ããªã‹ã£ãŸã‹ã€ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰å‰²ã‚Šè¾¼ã¿ã‚„ã‚·ã‚¹ãƒ†ãƒ ã®çµ‚äº†ãŒç™º"
"ç”Ÿã—ã¦ã„ã¾ã™"

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr "  0  - ãƒ¦ãƒ¼ã‚¶å´ã§ã®å‰²ã‚Šè¾¼ã¿ã‹çµ‚äº†æŒ‡ç¤ºãŒè¡Œãªã‚ã‚Œã¾ã—ãŸ"

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr "  1  - mgr-inter-sync ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’è¤‡æ•°å€‹å®Ÿè¡Œã—ã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚"

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr "  2  - åŒæœŸãƒ„ãƒ¼ãƒ«ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr "  3  - ä¸€èˆ¬çš„ãªã‚½ã‚±ãƒƒãƒˆä¾‹å¤–ãŒç™ºç”Ÿã—ã¾ã—ãŸ"

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr "  4  - SSL ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ SSL ã®è¨­å®šã‚’å†ç¢ºèªã—ã¦ãã ã•ã„ã€‚"

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr "  5  - ISS ã‚¨ãƒ©ãƒ¼"

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr "  6  - ãƒãƒ³ãƒ‰ãƒ«ã•ã‚Œã¦ã„ãªã„ä¾‹å¤–ãŒç™ºç”Ÿã—ã¾ã—ãŸ"

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr "  7  - æœªçŸ¥ã®åŒæœŸã‚¨ãƒ©ãƒ¼ã§ã™"

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr "  8  - ã‚¨ãƒ©ãƒ¼: å®Ÿè¡Œã™ã‚‹ã«ã¯ root ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“"

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr "  9  - åŒæœŸã®æº–å‚™æ™‚ã« rpclib ã®ä¾‹å¤–ãŒç™ºç”Ÿã—ã¾ã—ãŸ"

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr "  10 - åŒæœŸã®æº–å‚™æ™‚ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr "  11 - XML ã‚¹ãƒˆãƒªãƒ¼ãƒ ã®å‡¦ç†æ™‚ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr "  12 - ãƒãƒ£ãƒ³ãƒãƒ«ãŒå­˜åœ¨ã—ã¦ã„ã¾ã›ã‚“"

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr "  13 - ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã‚’å‡¦ç†ã™ã‚‹éš›ã« SQL ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr "  14 - ãƒãƒ£ãƒ³ãƒãƒ«ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã®ãƒªãƒ³ã‚¯æ™‚ã« SQL ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr "  15 - XML å‡¦ç†æ™‚ã« SQL ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr "  16 - è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«å†…ã§ server.mount_point ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""
"  17 - SUSE Manager ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å†…ã«æ—¢ã«å–ã‚Šè¾¼ã¾ã‚Œã¦ã„ã‚‹ãƒãƒ£ãƒ³ãƒãƒ«ã‚’å–å¾—ã™ã‚‹"
"éš›ã«ã€ SQL ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr "  18 - rhn.conf å†…ã® DB æŽ¥ç¶šæ–‡å­—åˆ—ãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“"

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr "  19 - ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“"

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr "  20 - DB ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr "  21 - ãƒ‡ãƒãƒƒã‚°ãƒ¬ãƒ™ãƒ«ãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“"

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr "  22 - ã‚¹ãƒ†ãƒƒãƒ—ãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“"

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr "  24 - ãã®ã‚ˆã†ãªãƒ•ã‚¡ã‚¤ãƒ«ã¯ã‚ã‚Šã¾ã›ã‚“"

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr "  25 - ãã®ã‚ˆã†ãªãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¯ã‚ã‚Šã¾ã›ã‚“"

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr "  26 - mount_point ãŒå­˜åœ¨ã—ã¾ã›ã‚“"

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr "  27 - ãã®ã‚ˆã†ãªçµ„ç¹”ã¯ã‚ã‚Šã¾ã›ã‚“"

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""
"  28 - ã‚¨ãƒ©ãƒ¼: --master ã¯ --mount-point ã¨ã¨ã‚‚ã«æŒ‡å®šã—ãŸå ´åˆã«ã®ã¿æœ‰åŠ¹ã§ã™"

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr "ã‚¨ãƒ©ãƒ¼: æœªçŸ¥ã®ãƒ€ãƒ³ãƒ—ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã™ã€‚ %s ã®ã„ãšã‚Œã‹ã‚’ãŠè©¦ã—ãã ã•ã„"

#~ msgid "Your system was not found in the RHN database"
#~ msgstr "ã‚·ã‚¹ãƒ†ãƒ ãŒ RHN ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å†…ã«ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"

#~ msgid "ISS is disabled on this satellite."
#~ msgstr "ISS ãŒã“ã® Satellite ã§ã¯ç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚"

#, fuzzy
#~ msgid "Spacewalk Proxy service not enabled for server profile: \"%s\""
#~ msgstr ""
#~ "RHN Proxy ã‚µãƒ¼ãƒ“ã‚¹ãŒã‚µãƒ¼ãƒãƒ¼ãƒ—ãƒ­ãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦æœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã›ã‚“: "
#~ "ã€Œ%sã€"

#~ msgid "Red Hat Satellite Welcome Message"
#~ msgstr "Red Hat Satellite ã®ã‚ˆã†ã“ããƒ¡ãƒƒã‚»ãƒ¼ã‚¸"

#, fuzzy
#~ msgid "Red Hat Satellite Privacy Statement"
#~ msgstr "Red Hat Network ãƒ—ãƒ©ã‚¤ãƒã‚·ãƒ¼ã‚¹ãƒ†ãƒ¼ãƒˆãƒ¡ãƒ³ãƒˆ"
07070100000078000081B40000000000000000000000015FBBE8EE0000B6A1000000000000000000000000000000000000001B00000000spacewalk-backend/po/kn.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# shankar prasad <svenkate@redhat.com>, 2006.
# shankar Prasad <svenkate@redhat.com>, 2006.
# Shankar Prasad <svenkate@redhat.com>, 2007.
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Kannada (http://www.transifex.com/projects/p/fedora/language/"
"kn/)\n"
"Language: kn\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
   07070100000079000081B40000000000000000000000015FBBE8EE0000B6CA000000000000000000000000000000000000001B00000000spacewalk-backend/po/ko.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Eunju Kim <eukim@redhat.com>, 2006, 2007.
# Michelle Ji Yeen Kim <mkim@redhat.com>, 2005.
# Michelle J Kim <mkim@redhat.com>, 2003, 2004.
# Michelle Kim <mkim@redhat.com>, 2002.
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Korean (http://www.transifex.com/projects/p/fedora/language/"
"ko/)\n"
"Language: ko\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
  0707010000007A000081B40000000000000000000000015FBBE8EE0000B663000000000000000000000000000000000000001B00000000spacewalk-backend/po/lt.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Lithuanian (http://www.transifex.com/projects/p/fedora/"
"language/lt/)\n"
"Language: lt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n"
"%100<10 || n%100>=20) ? 1 : 2);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
 0707010000007B000081B40000000000000000000000015FBBE8EE0000B621000000000000000000000000000000000000001C00000000spacewalk-backend/po/mai.po   # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Maithili (http://www.transifex.com/projects/p/fedora/language/"
"mai/)\n"
"Language: mai\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
   0707010000007C000081B40000000000000000000000015FBBE8EE0000B62B000000000000000000000000000000000000001B00000000spacewalk-backend/po/ml.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Ani Peter <apeter@redhat.com>, 2006, 2007.
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Malayalam <discuss@lists.smc.org.in>\n"
"Language: ml\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
 0707010000007D000081B40000000000000000000000015FBBE8EE0000B681000000000000000000000000000000000000001B00000000spacewalk-backend/po/mr.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Rahul Bhalerao <b.rahul.pm@gmail.com>, 2006.
# Rahul Bhalerao <rahul.bhalerao@redhat.com>, 2007.
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Marathi (http://www.transifex.com/projects/p/fedora/language/"
"mr/)\n"
"Language: mr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
   0707010000007E000081B40000000000000000000000015FBBE8EE0000B661000000000000000000000000000000000000001B00000000spacewalk-backend/po/nb.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Espen Stefansen <espenas@gmail.com>, 2006.
# Kjartan Maraas <kmaraas@gnome.org>, 2003.
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Norwegian BokmÃ¥l <i18n-nb@lister.ping.uio.no>\n"
"Language: nb\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
   0707010000007F000081B40000000000000000000000015FBBE8EE0000B60B000000000000000000000000000000000000001C00000000spacewalk-backend/po/nds.po   # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Low German <nds-lowgerman@lists.sourceforge.net>\n"
"Language: nds\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
 07070100000080000081B40000000000000000000000015FBBE8EE0000B6C2000000000000000000000000000000000000001B00000000spacewalk-backend/po/nl.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Bart Couvreur <bercie23@yahoo.com>, 2005.
# Peter van Egdom <p.van.egdom@gmail.com>, 2003, 2004, 2005, 2006, 2007.
# Petit Gregory <thunderbirds@pandora.be>, 2003.
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Dutch (http://www.transifex.com/projects/p/fedora/language/"
"nl/)\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
  07070100000081000081B40000000000000000000000015FBBE8EE0000B608000000000000000000000000000000000000001B00000000spacewalk-backend/po/nn.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Norwegian Nynorsk <i18n-nn@lister.ping.uio.no>\n"
"Language: nn\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
07070100000082000081B40000000000000000000000015FBBE8EE0000B651000000000000000000000000000000000000001B00000000spacewalk-backend/po/or.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Subhransu Behera <sbehera@redhat.com>, 2006, 2007.
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Oriya (http://www.transifex.com/projects/p/fedora/language/"
"or/)\n"
"Language: or\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
   07070100000083000081B40000000000000000000000015FBBE8EE0000B71E000000000000000000000000000000000000001B00000000spacewalk-backend/po/pa.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Amanpreet Singh Alam <aalam@redhat.com>, 2004.
# Amanpreet Singh Brar <amanpreetalam@yahoo.com>, 2005.
# Automatically generated <punjablinux@netscape.net>, 2004.
# Harmeet Singh Phulewala <harmeetphulewala@yahoo.com>, 2005.
# Jaswinder Singh <jsingh@redhat.com>, 2006, 2007.
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Panjabi (Punjabi) <punjabi-users@lists.sf.net>\n"
"Language: pa\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
  07070100000084000081B40000000000000000000000015FBBE8EE0000E86F000000000000000000000000000000000000001B00000000spacewalk-backend/po/pl.po    # Piotr DrÄ…g <piotrdrag@gmail.com>, 2016. #zanata
# Piotr DrÄ…g <piotrdrag@gmail.com>, 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2018-03-16 04:50+0000\n"
"Last-Translator: Piotr DrÄ…g <piotrdrag@gmail.com>\n"
"Language-Team: Polish\n"
"Language: pl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2)\n"
"X-Generator: Zanata 4.6.2\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr "niepeÅ‚ny token uwierzytelnienia poÅ›rednika: %s"

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr "WysÅ‚any podpis poÅ›rednika %s nie zgadza siÄ™ zÂ naszym %s."

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr "odmÃ³wiono uwierzytelnienia poÅ›rednika"

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr "Otrzymano nieprawidÅ‚owe Å¼Ä…danie (%s)."

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""
"WAÅ»NY KOMUNIKAT:\n"
"%s"

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""
"Podczas wykonywania â€ž%sâ€: przechwycono\n"
"%s: %s\n"

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr "NieprawidÅ‚owy adres URI %s"

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""
"\n"
"                   Konto %s zostaÅ‚o dezaktywowane na tym serwerze.\n"
"                   ProszÄ™ skontaktowaÄ‡ siÄ™ zÂ administratorem organizacji po "
"wiÄ™cej pomocy."

#: ../server/handlers/applet/applet.py:78
#, fuzzy, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr "Nie odnaleziono systemu wÂ bazie danych usÅ‚ugi RHN"

#: ../server/handlers/sat/auth.py:45
#, fuzzy
msgid "ISS is disabled on this server."
msgstr "WÂ tej usÅ‚udze Satellite wyÅ‚Ä…czono ISS."

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr "Nie wÅ‚Ä…czono serwera â€ž%sâ€ dla ISS."

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr "Oczekiwano nazwy pakietu, nie: %s"

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr "Oczekiwano pakietu, nie: %s"

#: ../server/handlers/xmlrpc/proxy.py:65
#, fuzzy, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr "UsÅ‚uga Spacewalk Proxy nie jest wÅ‚Ä…czona dla profilu serwera: â€ž%sâ€"

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr "NieprawidÅ‚owy klucz sesji"

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr "Ten identyfikator serwera juÅ¼ nie istnieje"

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr "NieprawidÅ‚owy typ wartoÅ›ci dziaÅ‚ania %s (%s)"

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr "DziaÅ‚anie %s nie naleÅ¼y do serwera %s"

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr "Brak wymaganych danych"

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr "Brak wymaganych czÅ‚onkÃ³w"

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr "PrÃ³ba zarejestrowania systemu do nieprawidÅ‚owej nazwy uÅ¼ytkownika"

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr "ZaÅ¼Ä…dano nieprawidÅ‚owej wersji wydania systemu"

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
#, fuzzy
msgid "Privacy Statement"
msgstr "OÅ›wiadczenie oÂ prywatnoÅ›ci usÅ‚ugi Red Hat Satellite"

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr "Oczekiwano sÅ‚ownika jako parametr produktu"

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr "NieprawidÅ‚owa wartoÅ›Ä‡ â€ž%sâ€ dla %s (%s)"

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr "NieprawidÅ‚owa para system_id/action_id."

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr "NieprawidÅ‚owa wartoÅ›Ä‡ %s (%s)"

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr "Brak upowaÅ¼nienia do zarzÄ…dzania pakietami wÂ pustej organizacji"

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr "UÅ¼ytkownik nie moÅ¼e zarzÄ…dzaÄ‡ pakietami wÂ organizacji %s"

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr "UÅ¼ytkownik nie moÅ¼e wykonywaÄ‡ zadaÅ„ administracyjnych"

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr "UÅ¼ytkownik nie moÅ¼e zarzÄ…dzaÄ‡ kanaÅ‚em %s lub ten kanaÅ‚ nie istnieje"

#: ../server/importlib/userAuth.py:204
#, fuzzy, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""
"\n"
"                   Konto %s zostaÅ‚o dezaktywowane na tym serwerze.\n"
"                   ProszÄ™ skontaktowaÄ‡ siÄ™ zÂ administratorem organizacji po "
"wiÄ™cej pomocy."

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""
"Konto nie ma dostÄ™pu do Å¼adnych kanaÅ‚Ã³w pasujÄ…cych do (wydanie: "
"â€ž%(release)sâ€, architektura: â€ž%(arch)sâ€)%(www_activation)s"

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""
"\n"
"Numer rejestracji naleÅ¼y najpierw zarejestrowaÄ‡ pod adresem http://www."
"redhat.com/apps/activate/ iÂ sprÃ³bowaÄ‡ ponownie.\n"
"\n"

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr "NiewystarczajÄ…ce uprawnienia subskrypcji dla wydania (%s, %s"

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr "Zarejestrowano system, ale nie jest aktywny"

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""
"\n"
"NieprawidÅ‚owe poÅ‚Ä…czenie architektury iÂ wydania systemu operacyjnego (%s, "
"%s).\n"
"System zostaÅ‚ zarejestrowany, ale nie bÄ™dzie otrzymywaÅ‚ aktualizacji,\n"
"poniewaÅ¼ nie jest subskrybowany do kanaÅ‚u. JeÅ›li jeszcze nie\n"
"aktywowano produktu do usÅ‚ugi, naleÅ¼y odwiedziÄ‡ naszÄ… stronÄ™ na:\n"
" \n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"â€¦aby aktywowaÄ‡ produkt."

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""
"\n"
"NieprawidÅ‚owe poÅ‚Ä…czenie architektury iÂ wydania systemu operacyjnego (%s, "
"%s).\n"
"System zostaÅ‚ zarejestrowany , ale nie bÄ™dzie otrzymywaÅ‚ aktualizacji,\n"
"poniewaÅ¼ nie jest subskrybowany do podstawowego kanaÅ‚u.\n"
"ProszÄ™ skontaktowaÄ‡ siÄ™ zÂ administratorem organizacji po pomoc.\n"

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""
"\n"
"  Ten system zostaÅ‚ pomyÅ›lnie zarejestrowany, ale nie ma waÅ¼noÅ›ci\n"
"  do usÅ‚ugi. Aby uprawniÄ‡ ten system do usÅ‚ugi, naleÅ¼y zalogowaÄ‡ siÄ™ na "
"stronie WWW pod adresem:\n"
"\n"
"  %(entitlement_url)s\n"

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""
"\n"
"  Ten system zostaÅ‚ pomyÅ›lnie zarejestrowany, ale Å¼adne waÅ¼noÅ›ci\n"
"  nie byÅ‚y dostÄ™pne. Aby uprawniÄ‡ ten system do usÅ‚ugi, naleÅ¼y zalogowaÄ‡ siÄ™ "
"na stronie WWW pod adresem:\n"
"\n"
"  %(entitlement_url)s\n"

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr "ProszÄ™ wykonaÄ‡ polecenie rhn_register jako root na tym kliencie"

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr "UsÅ‚uga jest niedostÄ™pna dla profilu systemu: â€ž%sâ€"

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr "ZaÅ¼Ä…dano nieprawidÅ‚owego pakietu RPM %s"

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr "Nie odnaleziono pakietu"

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr "Architektura â€ž%sâ€ jest nieobsÅ‚ugiwana"

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr "Token â€ž%sâ€ ma przydzielony wiÄ™cej niÅ¼ jeden kanaÅ‚ podstawowy"

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr "Sprzeczne kanaÅ‚y podstawowe"

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr "Dodanie serwera do grupy %s siÄ™ nie powiodÅ‚o"

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr "OsiÄ…gniÄ™to maksymalne uÅ¼ycie %s"

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""
"NakÅ‚adanie tokenÃ³w ponownej rejestracji na stos zÂ rÃ³Å¼nymi podstawowymi "
"waÅ¼noÅ›ciami jest nieobsÅ‚ugiwane"

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr "Nie moÅ¼na odnaleÅºÄ‡ tokenu â€ž%sâ€"

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr "Tokeny zÂ niepasujÄ…cych organizacji"

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr "NiepasujÄ…ca sesja kickstart"

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr "NakÅ‚adanie tokenÃ³w ponownej rejestracji na stos jest nieobsÅ‚ugiwane"

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr "NieprawidÅ‚owe poÅ‚Ä…czenie nazwy uÅ¼ytkownika iÂ hasÅ‚a"

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr "Nazwa uÅ¼ytkownika â€ž%sâ€ nie zostaÅ‚a zastrzeÅ¼ona"

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr "Nie podano adresu e-mail"

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr "nazwa uÅ¼ytkownika musi mieÄ‡ co najmniej %d znakÃ³w"

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr "nazwa uÅ¼ytkownika musi mieÄ‡ mniej niÅ¼ %d znakÃ³w"

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr "nazwa uÅ¼ytkownika to â€ž%sâ€, nieprawidÅ‚owy znak â€ž%sâ€"

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr "ProszÄ™ ograniczyÄ‡ adres e-mail do %s znakÃ³w"

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr "hasÅ‚o musi mieÄ‡ co najmniej %d znakÃ³w"

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr "HasÅ‚o musi byÄ‡ krÃ³tsze niÅ¼ %d znakÃ³w"

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr "hasÅ‚o zawiera znak â€ž%sâ€"

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr "nazwa uÅ¼ytkownika musi mieÄ‡ co najmniej %d znakÃ³w"

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr "Nie moÅ¼na rejestrowaÄ‡ nazw uÅ¼ytkownikÃ³w koÅ„czÄ…cych siÄ™ znakiem %s"

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr "To nie jest prawidÅ‚owa nazwa uÅ¼ytkownika."

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr "NieprawidÅ‚owe poÅ‚Ä…czenie nazwy uÅ¼ytkownika iÂ hasÅ‚a."

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr "Ten login jest zajÄ™ty lub hasÅ‚o jest niepoprawne."

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr "Odmowa uprawnieÅ„."

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr "Nie odnaleziono obiektu."

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr "NieprawidÅ‚owy cyfrowy identyfikator systemu."

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr "NieprawidÅ‚owe dane uwierzytelniajÄ…ce systemu."

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr "Nie moÅ¼na pobraÄ‡ danych uÅ¼ytkownika zÂ bazy danych."

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr "Wymagana jest prawidÅ‚owa nazwa uÅ¼ytkownika."

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr "Wymagane jest prawidÅ‚owe hasÅ‚o."

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr "Naruszono minimalnÄ… dÅ‚ugoÅ›Ä‡ nazwy uÅ¼ytkownika."

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr "Naruszono minimalnÄ… dÅ‚ugoÅ›Ä‡ hasÅ‚a."

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr "Nazwa uÅ¼ytkownika zawiera nieprawidÅ‚owe znaki."

#: ../common/rhnException.py:66
msgid "File not found."
msgstr "Nie odnaleziono pliku."

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr "NieobsÅ‚ugiwane poÅ‚Ä…czenie architektury iÂ wersji systemu operacyjnego."

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr "Nie moÅ¼na pobraÄ‡ danych systemu zÂ bazy danych."

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr "Do funkcji przekazano nieprawidÅ‚owe parametry."

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr "Nie moÅ¼na pobraÄ‡ Å¼Ä…danego wpisu."

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr "Nie moÅ¼na zaktualizowaÄ‡ wpisu bazy danych."

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr "NieobsÅ‚ugiwana architektura serwera."

#: ../common/rhnException.py:73
#, fuzzy, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""
"\n"
"     Funkcja anonimowego serwera nie jest juÅ¼ dostÄ™pna.\n"
"\n"
"     ProszÄ™ ponownie zarejestrowaÄ‡ ten system wykonujÄ…c polecenie "
"rhn_register\n"
"     jako root.\n"
"     ProszÄ™ odwiedziÄ‡ https://%(hostname)s/rhn/systems/SystemEntitlements."
"do\n"
"     lub zalogowaÄ‡ siÄ™ na https://%(hostname)s iÂ zÂ karty â€žPrzeglÄ…dâ€\n"
"     wybraÄ‡ â€žZarzÄ…dzanie subskrypcjÄ…â€, aby wÅ‚Ä…czyÄ‡ usÅ‚ugÄ™ dla tego systemu.\n"
"     "

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr "Wpis jest niedostÄ™pny wÂ bazie danych."

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr "NieprawidÅ‚owa wartoÅ›Ä‡ wpisu."

#: ../common/rhnException.py:83
#, fuzzy, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""
"\n"
"     Ten system nie ma prawidÅ‚owej waÅ¼noÅ›ci dla usÅ‚ugi Red Hat Satellite.\n"
"     ProszÄ™ odwiedziÄ‡ https://%(hostname)s/rhn/systems/SystemEntitlements."
"do\n"
"     lub zalogowaÄ‡ siÄ™ na https://%(hostname)s iÂ zÂ karty â€žPrzeglÄ…dâ€\n"
"     wybraÄ‡ â€žZarzÄ…dzanie subskrypcjÄ…â€, aby wÅ‚Ä…czyÄ‡ usÅ‚ugÄ™ dla tego systemu.\n"
"     "

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr "BÅ‚Ä…d kanaÅ‚u"

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr "NieprawidÅ‚owy token sesji klienta."

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr "Token sesji klienta wygasÅ‚."

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr "Brak upowaÅ¼nienia do pobierania Å¼Ä…danego obiektu."

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr "NieprawidÅ‚owe dziaÅ‚anie"

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr "UÅ¼ytkownik nie moÅ¼e wykonywaÄ‡ zadaÅ„ administracyjnych wÂ tym systemie."

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr "Ten system juÅ¼ subskrybuje podany kanaÅ‚."

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr "Ten system obecnie nie subskrybuje podanego kanaÅ‚u."

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr "Podany kanaÅ‚ nie istnieje."

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr "NieprawidÅ‚owa wersja kanaÅ‚u."

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""
"\n"
"     Przekroczono ograniczenia czÅ‚onkostwa wÂ grupach uÅ¼ytkownikÃ³w.\n"
"\n"
"     Obecne ustawienia konta nie pozwalajÄ… na dodawanie kolejnego\n"
"     konta uÅ¼ytkownika. ProszÄ™ zapytaÄ‡ administratora organizacji oÂ konto,\n"
"     jeÅ›li maksymalna liczba uÅ¼ytkownikÃ³w mogÄ…cych subskrybowaÄ‡ serwer\n"
"     musi zostaÄ‡ zmieniona.\n"
"     "

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""
"\n"
"     Przekroczono ograniczenia czÅ‚onkostwa wÂ grupach systemu.\n"
"\n"
"     Obecne ustawienia konta nie pozwalajÄ… na dodawanie kolejnego\n"
"     profilu systemu. ProszÄ™ zapytaÄ‡ administratora organizacji\n"
"     oÂ zmodyfikowanie maksymalnej liczby profili systemÃ³w, jaka moÅ¼e\n"
"     subskrybowaÄ‡ konto.\n"
"     "

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""
"\n"
"     NieprawidÅ‚owa architektura.\n"
"\n"
"     Architektura pakietu nie jest obsÅ‚ugiwana przez\n"
"     "

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr "NieprawidÅ‚owy nagÅ‚Ã³wek pakietu RPM"

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr "Do serwera wysÅ‚ano nieprawidÅ‚owe informacje"

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr "BÅ‚Ä…d podczas wysyÅ‚ania konfiguracji interfejsÃ³w sieciowych."

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""
"\n"
"     WysÅ‚anie pakietu siÄ™ nie powiodÅ‚o zÂ powodu naruszenia ograniczenia "
"unikalnoÅ›ci.\n"
"     ProszÄ™ siÄ™ upewniÄ‡, Å¼e pakiet nie ma podwÃ³jnych zaleÅ¼noÅ›ci lub\n"
"     nie istnieje juÅ¼ na serwerze\n"
"     "

#: ../common/rhnException.py:134
#, fuzzy
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""
"\n"
"     Na tym serwerze wyÅ‚Ä…czono opcjÄ™ â€ž--force rhnpushâ€.\n"
"     ProszÄ™ skontaktowaÄ‡ siÄ™ zÂ administratorem usÅ‚ugi Satellite po wiÄ™cej "
"pomocy.\n"
"     "

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""
"\n"
"     Nie moÅ¼na odnaleÅºÄ‡ podanego tokenu aktywacji na serwerze.\n"
"     ProszÄ™ sprÃ³bowaÄ‡ ponownie za pomocÄ… prawidÅ‚owego klucza.\n"
"     "

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr "Za pomocÄ… tego tokenu rejestracji zarejestrowano za duÅ¼o systemÃ³w"

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""
"Token zawiera nieprawidÅ‚owe, przestarzaÅ‚e lub niewystarczajÄ…ce ustawienia"

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr "Sprzeczne tokeny aktywacji"

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""
"\n"
"     Nie odnaleziono pasujÄ…cego kanaÅ‚u podstawowego dla systemu.\n"
"     "

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""
"\n"
"     Nie ma uprawnienia subskrypcji dla wyznaczonego kanaÅ‚u.\n"
"     KanaÅ‚ organizacji lub administratorzy organizacji majÄ… wiÄ™cej "
"informacji.\n"
"     "

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr "Nie moÅ¼na zrezygnowaÄ‡ zÂ subskrypcji podstawowego kanaÅ‚u."

#: ../common/rhnException.py:158
#, fuzzy
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr "Nie moÅ¼na subskrybowaÄ‡ kanaÅ‚u Satellite lub Proxy."

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr "WystÄ…piÅ‚ bÅ‚Ä…d podczas prÃ³by doÅ‚Ä…czenia systemu do jego grup"

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr "Nie moÅ¼na upowaÅ¼niÄ‡ systemu"

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr "Naruszono maksymalnÄ… dÅ‚ugoÅ›Ä‡ adresu e-mail."

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr "Ten system zostaÅ‚ poprzednio zarejestrowany."

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr "NieprawidÅ‚owa nazwa uÅ¼ytkownika"

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr "Nie moÅ¼na odnaleÅºÄ‡ serwera"

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr "Brak wymaganego parametru"

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr "Brak informacji oÂ waÅ¼noÅ›ci powiÄ…zanych zÂ tym sprzÄ™tem"

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr "Numer instalacji nie jest waÅ¼ny"

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr "Naruszono maksymalnÄ… dÅ‚ugoÅ›Ä‡ nazwy uÅ¼ytkownika"

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr "Naruszono maksymalnÄ… dÅ‚ugoÅ›Ä‡ hasÅ‚a"

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr "Ten uÅ¼ytkownik ma dostÄ™p do API tylko do odczytu. Odmowa dziaÅ‚ania."

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr "Nazwa systemu nie moÅ¼e byÄ‡ krÃ³tsza niÅ¼ 1 znak"

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
#, fuzzy
msgid "SUSE Manager Proxy error."
msgstr "BÅ‚Ä…d usÅ‚ugi Spacewalk Proxy."

#: ../common/rhnException.py:191
#, fuzzy
msgid "SUSE Manager Proxy unable to login."
msgstr "Nie moÅ¼na zalogowaÄ‡ usÅ‚ugi Spacewalk Proxy."

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
#, fuzzy
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""
"\n"
"     Identyfikator systemu usÅ‚ugi Spacewalk Proxy nie pasuje do serwera "
"Spacewalk Proxy\n"
"     wÂ bazie danych.\n"
"     "

#: ../common/rhnException.py:197
#, fuzzy
msgid "SUSE Manager Proxy session token is invalid."
msgstr "Token sesji usÅ‚ugi Spacewalk Proxy jest nieprawidÅ‚owy."

#: ../common/rhnException.py:198
#, fuzzy
msgid "SUSE Manager Proxy session token has expired."
msgstr "Token sesji usÅ‚ugi Spacewalk Proxy wygasÅ‚."

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
#, fuzzy
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""
"\n"
"     tworzenie uÅ¼ytkownika za pomocÄ… polecenia rhn_register nie jest "
"dozwolone.\n"
"     ProszÄ™ skontaktowaÄ‡ siÄ™ zÂ administratorem systemu wÂ celu utworzenia "
"konta.\n"
"     "

#: ../common/rhnException.py:206
#, fuzzy
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""
"\n"
"     Ten serwer usÅ‚ugi Satellite ne moÅ¼e uÅ¼ywaÄ‡ Inter Satellite Sync na tej "
"usÅ‚udze Satellite\n"
"     "

#: ../common/rhnException.py:209
#, fuzzy
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""
"\n"
"     Inter Satellite Sync jest wyÅ‚Ä…czone na tej usÅ‚udze Satellite.\n"
"     "

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr "Przekazano nieprawidÅ‚owy typ danych"

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr "Nie moÅ¼na pobraÄ‡ kanaÅ‚u"

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr "Nie moÅ¼na pobraÄ‡ pakietu"

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr "Nie moÅ¼na pobraÄ‡ poprawki"

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr "Brak pliku"

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr "BÅ‚Ä…d pobierania funkcji"

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr "BÅ‚Ä…d wykonywania funkcji"

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr "Brak ciÄ…gu wersji"

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr "NieprawidÅ‚owy ciÄ…g wersji"

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr "NiepasujÄ…ce wersje"

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr "NieprawidÅ‚owa wersja kanaÅ‚u"

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr "Brak pliku comps dla kanaÅ‚u"

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr "Nie moÅ¼na pobraÄ‡ pliku comps"

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr "Brak dziaÅ‚ania konfiguracji"

#: ../common/rhnException.py:230
msgid "File too large"
msgstr "Plik jest za duÅ¼y"

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr "Plik zawiera binarne dane"

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr "KanaÅ‚ konfiguracji nie jest pusty"

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr "BÅ‚Ä…d uprawnieÅ„"

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr "Brak treÅ›ci pliku konfiguracji"

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr "Nie podano separatorÃ³w szablonu"

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr "KanaÅ‚ konfiguracji nie istnieje"

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr "KanaÅ‚ konfiguracji juÅ¼ istnieje"

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr "Brak pliku zÂ kanaÅ‚u konfiguracji"

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr "Inna wersja tego pliku zostaÅ‚a wysÅ‚ana"

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr "JuÅ¼ wysÅ‚ano plik do kanaÅ‚u konfiguracji"

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr "Rozmiar pliku przekracza pozostaÅ‚e miejsce przydziaÅ‚u"

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr "NaleÅ¼y podaÄ‡ peÅ‚nÄ… Å›cieÅ¼kÄ™ do pliku"

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr "NieprawidÅ‚owy numer wersji"

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr "Nie moÅ¼na porÃ³wnywaÄ‡ plikÃ³w rÃ³Å¼nego typu"

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr "Informacje oÂ awarii sÄ… nieprawidÅ‚owe lub niepeÅ‚ne"

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr "Plik zÂ informacjami oÂ awarii jest nieprawidÅ‚owy lub niepeÅ‚ny"

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr "BÅ‚Ä…d podczas skÅ‚adania Å›cieÅ¼ki do katalogu awarii"

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr "BÅ‚Ä…d podczas skÅ‚adania Å›cieÅ¼ki do pliku awarii"

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr "NieprawidÅ‚owe kodowanie treÅ›ci"

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr "NieprawidÅ‚owa nazwa awarii"

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr "ZgÅ‚aszanie awarii jest wyÅ‚Ä…czone dla tej organizacji"

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr "PrzesyÅ‚anie pliku wynikÃ³w SCAP jest nieprawidÅ‚owe lub niepeÅ‚ne"

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""
"BÅ‚Ä…d podczas skÅ‚adania Å›cieÅ¼ki do katalogu dla szczegÃ³Å‚owych wynikÃ³w SCAP"

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr "BÅ‚Ä…d podczas skÅ‚adania Å›cieÅ¼ki do pliku dla szczegÃ³Å‚owych wynikÃ³w SCAP"

#: ../common/rhnException.py:306
#, fuzzy
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""
"\n"
"     WystÄ…piÅ‚ bÅ‚Ä…d podczas przetwarzania Å¼Ä…dania. JeÅ›li problem\n"
"     siÄ™ powtarza, proszÄ™ zgÅ‚osiÄ‡ bÅ‚Ä…d na stronie bugzilla.redhat.com.\n"
"     JeÅ›li bÅ‚Ä…d zostanie zgÅ‚oszony, to proszÄ™ doÅ‚Ä…czyÄ‡ informacje\n"
"     oÂ prÃ³bowanym dziaÅ‚aniu, kiedy wystÄ…piÅ‚ bÅ‚Ä…d iÂ informacje oÂ sposobie\n"
"     powtÃ³rzenia tego problemu.\n"

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""
"Komunikat oÂ bÅ‚Ä™dzie:\n"
"    %s\n"

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr "Kod klasy bÅ‚Ä™du: %s\n"

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr "Informacje oÂ klasie bÅ‚Ä™du: %s\n"

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr "WyjaÅ›nienie: %s"

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr "BÅÄ„D: %s %s: %s"

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr "WYJÄ„TEK: %s"

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, fuzzy, python-format
msgid "    Extinct package:  %s"
msgstr "Oczekiwano pakietu, nie: %s"

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
#, fuzzy
msgid "Linking packages to channels"
msgstr "Sprzeczne kanaÅ‚y podstawowe"

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
#, fuzzy
msgid "base-channels"
msgstr "Sprzeczne kanaÅ‚y podstawowe"

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, fuzzy, python-format
msgid "Unable to save file %s: %s"
msgstr "Nie moÅ¼na upowaÅ¼niÄ‡ systemu"

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
#, fuzzy
msgid "print the configuration and exit"
msgstr "KanaÅ‚ konfiguracji nie istnieje"

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, fuzzy, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr "Nie moÅ¼na odnaleÅºÄ‡ serwera"

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
#, fuzzy
msgid "  12 - Channel do not exist"
msgstr "Podany kanaÅ‚ nie istnieje."

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""

#~ msgid "Your system was not found in the RHN database"
#~ msgstr "Nie odnaleziono systemu wÂ bazie danych usÅ‚ugi RHN"

#~ msgid "ISS is disabled on this satellite."
#~ msgstr "WÂ tej usÅ‚udze Satellite wyÅ‚Ä…czono ISS."

#~ msgid "Spacewalk Proxy service not enabled for server profile: \"%s\""
#~ msgstr "UsÅ‚uga Spacewalk Proxy nie jest wÅ‚Ä…czona dla profilu serwera: â€ž%sâ€"

#~ msgid "Red Hat Satellite Welcome Message"
#~ msgstr "Komunikat powitalny usÅ‚ugi Red Hat Satellite"

#~ msgid "Red Hat Satellite Privacy Statement"
#~ msgstr "OÅ›wiadczenie oÂ prywatnoÅ›ci usÅ‚ugi Red Hat Satellite"
 07070100000085000081B40000000000000000000000015FBBE8EE0000B674000000000000000000000000000000000000001B00000000spacewalk-backend/po/pt.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2020-08-17 13:26+0000\n"
"Last-Translator: Ricardo Mateus <rmateus@suse.com>\n"
"Language-Team: Portuguese <https://l10n.opensuse.org/projects/uyuni/backend/"
"pt/>\n"
"Language: pt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Weblate 3.6.1\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr "Token de autenticaÃ§Ã£o de proxy incompleto: %s"

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
07070100000086000081B40000000000000000000000015FBBE8EE00011790000000000000000000000000000000000000001E00000000spacewalk-backend/po/pt_BR.po # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# David Barzilay <barzilay@redhat.com>, 2004, 2005.
# Igor Pires Soares <igor@projetofedora.org>, 2007.
# Pedro Fernandes Macedo <webmaster@margo.bijoux.nom.br>, 2004.
# Pedro Macedo <pmacedo@intel.dcc.ufmg.br>, 2005.
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2020-10-15 01:49+0000\n"
"Last-Translator: Rodrigo Macedo <rmsolucoeseminformatic4@gmail.com>\n"
"Language-Team: Portuguese (Brazil) <https://l10n.opensuse.org/projects/uyuni/"
"backend/pt_BR/>\n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 3.6.1\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr "token de autenticaÃ§Ã£o de proxy incompleto: %s"

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr "A assinatura de proxy enviada %s nÃ£o corresponde Ã  nossa %s."

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr "autenticaÃ§Ã£o de proxy recusada"

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr "SolicitaÃ§Ã£o invÃ¡lida recebida (%s)."

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""
"SEGUINTE MENSAGEM IMPORTANTE:\n"
"%s"

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""
"Durante a execuÃ§Ã£o de '%s': capturado\n"
"%s : %s\n"

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr "URI %s invÃ¡lida"

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""
"\n"
"                   A conta %s foi desativada neste servidor.\n"
"                   Entre em contato com o administrador da organizaÃ§Ã£o para "
"obter mais ajuda."

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr "Seu sistema nÃ£o foi encontrado no banco de dados do {PRODUCT_NAME}"

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr "O ISS estÃ¡ desativado neste servidor."

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr "O servidor \"%s\" nÃ£o estÃ¡ ativado para o ISS."

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr "Esperado um nome de pacote, nÃ£o: %s"

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr "Esperado um pacote, nÃ£o: %s"

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""
"O serviÃ§o SUSE Manager Proxy nÃ£o estÃ¡ habilitado para o perfil do servidor: "
"\"%s\""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr "Chave de sessÃ£o invÃ¡lida"

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr "Esse ID de servidor nÃ£o existe mais"

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr "Tipo de valor de aÃ§Ã£o invÃ¡lido%s (%s)"

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr "A aÃ§Ã£o %s nÃ£o pertence ao servidor %s"

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr "Dados necessÃ¡rios ausentes"

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr "Membros necessÃ¡rios ausentes"

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr "Tentativa de registrar um sistema para um nome de usuÃ¡rio invÃ¡lido"

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr "VersÃ£o de lanÃ§amento do sistema solicitada invÃ¡lida"

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""
"NÃ£o foi possÃ­vel encontrar uma interface de rede vÃ¡lida, ipaddr e ip6addr "
"nÃ£o encontrados."

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr "{PRODUCT_NAME} Mensagem de Boas vindas"

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr "DeclaraÃ§Ã£o de Privacidade"

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr "Esperado um dicionÃ¡rio como argumento do produto"

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr "Valor invÃ¡lido '%s' para %s (%s)"

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr "Par system_id / action_id invÃ¡lido."

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr "Valor invÃ¡lido %s (%s)"

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr "VocÃª nÃ£o estÃ¡ autorizado a gerenciar pacotes na organizaÃ§Ã£o nula"

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr "VocÃª nÃ£o tem permissÃ£o para gerenciar pacotes na organizaÃ§Ã£o %s"

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr "VocÃª nÃ£o tem permissÃ£o para executar tarefas administrativas"

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""
"VocÃª nÃ£o tem permissÃ£o para gerenciar o canal %s, ou esse canal nÃ£o existe"

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""
"\n"
"               A conta %s foi desativada neste servidor.\n"
"Â Â Â Â Â Â Â Â Â Â Â Â Â Â  Entre em contato com o administrador da organizaÃ§Ã£o para "
"obter mais ajuda."

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""
"Sua conta nÃ£o tem acesso a nenhum canal correspondente (release "
"='%(release)s', arch='%(arch)s')%(www_activation)s"

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""
"\n"
"Se vocÃª tiver um nÃºmero de registro, registre-se primeiro em http://www."
"redhat.com/apps/activate/ e tente novamente.\n"
"\n"

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr "PermissÃµes de assinatura insuficientes para liberaÃ§Ã£o (%s, %s"

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr "Sistema Registrado, mas Inativo"

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""
"\n"
"CombinaÃ§Ã£o de liberaÃ§Ã£o de arquitetura e sistema operacional invÃ¡lida (%s, "
"%s).\n"
"Seu sistema foi registrado, mas nÃ£o receberÃ¡ atualizaÃ§Ãµes\n"
"porque nÃ£o estÃ¡ inscrito em um canal. Se vocÃª ainda nÃ£o\n"
"ativou seu produto para manutenÃ§Ã£o, visite nosso site em:\n"
"\n"
"       http://www.redhat.com/apps/activate/\n"
"\n"
"... para ativar seu produto."

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""
"\n"
"CombinaÃ§Ã£o de liberaÃ§Ã£o de arquitetura e sistema operacional invÃ¡lida (%s, "
"%s).\n"
"Seu sistema foi registrado, mas nÃ£o receberÃ¡ atualizaÃ§Ãµes\n"
"porque nÃ£o pÃ´de ser inscrito em um canal base.\n"
"Por favor entre em contato com o administrador da organizaÃ§Ã£o para obter "
"assistÃªncia.\n"

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""
"\n"
"  Este sistema foi registrado com sucesso, mas ainda nÃ£o tem direito\n"
"  para servir.  Para autorizar esse sistema a fazer serviÃ§o, faÃ§a login no "
"site em:\n"
"\n"
"  %(entitlement_url)s\n"

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""
"\n"
"  Este sistema foi registrado com sucesso, mas nenhum direito ao serviÃ§o\n"
"  estavam disponÃ­veis.  Para autorizar esse sistema a fazer serviÃ§o, faÃ§a "
"login no site em:\n"
"\n"
"  %(entitlement_url)s\n"

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr "Execute rhn_register como root neste cliente"

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr "ServiÃ§o nÃ£o ativado para o perfil do sistema: \"%s\""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr "Pacote RPM invÃ¡lido %s solicitado"

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr "Pacote nÃ£o encontrado"

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr "A arquitetura `%s' nÃ£o Ã© suportada"

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr "O token `%s' possui mais de um canal base atribuÃ­do"

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr "Canais bÃ¡sicos conflitantes"

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr "Falha ao adicionar servidor ao grupo %s"

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr "Contagem mÃ¡xima de uso de %s atingida"

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""
"O empilhamento de tokens de recadastramento com diferentes direitos de base "
"nÃ£o Ã© suportado"

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr "NÃ£o foi possÃ­vel encontrar o token '%s'"

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr "Tokens de organizaÃ§Ãµes incompatÃ­veis"

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr "Incompatibilidade de sessÃ£o do Kickstart"

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr "O empilhamento de tokens de re-registro nÃ£o Ã© suportado"

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr "CombinaÃ§Ã£o de nome de usuÃ¡rio/senha invÃ¡lido"

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr "O nome de usuÃ¡rio `%s 'nÃ£o foi reservado"

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr "EndereÃ§o de email nÃ£o especificado"

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr "o nome de usuÃ¡rio deve ter pelo menos %d caracteres"

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr "o nome de usuÃ¡rio deve ter menos de %d caracteres"

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr "nome de usuÃ¡rio = `%s', caractere invÃ¡lido`%s'"

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr "Por favor limite seu endereÃ§o de e-mail a %s caracteres"

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr "a senha deve ter pelo menos %d caracteres"

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr "A senha deve ter menos de %d caracteres"

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr "a senha contÃ©m o caractere `%s '"

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr "o nome de usuÃ¡rio deve ter pelo menos %d caracteres"

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr "NÃ£o Ã© possÃ­vel registrar nomes de usuÃ¡rio que terminem com %s"

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr "Este nÃ£o parece ser um nome de usuÃ¡rio vÃ¡lido."

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr "CombinaÃ§Ã£o de nome de usuÃ¡rio e senha invÃ¡lida."

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr "Este login jÃ¡ foi realizado ou a senha estÃ¡ incorreta."

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr "PermissÃ£o negada."

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr "Objeto nÃ£o encontrado."

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr "ID digital do sistema invÃ¡lido."

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr "Credenciais do sistema invÃ¡lidas."

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr "NÃ£o foi possÃ­vel recuperar os dados do usuÃ¡rio do banco de dados."

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr "Nome de usuÃ¡rio vÃ¡lido necessÃ¡rio."

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr "Senha vÃ¡lida necessÃ¡ria."

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr "ViolaÃ§Ã£o mÃ­nima do comprimento do nome de usuÃ¡rio."

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr "ViolaÃ§Ã£o mÃ­nima do comprimento da senha."

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr "O nome de usuÃ¡rio contÃ©m caracteres invÃ¡lidos."

#: ../common/rhnException.py:66
msgid "File not found."
msgstr "Arquivo nÃ£o encontrado."

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr "A combinaÃ§Ã£o de arquitetura e versÃ£o do SO nÃ£o Ã© suportada."

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr "NÃ£o foi possÃ­vel recuperar os dados do sistema do banco de dados."

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr "Argumentos invÃ¡lidos transmitidos para a funÃ§Ã£o."

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr "NÃ£o foi possÃ­vel recuperar a entrada solicitada."

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr "NÃ£o foi possÃ­vel atualizar a entrada do banco de dados."

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr "Arquitetura de servidor nÃ£o suportada."

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""
"\n"
"     A funcionalidade do servidor anÃ´nimo nÃ£o estÃ¡ mais disponÃ­vel.\n"
"\n"
"     Por favor, registre novamente este sistema executando mgr_register como "
"root.\n"
"     Por favor visite https://%(hostname)s/rhn/systems/SystemEntitlements."
"do\n"
"     ou faÃ§a login em https://%(hostname)s, e na guia \"VisÃ£o geral\",\n"
"     selecione \"Gerenciamento de assinatura\" para ativar o serviÃ§o para "
"este sistema.\n"
"     "

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr "Registro nÃ£o disponÃ­vel no banco de dados."

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr "Valor invÃ¡lido para entrada."

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""
"\n"
"     Este sistema nÃ£o possui um direito vÃ¡lido para o SUSE Manager.\n"
"     Por favor visite https://%(hostname)s/rhn/systems/SystemEntitlements."
"do\n"
"     ou faÃ§a login em https://%(hostname)s, e na guia \"VisÃ£o geral\",\n"
"     selecione \"Gerenciamento de assinatura\" para ativar o serviÃ§o para "
"este sistema.\n"
"     "

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr "Erro no canal"

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr "O token da sessÃ£o do cliente Ã© invÃ¡lido."

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr "O token da sessÃ£o do cliente expirou."

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr "VocÃª nÃ£o estÃ¡ autorizado a recuperar o objeto solicitado."

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr "AÃ§Ã£o invÃ¡lida"

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""
"VocÃª nÃ£o tem permissÃ£o para executar tarefas administrativas neste sistema."

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr "O sistema jÃ¡ estÃ¡ inscrito no canal especificado."

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr "O sistema nÃ£o estÃ¡ atualmente inscrito no canal especificado."

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr "O canal especificado nÃ£o existe."

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr "VersÃ£o do canal invÃ¡lida."

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""
"\n"
"     Limites de associaÃ§Ã£o ao grupo de usuÃ¡rios excedidos.\n"
"\n"
"      As configuraÃ§Ãµes atuais da sua conta nÃ£o permitem adicionar outro\n"
"      conta de usuÃ¡rio. Verifique com o administrador da organizaÃ§Ã£o o seu\n"
"      conta se o nÃºmero mÃ¡ximo de usuÃ¡rios com permissÃ£o para se inscrever "
"nas necessidades do servidor\n"
"      para ser mudado.\n"
"     "

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""
"\n"
"     Limites de associaÃ§Ã£o ao grupo do sistema excedidos.\n"
"     As configuraÃ§Ãµes atuais da sua conta nÃ£o permitem adicionar outro\n"
"     perfil do sistema. Verifique com o administrador da organizaÃ§Ã£o\n"
"     para modificar o nÃºmero mÃ¡ximo de perfis do sistema que podem ser\n"
"     inscrito na sua conta.\n"
"     "

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""
"\n"
"     Arquitetura invÃ¡lida.\n"
"\n"
"     A arquitetura do pacote nÃ£o Ã© suportada por\n"
"     "

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr "CabeÃ§alho RPM invÃ¡lido"

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""
"\n"
"    Esse sistema jÃ¡ estÃ¡ registrado como Salt Minion. Se vocÃª deseja "
"registrÃ¡-lo como um cliente tradicional\n"
"     por favor exclua-o primeiro pela interface da Web ou API da Web e "
"depois registre-o usando as ferramentas tradicionais.\n"
"    "

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr "InformaÃ§Ãµes invÃ¡lidas carregadas no servidor"

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr "Erro ao carregar a configuraÃ§Ã£o de interfaces de rede."

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""
"\n"
"     Falha no upload do pacote devido a violaÃ§Ã£o de restriÃ§Ã£o de "
"exclusividade.\n"
"     Verifique se o pacote nÃ£o possui dependÃªncias duplicadas ou\n"
"     se jÃ¡ nÃ£o existe no servidor\n"
"     "

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""
"\n"
"     A opÃ§Ã£o --force rhnpush estÃ¡ desativada neste servidor.\n"
"     Entre em contato com o administrador do SUSE Manager para obter mais "
"ajuda.\n"
"     "

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""
"\n"
"     O token de ativaÃ§Ã£o especificado nÃ£o pÃ´de ser encontrado no servidor.\n"
"     Tente novamente com uma chave vÃ¡lida.\n"
"     "

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr "Muitos sistemas registrados usando esse token de registro"

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr "O token contÃ©m configuraÃ§Ãµes invÃ¡lidas, obsoletas ou insuficientes"

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr "Tokens de ativaÃ§Ã£o conflitantes"

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""
"\n"
"     Nenhum canal base correspondente encontrado para o seu sistema.\n"
"     "

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""
"\n"
"     VocÃª nÃ£o tem permissÃ£o de assinatura para o canal designado.\n"
"     Por favor consulte o canal ou os administradores da organizaÃ§Ã£o\n"
"     para obter mais detalhes.\n"
"     "

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr "VocÃª nÃ£o pode cancelar a inscriÃ§Ã£o no canal base."

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr "O canal SUSE Manager ou Proxy nÃ£o pode ser assinado."

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr "Ocorreu um erro ao tentar ingressar no sistema em seus grupos"

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr "NÃ£o foi possÃ­vel habilitar o sistema"

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr "ViolaÃ§Ã£o de tamanho mÃ¡ximo de email."

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr "Este sistema foi registrado anteriormente."

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr "Nome de usuÃ¡rio InvÃ¡lido"

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr "NÃ£o foi possÃ­vel procurar o servidor"

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr "O argumento necessÃ¡rio estÃ¡ ausente"

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr "Nenhuma informaÃ§Ã£o de direito vinculada ao hardware"

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr "O nÃºmero da instalaÃ§Ã£o nÃ£o estÃ¡ autorizado"

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr "ViolaÃ§Ã£o mÃ¡xima do tamanho do nome de usuÃ¡rio"

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr "ViolaÃ§Ã£o mÃ¡xima do comprimento da senha"

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr "Este usuÃ¡rio possui acesso apenas Ã  API. AÃ§Ã£o negada."

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr "O nome do sistema nÃ£o pode ter menos de 1 caractere"

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr "Erro de proxy do SUSE Manager."

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr "Proxy do SUSE Manager nÃ£o pode efetuar login."

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""
"\n"
"     O ID do sistema SUSE Manager Proxy nÃ£o corresponde a um Spacewalk Proxy "
"Server\n"
"     no banco de dados.\n"
"     "

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr "O token de sessÃ£o do SUSE Manager Proxy Ã© invÃ¡lido."

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr "O token de sessÃ£o do SUSE Manager Proxy expirou."

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""
"\n"
"      a criaÃ§Ã£o do usuÃ¡rio nÃ£o Ã© permitida via mgr_register;\n"
"     entre em contato com o administrador do sistema para criar sua conta.\n"
"     "

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""
"\n"
"     Este servidor do SUSE Manager nÃ£o tem permissÃ£o para usar o Inter "
"Server Sync neste servidor\n"
"     "

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""
"\n"
"     A sincronizaÃ§Ã£o entre servidores estÃ¡ desabilitada neste servidor do "
"SUSE Manager.\n"
"     "

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr "Tipo de dados invÃ¡lido passado"

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr "NÃ£o foi possÃ­vel recuperar o canal"

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr "NÃ£o foi possÃ­vel recuperar o pacote"

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr "NÃ£o foi possÃ­vel recuperar a errata"

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr "Falta o arquivo"

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr "Erro de recuperaÃ§Ã£o de funÃ§Ã£o"

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr "Erro de execuÃ§Ã£o da funÃ§Ã£o"

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr "String de versÃ£o ausente"

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr "String de versÃ£o invÃ¡lida"

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr "VersÃµes incompatÃ­veis"

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr "VersÃ£o do canal invÃ¡lida"

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr "Nenhum arquivo de comps para o canal"

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr "NÃ£o foi possÃ­vel recuperar o arquivo comps"

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr "AÃ§Ã£o de configuraÃ§Ã£o ausente"

#: ../common/rhnException.py:230
msgid "File too large"
msgstr "Arquivo muito grande"

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr "O arquivo contÃ©m dado binÃ¡rio"

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr "Canal de configuraÃ§Ã£o nÃ£o estÃ¡ vazio"

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr "Erro de permissÃ£o"

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr "ConteÃºdo ausente para o arquivo de configuraÃ§Ã£o"

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr "Delimitadores de modelo nÃ£o especificados"

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr "O canal de configuraÃ§Ã£o nÃ£o existe"

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr "O canal de configuraÃ§Ã£o jÃ¡ existe"

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr "Arquivo ausente no canal de configuraÃ§Ã£o"

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr "Upload diferente da revisÃ£o deste arquivo"

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr "Arquivo jÃ¡ carregado no canal de configuraÃ§Ã£o"

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr "O tamanho do arquivo excede o espaÃ§o restante da cota"

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr "O caminho completo do arquivo deve ser especificado"

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr "NÃºmero de revisÃ£o invÃ¡lido"

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr "NÃ£o Ã© possÃ­vel comparar arquivos de outro tipo"

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr "As informaÃ§Ãµes de falha sÃ£o invÃ¡lidas ou incompletas"

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr "As informaÃ§Ãµes do arquivo de falha sÃ£o invÃ¡lidas ou incompletas"

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr "Erro ao compor o caminho do diretÃ³rio de falha"

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr "Erro ao compor o caminho do arquivo de falha"

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr "CodificaÃ§Ã£o de conteÃºdo invÃ¡lida"

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr "Nome de falha invÃ¡lido"

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr "Os relatÃ³rios de falhas estÃ£o desativados para esta organizaÃ§Ã£o"

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr "A transferÃªncia do arquivo de resultados SCAP Ã© invÃ¡lida ou incompleta"

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""
"Erro ao compor o caminho do diretÃ³rio para obter resultados detalhados do "
"SCAP"

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""
"Erro ao compor o caminho do arquivo para obter resultados detalhados do SCAP"

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""
"\n"
"     Ocorreu um erro ao processar o seu pedido. Se esse problema\n"
"     persistir, envie um relatÃ³rio de erro em scc.suse.com.\n"
"     Se vocÃª optar por enviar o relatÃ³rio de bug, por favor nÃ£o deixe de "
"incluir\n"
"     detalhes do que estava tentando fazer quando esse erro ocorreu e\n"
"     detalhes sobre como reproduzir esse problema.\n"

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""
"Mensagem De Erro:\n"
"     %s\n"

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr "CÃ³digo da classe de erro: %s\n"

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr "InformaÃ§Ãµes da classe de erro: %s\n"

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr "ExplicaÃ§Ã£o: %s"

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr "ERRO: %s %s: %s"

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr "RASTREAR: %s"

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr "formato de %s deve ser pelo menos AAAAMMDD.\n"

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""
"\n"
"ERRO: executando a etapa %s. O erro Ã©:\n"
"%s\n"

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""
"\n"
"ERRO: Teve um problema acessando o canal de dados do seu repositÃ³rio\n"
"     temporÃ¡rio. VocÃª migrou todos os dados do seu canal de ISOs\n"
"     para esse diretÃ³rio? Se sim, por favor verificar os canais de ISOs, "
"Assegure\n"
"    que vocÃª tem todos, e entÃ£o remontar e repovoar iterativamente\n"
"    o repositÃ³rio temporÃ¡rio (%s).\n"

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""
"\n"
"ERRO: Teve um problema sincronizando as informaÃ§Ãµes.\n"
"     Mensagem de erro: %s\n"

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""
"\n"
"ERRO: Ocorreu um problema na comunicaÃ§Ã£o com o ISS Master.\n"
"     Dependendo dos detalhes especÃ­ficos do erro, revise sua configuraÃ§Ã£o,\n"
"     conectividade bÃ¡sica de rede e / ou resoluÃ§Ã£o de nomes e tente "
"novamente.\n"
"     Mensagem de erro: %s\n"

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""
"\n"
"ERRO: Ocorreu um problema na comunicaÃ§Ã£o com o ISS Master.\n"
"     Se o satÃ©lite principal for anterior Ã  v5.3, ele nÃ£o possui capacidade "
"ISS.\n"
"     Caso contrÃ¡rio, dependendo dos detalhes especÃ­ficos do erro, revise "
"sua\n"
"     configuraÃ§Ã£o, conectividade bÃ¡sica de rede e / ou resoluÃ§Ã£o de nomes e "
"tente novamente.\n"
"     Mensagens de erro; %s\n"

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""
"\n"
"ERRO: um canal filho nÃ£o pode ser sincronizado sem que seu pai tambÃ©m seja\n"
"     sincronizado. Um pai precisa ser (a) sincronizado anteriormente ou (b) "
"sincronizado\n"
"     em conjunto com o canal filho desejado. Pais ausentes para esta\n"
"     transaÃ§Ã£o:\n"
"     %s\n"

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""
"\n"
"ERRO: vocÃª nÃ£o tem o direito de sincronizar um canal neste conjunto de "
"canais.\n"
"Entre em contato com seu contato do SUSE Manager\n"
"%s"

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr "  ERRO: sem espaÃ§o suficiente (%s KB) no dispostivo."

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr "    %3d/%s Busca bem sucedida: %s (%s bytes)"

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr "    Pacote extinto:  %s"

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr "   Tamanho total: %s"

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr "      Baixado %s de %s. Tempo restante estimado: %s"

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr "    Busca mal sucedida: %s"

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr "   Busca de sumÃ¡rio RPM: %s"

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr "       sucesso: %d"

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr "       falhou:  %d"

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr "       extinto: %d"

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr "   Recuperando/analisando metadados do pacote *relevantes*: %s (%s)"

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr "   Recuperando/analisando dados de erratas: %s (%s)"

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr "   Recuperando/analisando dados do kickstart: %s (%s)"

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr "   Recuperando/analisando arquivos da Ã¡rvore do kickstart: %s (%s)"

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr "   Importando metadados *relevantes* do pacote: %s (%s)"

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr "   * AVISO: este pode ser um processo lento."

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr "Vinculando pacotes aos canais"

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr "   Importando errata *relevante*: %s (%s)"

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr "   Nenhuma nova Ã¡rvore kickstartable para importar"

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr "Importando Ã¡rvores kickstartable (%d)"

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr "Ãrvores kickstartable importadas (%d)"

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr "+++ enviar log como um email +++"

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr "%s sincronizado. relatÃ³rio de %s"

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr "+++ email solicitado, mas nÃ£o hÃ¡ nada para enviar +++"

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""
"\"%s\" (especificado na linha de comando)\n"
"nÃ£o pÃ´de ser aberto e lido:\n"
"%s"

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""
"NÃ£o foi possÃ­vel abrir \"%s\"\n"
"e/ou escrito para:\n"
"%s"

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr "Nenhum manipulador para a etapa %s"

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr "Ambiente alterado, tentando novamente..."

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr "ERRO: Erro de integridade encontrado: \n"

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr "Falhas repetidas"

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""
"    ImportaÃ§Ã£o concluÃ­da:\n"
"        Hora de inÃ­cio: %s\n"
"        Hora de tÃ©rmino: %s\n"
"        Decorrido: %s\n"
"          "

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr "horas"

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr "minutos"

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr "segundos"

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""
"ERRO: O dump estÃ¡ faltando dados do pacote, use --no-rpms para ignorar esta "
"etapa ou corrigir o conteÃºdo para incluir dados do pacote."

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""
"O mestre do SUSE Manager nÃ£o suporta a sincronizaÃ§Ã£o de dados da organizaÃ§Ã£o."

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr "Pulando..."

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr "SincronizaÃ§Ã£o do SUSE Manager Inter Server. relatÃ³rio de %s"

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr " - sincronizaÃ§Ã£o do sistema de arquivos"

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr " - sincronizaÃ§Ã£o ao vivo"

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""
"ERRO: A sincronizaÃ§Ã£o de conteÃºdo Live com o RHN Classic Hosted nÃ£o Ã© mais "
"suportada.\n"
"Use o comando cdn-sync em vez disso, a menos que vocÃª esteja tentando "
"sincronizar de outro {PRODUCT_NAME} via Inter-Server-Sync (ISS), ou de "
"conteÃºdo local no disco via Channel Dump ISOs."

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr "   url: %s"

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr "   depuraÃ§Ã£o/nÃ­vel de saÃ­da: %s"

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr "ERRO: este servidor deve ser registrado no SUSE Manager."

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr "Recuperando/analisando %s dados"

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr "*** INTERRUPÃ‡ÃƒO DO SISTEMA CHAMADO ***"

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr "ERRO: ocorreu uma exceÃ§Ã£o fatal do analisador "

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr "(linha: %s, col: %s msg: %s)"

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr "ERRO: ocorreu uma exceÃ§Ã£o do analisador: %s"

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr "ERRO: ocorreu uma exceÃ§Ã£o (durante a anÃ¡lise): "

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""
"   Foram encontrados alguns erros com os dados %s (consulte os logs (%s) "
"para obter mais informaÃ§Ãµes)"

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr "   Foram encontrados alguns erros com %s dados:"

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr "   ------- %s ANALISAR/IMPORTAR ERRO -------"

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr "   ---------------------------------------"

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr "%s dados concluÃ­dos"

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr "Recuperando / analisando dados do canal"

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr "Dados do canal concluÃ­dos"

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr "%10s importado de %s"

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr "%10s importado de %s - %s"

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr "%10s"

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr "p"

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr "."

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr "   p = canal importado/sincronizado anteriormente"

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr "   . = canal ainda nÃ£o importado/sincronizado"

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr "   e = canal nÃ£o Ã© mais suportado (fim de serviÃ§o)"

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr "   ? = etiqueta do canal invÃ¡lida --- erro de digitaÃ§Ã£o?"

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr "   %s:"

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr "      %s %-40s %4s %s"

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr "canais-base"

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr "NADA RELEVANTE"

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr "fim-do-serviÃ§o"

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr "e"

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr "   erros de digitaÃ§Ã£o:"

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr "?"

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr "XXX: canais importados: %s"

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr "XXX:   canais em cache: %s"

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr "XXX: listar canais cancelados"

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr "ERRO: esses canais nÃ£o existem ou nÃ£o estÃ£o disponÃ­veis:"

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr "       (para ver uma lista de rÃ³tulos de canais: %s --list-channels)"

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr "   Recuperando/analisando metadados curtos do pacote: %s (%s)"

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""
"Diferenciar os metadados do pacote (o que estÃ¡ faltando localmente?): %s"

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr "DiferenÃ§a:    "

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr "ERRO: despejo incremental ignorado"

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr "Fazendo download de pacotes rpm"

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr "   Buscando RPMs ausentes: %s (%s)"

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr "NENHUM AUSENTE"

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr "Processando pacotes rpm completos"

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr "Fazendo Download de Metadados do Pacote"

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr "Fazendo download de pacotes srpm"

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr "   Buscando quaisquer SRPMs ausentes: %s (%s)"

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""
"Diferenciar os metadados do pacote de origem (o que estÃ¡ faltando "
"localmente?): %s"

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr "Fazendo Download de Metadados do Pacote de Origem"

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr "NÃ£o foi possÃ­vel salvar o arquivo %s: %s"

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr "Falha ao buscar o arquivo %s"

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr "Download de metadados de Ã¡rvores kickstartable"

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr "Download de arquivos de Ã¡rvores kickstartable"

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr "Transferindo todos os patches para o canal %s"

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr "Fazendo download de dados de patch"

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""
"ForÃ§ar o download de todos os dados do patch para os canais solicitados."

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr "Download dos dados do patch concluÃ­dos"

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr "Baixando:"

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr " - completo"

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr "Importando Metadados do Pacote de Origem"

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr "Importando Metadados do Pacote"

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr "ImportaÃ§Ã£o:  "

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr "Pacote nÃ£o encontrado no cache, limpe o cache para regenerÃ¡-lo."

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr "Importando patches de canal"

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr "Importando %s patches para o canal %s."

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr "ERRO: server.mount_point nÃ£o definido no arquivo de configuraÃ§Ã£o"

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr "ERRO: server.mount_point %s nÃ£o existe"

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr "ERRO: o caminho em server.mount_point (%s) nÃ£o existe"

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr "Linha de comando: %s"

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""
"APENAS PARA DEBUGAR: mÃ¡x. tamanho do lote para processamento de importaÃ§Ã£o "
"XML/banco de dados (1..%s).\"man satellite-sync\" para obter mais "
"informaÃ§Ãµes."

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""
"certificado alternativo da CA SSL (caminho completo para o arquivo cert)"

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr "processar dados apenas para este canal"

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""
"despejo de disco serÃ¡ considerado uma exportaÃ§Ã£o completa; veja \"man "
"satellite-sync\" para mais informaÃ§Ãµes."

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""
"os canais personalizados existentes tambÃ©m serÃ£o sincronizados (a menos que -"
"c seja usado)"

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""
"substitua o nÃ­vel de depuraÃ§Ã£o definido em /etc/rhn/rhn.conf (atualmente "
"definido em %s)."

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr "versÃ£o solicitada do dump XML (padrÃ£o: %s)"

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr "envie por e-mail um relatÃ³rio do que foi sincronizado/importado"

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr "forÃ§osamente processar todos os metadados (nÃ£o diferentes) dos patches"

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr "NÃ£o use um proxy http em nenhuma circunstÃ¢ncia."

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr "http proxy alternativo (hostname:port)"

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr "nome de usuÃ¡rio do proxy http alternativo"

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr "senha alternativa do proxy http"

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr "SUSE Manager pai para importar conteÃºdo de"

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr "listar todos os canais disponÃ­veis e sair"

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr "ajuda em todos os cÃ³digos de erro retornos de mgr-inter-sync"

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""
"ponto de montagem de origem para importaÃ§Ã£o - somente atualizaÃ§Ã£o de disco"

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr "nÃ£o processe dados de correÃ§Ã£o"

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr "nÃ£o processe dados do kickstart (apenas provisionamento)"

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr "nÃ£o processe metadados de pacote completo"

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr "nÃ£o faÃ§a o download ou processe quaisquer RPMs"

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr "desativar o SSL (nÃ£o recomendado)"

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""
"organizaÃ§Ã£o para a qual a sincronizaÃ§Ã£o importa dados. o padrÃ£o Ã© a conta de "
"administrador"

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr "imprima a configuraÃ§Ã£o e saia"

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr "servidor alternativo ao qual se conectar (nome do host)"

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr "sincronize com esta etapa (man satellite-sync para mais informaÃ§Ãµes)"

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""
"gravar dados completos no arquivo temporÃ¡rio antes de transmitir para o "
"restante do aplicativo"

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""
"APENAS DEBUG: caminho alternativo para a identificaÃ§Ã£o do sistema digital"

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""
"endereÃ§os de email alternativos para saÃ­da de sincronizaÃ§Ã£o (opÃ§Ã£o --email)"

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr "nÃ£o remova rpms ao importar do dump local"

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""
"o nome de domÃ­nio totalmente qualificado do Satellite principal. VÃ¡lido "
"apenas com --mount-point. NecessÃ¡rio se vocÃª deseja importar dados da "
"organizaÃ§Ã£o e permissÃµes de canal."

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""
"ERRO: esses argumentos nÃ£o fazem sentido neste contexto (tente --help): %s"

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr "ERRO: NÃ£o Ã© possÃ­vel conectar ao banco de dados: %s"

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr "ERRO: Verifique se o seu banco de dados estÃ¡ em execuÃ§Ã£o."

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr "ERRO: --debug-level aceita um valor inteiro dentro do intervalo %s."

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr "  0  - pouco registro/mensagens."

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr "  1  - registro/mensagens mÃ­nimos."

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr "  2  - nÃ­vel normal de registro/mensagens."

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr "  3  - muitos registros/mensagens."

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr "  4+ - registro/mensagens excessivos."

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr "ERRO: A opÃ§Ã£o --master Ã© vÃ¡lida apenas com a opÃ§Ã£o --mount-point"

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr "ERRO: NÃ£o foi possÃ­vel procurar a ID da organizaÃ§Ã£o %s"

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""
"AVISO: a opÃ§Ã£o --list-channels substitui qualquer opÃ§Ã£o --step. - passo "
"ignorado."

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""
"ERRO: '%s' nÃ£o Ã© uma etapa vÃ¡lida. Veja 'man mgr-inter-sync' para mais "
"detalhes."

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""
"ERRO: nenhum canal importado no momento; tente mgr-inter-sync --list-"
"channels; entÃ£o mgr-inter-sync -c chn0 -c chn1 ..."

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr "ERRO: - o tamanho do lote deve ter um valor dentro do intervalo: 1..50"

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr "ERRO: nenhum diretÃ³rio %s"

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr "CÃ³digos de erro: cÃ³digos retornados significa:"

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""
" -1  - NÃ£o foi possÃ­vel bloquear o arquivo ou KeyboardInterrupt ou SystemExit"

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr "  0  - SaÃ­da interrompida ou intencional pelo usuÃ¡rio"

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr "  1  - tentando executar mais de uma instÃ¢ncia do mgr-inter-sync."

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr "  2  - NÃ£o foi possÃ­vel encontrar as ferramentas de sincronizaÃ§Ã£o."

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr "  3  - ocorreu uma exceÃ§Ã£o geral do soquete"

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""
"  4  - ocorreu um erro de SSL. Verifique novamente suas configuraÃ§Ãµes de SSL."

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr "  5  - Erro ISS"

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr "  6  - ocorreu uma exceÃ§Ã£o nÃ£o tratada"

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr "  7  - erro de sincronizaÃ§Ã£o desconhecido"

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr "  8  - ERRO: deve ser root para executar"

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr "  9  - falha rpclib durante a sincronizaÃ§Ã£o init"

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr "  10 - erro de inicializaÃ§Ã£o de sincronizaÃ§Ã£o"

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr "  11 - Erro ao analisar o fluxo XML"

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr "  12 - O canal nÃ£o existe"

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr "  13 - Erro SQL durante a importaÃ§Ã£o de metadados do pacote"

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr "  14 - Erro SQL durante a vinculaÃ§Ã£o de pacotes de canais"

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr "  15 - Erro SQL durante o processamento xml"

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr "  16 - server.mount_point nÃ£o definido no arquivo de configuraÃ§Ã£o"

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""
"  17 - Erro SQL durante a recuperaÃ§Ã£o dos canais jÃ¡ importados no banco de "
"dados do SUSE Manager"

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr "  18 - Cadeia de conexÃ£o db incorreta no rhn.conf"

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr "  19 - Argumentos incorretos"

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr "  20 - NÃ£o foi possÃ­vel conectar ao db."

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr "  21 - NÃ­vel de depuraÃ§Ã£o incorreto"

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr "  22 - Etapa invÃ¡lida"

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr "  24 - arquivo inexistente"

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr "  25 - nenhum diretÃ³rio"

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr "  26 - mount_point nÃ£o existe"

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr "  27 - Essa organizaÃ§Ã£o nÃ£o existe"

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr "  28 - erro: --master Ã© vÃ¡lido apenas com --mount-point"

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr "ERRO: versÃ£o de despejo desconhecida, tente um dos %s"

#~ msgid "Your system was not found in the RHN database"
#~ msgstr "Seu sistema nÃ£o foi encontrado no banco de dados RHN"

#~ msgid "ISS is disabled on this satellite."
#~ msgstr "O ISS estÃ¡ desativado neste satÃ©lite."

#~ msgid "Spacewalk Proxy service not enabled for server profile: \"%s\""
#~ msgstr ""
#~ "ServiÃ§o Spacewalk Proxy nÃ£o ativado para o perfil do servidor: \"%s\""

#~ msgid "Red Hat Satellite Welcome Message"
#~ msgstr "Mensagem de Boas-vindas do Red Hat Satellite"

#~ msgid "Red Hat Satellite Privacy Statement"
#~ msgstr "DeclaraÃ§Ã£o de Privacidade do Red Hat Satellite"

#~ msgid ""
#~ "ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
#~ "supported.\n"
#~ "Please use the cdn-sync command instead unless you are attempting to sync "
#~ "from another Satellite via Inter-Satelite-Sync (ISS), or from local "
#~ "content on disk via Channel Dump ISOs."
#~ msgstr ""
#~ "ERRO: A sincronizaÃ§Ã£o de conteÃºdo ao vivo com o RHN Classic Hosted nÃ£o Ã© "
#~ "mais suportada.\n"
#~ "Em vez disso, use o comando cdn-sync, a menos que vocÃª esteja tentando "
#~ "sincronizar a partir de outro satÃ©lite via Inter-Satelite-Sync (ISS) ou a "
#~ "partir de conteÃºdo local em disco via ISOs de despejo de canal."

#~ msgid ""
#~ "ERROR: '%s' is not a valid step. See 'man satellite-sync' for more detail."
#~ msgstr ""
#~ "ERRO: '%s' nÃ£o Ã© uma etapa vÃ¡lida. Veja 'man satellite-sync' para mais "
#~ "detalhes."
07070100000087000081B40000000000000000000000015FBBE8EE0000B88A000000000000000000000000000000000000001B00000000spacewalk-backend/po/ro.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Alexandru Szasz <alexxed@gmail.com>, 2006.
# Cristian Gafton <gafton@redhat.com>, 2000-2001.
# Mihai Ibanescu <misa@redhat.com>, 2005.
# Mircea Daniel <daniel@reywind.tranceaddict>, 2006.
# Miroslav SuchÃ½ <msuchy@redhat.com>, 2011.
# Jiri Dostal <jdostal@redhat.com>, 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2018-03-16 10:54+0000\n"
"Last-Translator: Copied by Zanata <copied-by-zanata@zanata.org>\n"
"Language-Team: Romanian (http://www.transifex.com/projects/p/fedora/language/"
"ro/)\n"
"Language: ro\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?"
"2:1));\n"
"X-Generator: Zanata 4.6.2\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""

#, fuzzy
#~ msgid "Red Hat Satellite Welcome Message"
#~ msgstr ""
#~ "Bine aÅ£i venit Ã®n programul de subscriere ÅŸi Ã®nregistrare pentru\n"
#~ "serviciul Red Hat Network.\n"
#~ "\n"
#~ "UrmeazÃ£ mesaj de completat Ã®n limba romÃ¢nÃ£."
  07070100000088000081B40000000000000000000000015FBBE8EE0000C111000000000000000000000000000000000000001B00000000spacewalk-backend/po/ru.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Andrew Martynov <andrewm@inventa.ru>, 2004-2005.
# Leonid Kanter <leon@geon.donetsk.ua>, 2003.
# Miroslav SuchÃ½ <msuchy@redhat.com>, 2011.
# Vladimir Lazarenko <vlad@lazarenko.net>, 2004.
# Yulia Poyarkova <ypoyarko@redhat.com>, 2006.
# Yulia <ypoyarko@redhat.com>, 2006-2007,2010.
# Jiri Dostal <jdostal@redhat.com>, 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2018-03-16 10:54+0000\n"
"Last-Translator: Copied by Zanata <copied-by-zanata@zanata.org>\n"
"Language-Team: Russian <trans-ru@lists.fedoraproject.org>\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Zanata 4.6.2\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr "ÐžÑ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ Ð¿Ñ€Ð¾ÐºÑÐ¸-ÑÐµÑ€Ð²ÐµÑ€Ð° %s Ð½Ðµ ÑÐ¾Ð¾Ñ‚Ð²ÐµÑ‚ÑÑ‚Ð²ÑƒÐµÑ‚ %s."

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr "Ð¾Ñ‚ÐºÐ°Ð·Ð°Ð½Ð¾ Ð² Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ Ð¿Ñ€Ð¾ÐºÑÐ¸"

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr "ÐŸÐ¾Ð»ÑƒÑ‡ÐµÐ½ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ñ‹Ð¹ Ð·Ð°Ð¿Ñ€Ð¾Ñ (%s)."

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""
"Ð’ÐÐ–ÐÐž:\n"
"%s"

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr "ÐÐµÐ´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ñ‹Ð¹ URI %s"

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr "ÐÐµÐ´Ð¾ÑÑ‚Ð°Ñ‚Ð¾Ñ‡Ð½Ñ‹Ðµ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÐºÐ¸ (%s, %s"

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr "Ð¡Ð¸ÑÑ‚ÐµÐ¼Ð° Ð·Ð°Ñ€ÐµÐ³Ð¸ÑÑ‚Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð°, Ð½Ð¾ Ð½ÐµÐ°ÐºÑ‚Ð¸Ð²Ð½Ð°"

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr "ÐŸÐ°ÐºÐµÑ‚ Ð½Ðµ Ð½Ð°Ð¹Ð´ÐµÐ½"

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr "ÐÑ€Ñ…Ð¸Ñ‚ÐµÐºÑ‚ÑƒÑ€Ð° Â«%sÂ» Ð½Ðµ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÑ‚ÑÑ"

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr "ÐšÐ¾Ð½Ñ„Ð»Ð¸ÐºÑ‚ Ð¾ÑÐ½Ð¾Ð²Ð½Ñ‹Ñ… ÐºÐ°Ð½Ð°Ð»Ð¾Ð²"

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr "ÐÐµ ÑƒÐ´Ð°Ð»Ð¾ÑÑŒ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ ÑÐµÑ€Ð²ÐµÑ€ Ð² Ð³Ñ€ÑƒÐ¿Ð¿Ñƒ %s"

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr "Ð¢Ð¾ÐºÐµÐ½ Â«%sÂ» Ð½Ðµ Ð½Ð°Ð¹Ð´ÐµÐ½"

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr "ÐÐµÑÐ¾Ð¾Ñ‚Ð²ÐµÑ‚ÑÑ‚Ð²Ð¸Ðµ ÑÐµÐ°Ð½ÑÐ° ÐºÐ¸ÐºÑÑ‚Ð°Ñ€Ñ‚Ð°"

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ†Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð¸ Ð¸ Ð¿Ð°Ñ€Ð¾Ð»Ñ"

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr "ÐÐµ ÑƒÐºÐ°Ð·Ð°Ð½ ÑÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ñ‹Ð¹ Ð°Ð´Ñ€ÐµÑ"

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr "Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ñ‚ÑŒ Ð½Ðµ Ð¼ÐµÐ½ÑŒÑˆÐµ %d ÑÐ¸Ð¼Ð²Ð¾Ð»Ð¾Ð²"

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr "Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ñ‚ÑŒ Ð½Ðµ Ð±Ð¾Ð»ÑŒÑˆÐµ %d ÑÐ¸Ð¼Ð²Ð¾Ð»Ð¾Ð²"

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr "Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ &mdash; Â«%sÂ», Ð½ÐµÐ´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ñ‹Ð¹ ÑÐ¸Ð¼Ð²Ð¾Ð» &mdash; Â«%sÂ»"

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr "Ð¿Ð°Ñ€Ð¾Ð»ÑŒ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ñ‚ÑŒ Ð½Ðµ Ð¼ÐµÐ½ÑŒÑˆÐµ %d ÑÐ¸Ð¼Ð²Ð¾Ð»Ð¾Ð²"

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr "Ð¿Ð°Ñ€Ð¾Ð»ÑŒ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ñ‚ÑŒ Ð½Ðµ Ð±Ð¾Ð»ÑŒÑˆÐµ %d ÑÐ¸Ð¼Ð²Ð¾Ð»Ð¾Ð²"

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr "Ð¿Ð°Ñ€Ð¾Ð»ÑŒ ÑÐ¾Ð´ÐµÑ€Ð¶Ð¸Ñ‚ ÑÐ¸Ð¼Ð²Ð¾Ð» Â«%sÂ»"

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr "Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ñ‚ÑŒ Ð½Ðµ Ð¼ÐµÐ½ÑŒÑˆÐµ %d ÑÐ¸Ð¼Ð²Ð¾Ð»Ð¾Ð²"

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr "ÐÐµ ÑƒÐ´Ð°Ð»Ð¾ÑÑŒ Ð·Ð°Ñ€ÐµÐ³Ð¸ÑÑ‚Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ Ð¸Ð¼ÐµÐ½Ð°, Ð·Ð°ÐºÐ°Ð½Ñ‡Ð¸Ð²Ð°ÑŽÑ‰Ð¸ÐµÑÑ Ð½Ð° %s"

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
#, fuzzy
msgid "System Name cannot be less than 1 character"
msgstr "Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ñ‚ÑŒ Ð½Ðµ Ð±Ð¾Ð»ÑŒÑˆÐµ %d ÑÐ¸Ð¼Ð²Ð¾Ð»Ð¾Ð²"

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr "Ð¤Ð°Ð¹Ð» ÑÐ¾Ð´ÐµÑ€Ð¶Ð¸Ñ‚ Ð´Ð²Ð¾Ð¸Ñ‡Ð½Ñ‹Ðµ Ð´Ð°Ð½Ð½Ñ‹Ðµ"

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr "ÐÐµÐ¿ÑƒÑÑ‚Ð¾Ð¹ ÐºÐ°Ð½Ð°Ð» ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸"

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr "ÐžÑˆÐ¸Ð±ÐºÐ° Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ð¹"

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr "ÐšÐ°Ð½Ð°Ð» ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸ Ð½Ðµ ÑÑƒÑ‰ÐµÑÑ‚Ð²ÑƒÐµÑ‚"

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr "ÐšÐ°Ð½Ð°Ð» ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸ ÑƒÐ¶Ðµ ÑÑƒÑ‰ÐµÑÑ‚Ð²ÑƒÐµÑ‚"

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr "ÐÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÑŒ Ð°Ð±ÑÐ¾Ð»ÑŽÑ‚Ð½Ñ‹Ð¹ Ð¿ÑƒÑ‚ÑŒ Ðº Ñ„Ð°Ð¹Ð»Ñƒ"

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
#, fuzzy
msgid "Invalid crash name"
msgstr "ÐÐµÐ´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ð°Ñ Ñ€Ð¾Ð»ÑŒ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""
"Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ðµ:\n"
"    %s\n"

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
#, fuzzy
msgid "Linking packages to channels"
msgstr "ÐšÐ¾Ð½Ñ„Ð»Ð¸ÐºÑ‚ Ð¾ÑÐ½Ð¾Ð²Ð½Ñ‹Ñ… ÐºÐ°Ð½Ð°Ð»Ð¾Ð²"

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
#, fuzzy
msgid "base-channels"
msgstr "ÐšÐ¾Ð½Ñ„Ð»Ð¸ÐºÑ‚ Ð¾ÑÐ½Ð¾Ð²Ð½Ñ‹Ñ… ÐºÐ°Ð½Ð°Ð»Ð¾Ð²"

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
#, fuzzy
msgid "print the configuration and exit"
msgstr "ÐšÐ°Ð½Ð°Ð» ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸ Ð½Ðµ ÑÑƒÑ‰ÐµÑÑ‚Ð²ÑƒÐµÑ‚"

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
#, fuzzy
msgid "  12 - Channel do not exist"
msgstr "ÐšÐ°Ð½Ð°Ð» ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸ Ð½Ðµ ÑÑƒÑ‰ÐµÑÑ‚Ð²ÑƒÐµÑ‚"

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
   07070100000089000081B40000000000000000000000015FBBE8EE0000B688000000000000000000000000000000000000001B00000000spacewalk-backend/po/si.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Ankit Patel <ankit@redhat.com>, 2006, 2007.
# Tyronne Wickramarathne <tywickra@redhat.com>, 2006, 2007.
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Sinhala (http://www.transifex.com/projects/p/fedora/language/"
"si/)\n"
"Language: si\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
0707010000008A000081B40000000000000000000000015FBBE8EE000115BE000000000000000000000000000000000000001B00000000spacewalk-backend/po/sk.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Mike Karas <zoliqe@gmail.com>, 2005.
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2020-09-25 13:48+0000\n"
"Last-Translator: Ferdinand Galko <galko.ferdinand@gmail.com>\n"
"Language-Team: Slovak <https://l10n.opensuse.org/projects/uyuni/backend/sk/"
">\n"
"Language: sk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Weblate 3.6.1\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr "neÃºplnÃ½ token overenia proxy: %s"

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr "ZaslanÃ½ podpis proxy %s nezodpovedÃ¡ nÃ¡Å¡mu %s."

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr "zamietnutÃ© overenie proxy"

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr "PrijatÃ¡ neplatnÃ¡ poÅ¾iadavka (%s)."

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""
"DÃ”LEÅ½ITÃ SPRÃVA NASLEDUJE:\n"
"%s"

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""
"PoÄas behu '%s': zachytenÃ©\n"
"%s : %s\n"

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr "NeplatnÃ© URI %s"

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""
"\n"
"                   Na tomto serveri bol ÃºÄet %s deaktivovanÃ½.\n"
"                   Pre ÄalÅ¡iu pomoc kontaktujte administrÃ¡tora svojej "
"organizÃ¡cie."

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr "VÃ¡Å¡ systÃ©m sa nenaÅ¡iel v databÃ¡ze {PRODUCT_NAME}"

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr "Na tomto serveri je ISS zakÃ¡zanÃ©."

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr "Server \"%s\" nie je povolenÃ½ pre ISS."

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr "OÄakÃ¡vanÃ½ nÃ¡zov balÃ­ka, nie: %s"

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr "OÄakÃ¡vanÃ½ balÃ­k, nie: %s"

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr "SluÅ¾ba SUSE Manager Proxy nie je povolenÃ¡ pre profil servera: \"%s\""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr "NeplatnÃ½ kÄ¾ÃºÄ sedenia"

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr "Toto ID servera uÅ¾ neexistuje"

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr "NeplatnÃ½ typ hodnoty akcie %s (%s)"

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr "Akcia %s nepatrÃ­ k serveru %s"

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr "ChÃ½bajÃº poÅ¾adovanÃ© dÃ¡ta"

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr "ChÃ½bajÃº poÅ¾adovanÃ­ Älenovia"

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr "Pokus o registrÃ¡ciu systÃ©mu na neplatnÃ© pouÅ¾Ã­vateÄ¾skÃ© meno"

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr "PoÅ¾aduje sa neplatnÃ¡ verzia vydania systÃ©mu"

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""
"Nepodarilo sa nÃ¡jsÅ¥ platnÃ© sieÅ¥ovÃ© rozhranie, ipaddr a ip6addr sa nenaÅ¡li."

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr "UvÃ­tacia sprÃ¡va {PRODUCT_NAME}"

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr "VyhlÃ¡senie o ochrane sÃºkromia"

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr "OÄakÃ¡vanÃ½ slovnÃ­k ako argument produktu"

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr "NeplatnÃ¡ hodnota '%s' pre %s (%s)"

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr "NeplatnÃ½ pÃ¡r system_id/action_id."

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr "NeplatnÃ¡ hodnota %s (%s)"

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr "NemÃ¡te oprÃ¡vnenie spravovaÅ¥ balÃ­ky v null org"

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr "NemÃ¡te oprÃ¡vnenie spravovaÅ¥ balÃ­ky v %s org"

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr "NemÃ¡te oprÃ¡vnenie vykonÃ¡vaÅ¥ administratÃ­vne Ãºlohy"

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr "NemÃ¡te oprÃ¡vnenie spravovaÅ¥ kanÃ¡l %s, alebo tento kanÃ¡l neexistuje"

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""
"\n"
"               Na tomto serveri bol ÃºÄet %s deaktivovanÃ½.\n"
"               Pre ÄalÅ¡iu pomoc kontaktujte administrÃ¡tora svojej "
"organizÃ¡cie."

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""
"VÃ¡Å¡ ÃºÄet nemÃ¡ prÃ­stup k Å¾iadnym kanÃ¡lom, ktorÃ© zodpovedajÃº "
"(vydanie='%(release)s', arch='%(arch)s')%(www_activation)s"

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""
"\n"
"Ak mÃ¡te registraÄnÃ© ÄÃ­slo, zaregistrujte sa s nÃ­m najskÃ´r na http://www."
"redhat.com/apps/activate/ a potom skÃºste znova.\n"
"\n"

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr "NedostatoÄnÃ© prÃ¡va predplatnÃ©ho na vydanie (%s, %s"

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr "SystÃ©m je registrovanÃ½, ale neaktÃ­vny"

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""
"\n"
"NeplatnÃ¡ kombinÃ¡cia architektÃºry a vydania OS (%s, %s).\n"
"VÃ¡Å¡ systÃ©m bol zaregistrovanÃ½, ale nebude dostÃ¡vaÅ¥ aktualizÃ¡cie,\n"
"pretoÅ¾e nie je prihlÃ¡senÃ½ ku kanÃ¡lu. Ak ste eÅ¡te svoj produkt\n"
"neaktivovali pre servis, prosÃ­m, navÅ¡tÃ­vte naÅ¡u webovÃº strÃ¡nku na:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...na aktivÃ¡ciu vÃ¡Å¡ho produktu."

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""
"\n"
"NeplatnÃ¡ kombinÃ¡cia architektÃºry a vydania OS (%s, %s).\n"
"VÃ¡Å¡ systÃ©m bol zaregistrovanÃ½, ale nebude dostÃ¡vaÅ¥ aktualizÃ¡cie,\n"
"pretoÅ¾e sa nemohol prihlÃ¡siÅ¥ k zÃ¡kladnÃ©mu kanÃ¡lu.\n"
"PoÅ¾iadajte o pomoc administrÃ¡tora svojej organizÃ¡cie.\n"

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""
"\n"
"  Tento systÃ©m bol ÃºspeÅ¡ne zaregistrovanÃ½, ale zatiaÄ¾ nie je oprÃ¡vnenÃ½ na "
"sluÅ¾bu.\n"
"  Na oprÃ¡vnenie tohto systÃ©mu na servis sa prihlÃ¡ste na webovej strÃ¡nke:\n"
"\n"
"  %(entitlement_url)s\n"

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""
"\n"
"  Tento systÃ©m bol ÃºspeÅ¡ne zaregistrovanÃ½, ale neboli k dispozÃ­cii Å¾iadne "
"oprÃ¡vnenia\n"
"  na sluÅ¾bu.  Na oprÃ¡vnenie tohto systÃ©mu na servis sa prihlÃ¡ste na webovej "
"strÃ¡nke:\n"
"\n"
"  %(entitlement_url)s\n"

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr "ProsÃ­m, spustite rhn_register ako sprÃ¡vca systÃ©mu na tomto klientovi"

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr "SluÅ¾ba nie je povolenÃ¡ pre systÃ©movÃ½ profil: \"%s\""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr "PoÅ¾aduje sa neplatnÃ½ balÃ­k RPM %s"

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr "BalÃ­k nebol nÃ¡jdenÃ½"

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr "ArchitektÃºra `%s' nie je podporovanÃ¡"

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr "Token `%s' mÃ¡ priradenÃ½ viac ako jeden zÃ¡kladnÃ½ kanÃ¡l"

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr "KonfliktnÃ© zÃ¡kladnÃ© kanÃ¡ly"

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr "Zlyhalo pridanie servera do skupiny %s"

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr "Dosiahol sa maximÃ¡lny poÄet pouÅ¾itÃ­ %s"

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""
"Skladanie tokenov opÃ¤tovnej registrÃ¡cie s rÃ´znymi zÃ¡kladnÃ½mi oprÃ¡vneniami "
"nie je podporovanÃ©"

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr "Nepodarilo sa nÃ¡jsÅ¥ token '%s'"

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr "Å½etÃ³ny z nezhodujÃºcich sa organizÃ¡ciÃ­"

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr "NesÃºlad sedenia kickstart"

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr "Skladanie tokenov opÃ¤tovnej registrÃ¡cie nie je podporovanÃ©"

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr "NeplatnÃ¡ kombinÃ¡cia pouÅ¾Ã­vateÄ¾skÃ©ho mena/hesla"

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr "PouÅ¾Ã­vateÄ¾skÃ© meno `%s' nebolo rezervovanÃ©"

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr "E-mailovÃ¡ adresa nie je uvedenÃ¡"

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr "pouÅ¾Ã­vateÄ¾skÃ© meno by malo maÅ¥ najmenej %d znakov"

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr "pouÅ¾Ã­vateÄ¾skÃ© meno by malo maÅ¥ menej ako %d znakov"

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr "pouÅ¾Ã­vateÄ¾skÃ© meno = `%s', neplatnÃ½ znak `%s'"

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr "ProsÃ­m, obmedzte svoju e-mailovÃº adresu na %s znakov"

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr "heslo musÃ­ maÅ¥ najmenej %d znakov"

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr "Heslo musÃ­ byÅ¥ kratÅ¡ie ako %d znakov"

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr "heslo obsahuje znak `%s'"

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr "pouÅ¾Ã­vateÄ¾skÃ© meno by malo byÅ¥ najmenej %d znakov dlhÃ©"

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr "Nie je moÅ¾nÃ© zaregistrovaÅ¥ pouÅ¾Ã­vateÄ¾skÃ© menÃ¡ konÄiace s %s"

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr "NezdÃ¡ sa, Å¾e je to platnÃ© pouÅ¾Ã­vateÄ¾skÃ© meno."

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr "NeplatnÃ¡ kombinÃ¡cia pouÅ¾Ã­vateÄ¾skÃ©ho mena a hesla."

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr "Toto prihlasovacie meno je uÅ¾ obsadenÃ©, alebo je heslo nesprÃ¡vne."

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr "PrÃ­stup zamietnutÃ½."

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr "Objekt nebol nÃ¡jdenÃ½."

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr "NeplatnÃ© digitÃ¡lne ID systÃ©mu."

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr "NeplatnÃ© prihlasovanie Ãºdaje do systÃ©mu."

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr "Nepodarilo zÃ­skaÅ¥ z databÃ¡zy pouÅ¾Ã­vateÄ¾skÃ© dÃ¡ta."

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr "VyÅ¾aduje sa platnÃ© pouÅ¾Ã­vateÄ¾skÃ© meno."

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr "VyÅ¾aduje sa platnÃ© heslo."

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr "NedodrÅ¾anie minimÃ¡lnej dÄºÅ¾ky pouÅ¾Ã­vateÄ¾skÃ©ho mena."

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr "NedodrÅ¾anie minimÃ¡lnej dÄºÅ¾ky hesla."

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr "PouÅ¾Ã­vateÄ¾skÃ© meno obsahuje neplatnÃ© znaky."

#: ../common/rhnException.py:66
msgid "File not found."
msgstr "SÃºbor nebol nÃ¡jdenÃ½."

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr "KombinÃ¡cia architektÃºry a verzie OS nie je podporovanÃ¡."

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr "Nepodarilo zÃ­skaÅ¥ z databÃ¡zy systÃ©movÃ© dÃ¡ta."

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr "Funkcii boli odovzdanÃ© neplatnÃ© argumenty."

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr "PoÅ¾adovanÃº poloÅ¾ku sa nepodarilo zÃ­skaÅ¥."

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr "Nepodarilo sa aktualizovaÅ¥ poloÅ¾ku databÃ¡zy."

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr "NepodporovanÃ¡ architektÃºra servera."

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""
"\n"
"     Funkcia anonymnÃ©ho servera uÅ¾ nie je k dispozÃ­cii.\n"
"\n"
"     Znova zaregistrujte tento systÃ©m spustenÃ­m mgr_register ako root.\n"
"     ProsÃ­m navÅ¡tÃ­vte https://%(hostname)s/rhn/systems/SystemEntitlements."
"do\n"
"     alebo sa prihlÃ¡ste na https://%(hostname)s a z karty \"PrehÄ¾ad\" "
"vyberte\n"
"     \"SprÃ¡va predplatnÃ©ho\" na aktivÃ¡ciu sluÅ¾by pre tento systÃ©m.\n"
"     "

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr "ZÃ¡znam nie je dostupnÃ½ v databÃ¡ze."

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr "NeplatnÃ¡ hodnota pre poloÅ¾ku."

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""
"\n"
"     Tento systÃ©m nemÃ¡ platnÃ© oprÃ¡vnenie pre SUSE Manager.\n"
"     ProsÃ­m navÅ¡tÃ­vte https://%(hostname)s/rhn/systems/SystemEntitlements."
"do\n"
"     alebo sa prihlÃ¡ste na https://%(hostname)s a z karty \"PrehÄ¾ad\" "
"vyberte\n"
"     \"SprÃ¡va predplatnÃ©ho\"vna aktivÃ¡ciu sluÅ¾by pre tento systÃ©m.\n"
"     "

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr "Chyba kanÃ¡la"

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr "Token klientskÃ©ho sedenia je neplatnÃ½."

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr "PlatnosÅ¥ tokenu klientskÃ©ho sedenia vyprÅ¡ala."

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr "NemÃ¡te oprÃ¡vnenie zÃ­skaÅ¥ poÅ¾adovanÃ½ objekt."

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr "NeplatnÃ¡ akcia"

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr "NemÃ¡te oprÃ¡vnenie vykonÃ¡vaÅ¥ administratÃ­vne Ãºlohy v tomto systÃ©me."

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr "SystÃ©m je uÅ¾ prihlÃ¡senÃ½ k zadanÃ©mu kanÃ¡lu."

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr "SystÃ©m nie je momentÃ¡lne prihlÃ¡senÃ½ k zadanÃ©mu kanÃ¡lu."

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr "ZadanÃ½ kanÃ¡l neexistuje."

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr "NeplatnÃ¡ verzia kanÃ¡la."

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""
"\n"
"     Limity Älenstva v pouÅ¾Ã­vateÄ¾skÃ½ch skupinÃ¡ch boli prekroÄenÃ©.\n"
"\n"
"     AktuÃ¡lne nastavenia vÃ¡Å¡ho ÃºÄtu vÃ¡m neumoÅ¾ÅˆujÃº pridaÅ¥ ÄalÅ¡Ã­ "
"pouÅ¾Ã­vateÄ¾skÃ½\n"
"     ÃºÄet. ProsÃ­m, overte si u administrÃ¡tora organizÃ¡cie pre vÃ¡Å¡ ÃºÄet, Äi "
"sa\n"
"     musÃ­ zmeniÅ¥ maximÃ¡lny poÄet pouÅ¾Ã­vateÄ¾ov, ktorÃ­ sa mÃ´Å¾u prihlÃ¡siÅ¥ k "
"serveru.\n"
"     k serveru.\n"
"     "

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""
"\n"
"     Limity Älenstva v systÃ©movÃ½ch skupinÃ¡ch boli prekroÄenÃ©.\n"
"\n"
"     AktuÃ¡lne nastavenia vÃ¡Å¡ho ÃºÄtu vÃ¡m neumoÅ¾ÅˆujÃº pridaÅ¥ ÄalÅ¡Ã­ systÃ©movÃ½\n"
"     profil. ProsÃ­m, obrÃ¡Å¥te sa na administrÃ¡tora organizÃ¡cie pre vÃ¡Å¡ ÃºÄet,\n"
"     ak chcete upraviÅ¥ maximÃ¡lny poÄet systÃ©movÃ½ch profilov, ktorÃ© je mÃ´Å¾u "
"byÅ¥\n"
"     prihlÃ¡senÃ© k vÃ¡Å¡mu ÃºÄtu.\n"
"     "

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""
"\n"
"     NeplatnÃ¡ architektÃºra.\n"
"\n"
"     ArchitektÃºru balÃ­ka nie je podporovanÃ¡\n"
"     "

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr "NeplatnÃ¡ hlaviÄka RPM"

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""
"\n"
"    Tento systÃ©m je uÅ¾ zaregistrovanÃ½ ako Salt Minion. Ak ho chcete "
"zaregistrovaÅ¥ ako tradiÄnÃ©ho klienta,\n"
"    najskÃ´r ho vymaÅ¾te cez webovÃ© UI alebo API a potom ho zaregistrujte "
"pomocou tradiÄnÃ½ch nÃ¡strojov.\n"
"    "

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr "Na server boli nahranÃ© neplatnÃ© informÃ¡cie"

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr "Chyba pri nahrÃ¡vanÃ­ konfigurÃ¡cie sieÅ¥ovÃ½ch rozhranÃ­."

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""
"\n"
"     Nahranie balÃ­ka zlyhalo z dÃ´vodu poruÅ¡enia obmedzenÃ­ jedineÄnosti.\n"
"     Uistite sa, Å¾e balÃ­k nemÃ¡ duplicitnÃ© zÃ¡vislosti alebo uÅ¾ neexistuje\n"
"     na serveri.\n"
"     "

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""
"\n"
"     Na tomto serveri je zakÃ¡zanÃ¡ voÄ¾ba --force rhnpush.\n"
"     Pre ÄalÅ¡iu pomoc kontaktujte svojho administrÃ¡tora SUSE Manager.\n"
"     "

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""
"\n"
"     ZadanÃ½ aktivaÄnÃ½ token nebolo moÅ¾nÃ© nÃ¡jsÅ¥ na serveri.\n"
"     ProsÃ­m, skÃºste to znova s platnÃ½m kÄ¾ÃºÄom.\n"
"     "

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""
"Pomocou tohto registraÄnÃ©ho tokenu bolo zaregistrovanÃ½ch prÃ­liÅ¡ veÄ¾a systÃ©mov"

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr "Token obsahuje neplatnÃ©, zastaranÃ© alebo nedostatoÄnÃ© nastavenia"

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr "KonfliktnÃ© aktivaÄnÃ© tokeny"

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""
"\n"
"     Pre vÃ¡Å¡ systÃ©m sa nenaÅ¡iel Å¾iadny zodpovedajÃºci zÃ¡kladnÃ½ kanÃ¡l.\n"
"     "

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""
"\n"
"     NemÃ¡te oprÃ¡vnenie predplatnÃ©ho k urÄenÃ©mu kanÃ¡lu.\n"
"     ÄŽalÅ¡ie podrobnosti nÃ¡jdete v kanÃ¡li svojej organizÃ¡cie alebo\n"
"     administrÃ¡tora organizÃ¡cie.\n"
"     "

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr "NemÃ´Å¾ete sa odhlÃ¡siÅ¥ zo zÃ¡kladnÃ©ho kanÃ¡la."

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr "Nie je moÅ¾nÃ© prihlÃ¡siÅ¥ sa k SUSE Manager alebo Proxy kanÃ¡lu."

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr "Pri pokuse o pripojenie systÃ©mu k jeho skupinÃ¡m sa vyskytla chyba"

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr "Nie je moÅ¾nÃ© priradiÅ¥ oprÃ¡vnenie systÃ©mu"

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr "NedodrÅ¾anie maximÃ¡lnej dÄºÅ¾ky e-mailu."

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr "Tento systÃ©m bol predtÃ½m zaregistrovanÃ½."

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr "NeplatnÃ© pouÅ¾Ã­vateÄ¾skÃ© meno"

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr "Server sa nepodarilo vyhÄ¾adaÅ¥"

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr "ChÃ½ba poÅ¾adovanÃ½ argument"

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr "S hardvÃ©rom nie sÃº spojenÃ© Å¾iadne informÃ¡cie o oprÃ¡vneniach"

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr "InÅ¡talaÄnÃ© ÄÃ­slo nie je oprÃ¡vÅˆujÃºce"

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr "NedodrÅ¾anie maximÃ¡lnej dÄºÅ¾ky pouÅ¾Ã­vateÄ¾skÃ©ho mena"

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr "NedodrÅ¾anie maximÃ¡lnej dÄºÅ¾ky hesla"

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr "Tento pouÅ¾Ã­vateÄ¾ mÃ¡ prÃ­stup iba na ÄÃ­tanie API. Akcia zamietnutÃ¡."

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr "NÃ¡zov systÃ©mu nesmie maÅ¥ menej ako 1 znak"

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr "Chyba SUSE Manager Proxy."

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr "SUSE Manager Proxy sa nemÃ´Å¾e prihlÃ¡siÅ¥."

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""
"\n"
"     ID systÃ©mu SUSE Manager Proxy nezodpovedÃ¡ Spacewalk Proxy Server\n"
"     v databÃ¡ze.\n"
"     "

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr "Token sedenia SUSE Manager Proxy je neplatnÃ½."

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr "PlatnosÅ¥ tokenu sedenia SUSE Manager Proxy vyprÅ¡ala."

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""
"\n"
"      vytvÃ¡ranie pouÅ¾Ã­vateÄ¾ov nie je povolenÃ© cez mgr_register;\n"
"     kontaktujte svojho sprÃ¡vcu systÃ©mov a poÅ¾iadajte ho o vytvorenie ÃºÄtu.\n"
"     "

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""
"\n"
"     Tento server SUSE Manager nemÃ¡ povolenie na tomto serveri pouÅ¾Ã­vaÅ¥ "
"Inter Server Sync\n"
"     "

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""
"\n"
"     Inter Server Sync je zakÃ¡zanÃ½ na tomto SUSE Manager Server.\n"
"     "

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr "OdovzdanÃ½ neplatnÃ½ dÃ¡tovÃ½ typ"

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr "Nie je moÅ¾nÃ© zÃ­skaÅ¥ kanÃ¡l"

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr "Nie je moÅ¾nÃ© zÃ­skaÅ¥ balÃ­k"

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr "Nie je moÅ¾nÃ© zÃ­skaÅ¥ tlaÄovÃº chybu"

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr "SÃºbor chÃ½ba"

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr "Chyba naÄÃ­tania funkcie"

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr "Chyba vykonÃ¡vania funkcie"

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr "ChÃ½ba reÅ¥azec verzie"

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr "NeplatnÃ½ reÅ¥azec verzie"

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr "NezhodnÃ© verzie"

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr "NeplatnÃ¡ verzia kanÃ¡la"

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr "Å½iadny sÃºbor comps pre kanÃ¡l"

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr "Nie je moÅ¾nÃ© zÃ­skaÅ¥ sÃºbor comps"

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr "ChÃ½ba konfiguraÄnÃ¡ akcia"

#: ../common/rhnException.py:230
msgid "File too large"
msgstr "SÃºbor je prÃ­liÅ¡ veÄ¾kÃ½"

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr "SÃºbor obsahuje binÃ¡rne dÃ¡ta"

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr "KonfiguraÄnÃ½ kanÃ¡l nie je prÃ¡zdny"

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr "Chyba oprÃ¡vnenÃ­"

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr "ChÃ½ba obsah konfiguraÄnÃ©ho sÃºboru"

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr "OddeÄ¾ovaÄe Å¡ablÃ³n nie sÃº uvedenÃ©"

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr "KonfiguraÄnÃ½ kanÃ¡l neexistuje"

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr "KonfiguraÄnÃ½ kanÃ¡l uÅ¾ existuje"

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr "ChÃ½ba sÃºbor z konfiguraÄnÃ©ho kanÃ¡la"

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr "NahranÃ¡ je inÃ¡ revÃ­zia tohto sÃºboru"

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr "SÃºbor uÅ¾ bol nahranÃ½ na konfiguraÄnÃ½ kanÃ¡l"

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr "VeÄ¾kosÅ¥ sÃºboru presahuje zostÃ¡vajÃºci priestor kvÃ³ty"

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr "MusÃ­ byÅ¥ zadanÃ¡ ÃºplnÃ¡ cesta k sÃºboru"

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr "NeplatnÃ© ÄÃ­slo revÃ­zie"

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr "Nie je moÅ¾nÃ© porovnÃ¡vaÅ¥ sÃºbory rÃ´znych sÃºborovÃ½ch typov"

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr "InformÃ¡cie o zlyhanÃ­ sÃº neplatnÃ© alebo neÃºplnÃ©"

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr "InformÃ¡cie o zlyhanÃ­ sÃºboru sÃº neplatnÃ© alebo neÃºplnÃ©"

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr "Chyba pri vytvÃ¡ranÃ­ cesty adresÃ¡ra zlyhania"

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr "Chyba pri vytvÃ¡ranÃ­ cesty sÃºboru zlyhania"

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr "NeplatnÃ© kÃ³dovanie obsahu"

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr "NeplatnÃ½ nÃ¡zov zlyhania"

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr "HlÃ¡senie zlyhanÃ­ je pre tÃºto organizÃ¡ciu zakÃ¡zanÃ©"

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr "Prenos sÃºboru vÃ½sledkov SCAP je neplatnÃ½ alebo neÃºplnÃ½"

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr "Chyba pri vytvÃ¡ranÃ­ cesty adresÃ¡ra pre podrobnÃ© vÃ½sledky SCAP"

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr "Chyba pri vytvÃ¡ranÃ­ cesty sÃºboru pre podrobnÃ© vÃ½sledky SCAP"

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""
"\n"
"     Pri spracovanÃ­ vaÅ¡ej poÅ¾iadavky sa vyskytla chyba. Ak problÃ©m\n"
"     pretrvÃ¡va, zadajte, prosÃ­m, hlÃ¡senie o chybe na scc.suse.com.\n"
"     Ak sa rozhodnete odoslaÅ¥ hlÃ¡senie o chybe, nezabudnite uviesÅ¥\n"
"     podrobnosti o tom, Äo ste sa pokÃºsili urobiÅ¥, keÄ sa vyskytla tÃ¡to\n"
"     chyba, a podrobnosti o tom, ako tento problÃ©m reprodukovaÅ¥.\n"

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""
"ChybovÃ¡ sprÃ¡va:\n"
"    %s\n"

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr "KÃ³d triedy chyby: %s\n"

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr "InformÃ¡cia o triede chÃ½b: %s\n"

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr "Vysvetlenie: %s"

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr "CHYBA: %s %s: %s"

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr "TRACEBACK: %s"

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr "formÃ¡t %s by mal byÅ¥ aspoÅˆ RRRRMMDD.\n"

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""
"\n"
"CHYBA: vykonanie kroku %s. Chyba je:\n"
"%s\n"

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""
"\n"
"CHYBA: pri prÃ­stupe k Ãºdajom kanÃ¡la z doÄasnÃ©ho ÃºloÅ¾iska sa vyskytol\n"
"       problÃ©m. Migrovali ste vÅ¡etky dÃ¡ta z kanÃ¡lovÃ½ch ISO do tohto\n"
"       adresÃ¡ra? Ak Ã¡no, znovu skontrolujte kanÃ¡lovÃ© ISO, uistite sa,\n"
"       Å¾e ich mÃ¡te vÅ¡etky a potom iteratÃ­vne znovu pripojte a znovu\n"
"       naplÅˆte doÄasnÃ© ÃºloÅ¾isko (%s).\n"

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""
"\n"
"CHYBA: pri synchronizÃ¡cii informÃ¡ciÃ­ sa vyskytol problÃ©m.\n"
"       ChybovÃ¡ sprÃ¡va: %s\n"

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""
"\n"
"CHYBA: Pri komunikÃ¡cii s ISS Master sa vyskytol problÃ©m.\n"
"       V zÃ¡vislosti od konkrÃ©tnych podrobnostÃ­ o chybe skontrolujte svoju "
"konfigurÃ¡ciu,\n"
"       zÃ¡kladnÃ© sieÅ¥ovÃ© pripojenie a/alebo rozlÃ­Å¡enie nÃ¡zvov a skÃºste "
"znova.\n"
"       ChybovÃ¡ sprÃ¡va: %s\n"

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""
"\n"
"CHYBA: Pri komunikÃ¡cii s ISS Master sa vyskytol problÃ©m.\n"
"       Ak je hlavnÃ½ satellite starÅ¡Ã­ ako v5.3, nemÃ¡ schopnosÅ¥ ISS.\n"
"       Inak v zÃ¡vislosti od konkrÃ©tnych podrobnostÃ­ o chybe skontrolujte "
"svoju\n"
"       konfigurÃ¡ciu, zÃ¡kladnÃ© sieÅ¥ovÃ© pripojenie a/alebo rozlÃ­Å¡enie nÃ¡zvov a "
"skÃºste znova.\n"
"       ChybovÃ¡ sprÃ¡va: %s\n"

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""
"\n"
"CHYBA: kanÃ¡l potomka nie je moÅ¾nÃ© synchronizovaÅ¥ bez synchronizÃ¡cie jeho\n"
"       rodiÄa. RodiÄ musÃ­ byÅ¥ buÄ (a) predtÃ½m synchronizovanÃ½ alebo (b) "
"synchronizovanÃ½\n"
"       spolu s poÅ¾adovanÃ½m kanÃ¡lom potomka. ChÃ½bajÃºci rodiÄia pre tÃºto\n"
"       transakciu:\n"
"       %s\n"

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""
"\n"
"CHYBA: nemÃ¡te prÃ¡vo synchronizovaÅ¥ kanÃ¡l v tejto skupine kanÃ¡lov.\n"
"ObrÃ¡Å¥te sa na svoj kontakt pre SUSE Manager\n"
"%s"

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr "  CHYBA: na zariadenÃ­ nie je dostatok voÄ¾nÃ©ho miesta (%s KB)."

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr "    %3d/%s Stiahnutie ÃºspeÅ¡nÃ©: %s (%s bajtov)"

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr "    ZaniknutÃ½ balÃ­k:  %s"

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr "   CelkovÃ¡ veÄ¾kosÅ¥: %s"

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr "      StiahnutÃ½ch %s z %s. OdhadovanÃ½ zostÃ¡vajÃºci Äas: %s"

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr "    Stiahnutie neÃºspeÅ¡nÃ©: %s"

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr "   Zhrnutie stiahnutia RPM: %s"

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr "       Ãºspech: %d"

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr "       neÃºspeÅ¡nÃ©:  %d"

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr "       zaniknutÃ©: %d"

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr "   ZÃ­skavanie / analyzovanie metadÃ¡t *relevantnÃ½ch* balÃ­kov: %s (%s)"

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr "   ZÃ­skavanie / analyzovanie dÃ¡t tlaÄovÃ½ch chÃ½b: %s (%s)"

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr "   ZÃ­skavanie / analyzovanie dÃ¡t kickstart: %s (%s)"

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr "   ZÃ­skavanie / analyzovanie sÃºborov stromov kickstart: %s (%s)"

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr "   Importovanie metadÃ¡t *relevantnÃ½ch* balÃ­kov: %s (%s)"

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr "   * UPOZORNENIE: toto mÃ´Å¾e byÅ¥ pomalÃ½ proces."

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr "Prepojenie balÃ­kov ku kanÃ¡lom"

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr "   Importovanie *relevantnÃ½ch* tlaÄovÃ½ch chÃ½b: %s (%s)"

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr "   Å½iadny novÃ½ strom schopnÃ½ kickstart na import"

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr "Importovanie stromov schopnÃ½ch kickstart (%d)"

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr "ImportovanÃ© stromy schopnÃ© kickstart (%d)"

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr "+++ odosielanie zÃ¡znamu ako e-mail +++"

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr "%s sync. sprÃ¡va od %s"

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr "+++ poÅ¾adovanÃ½ e-mail, ale nie je Äo +++"

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""
"\"%s\" (uvedenÃ© v prÃ­kazovom riadku)\n"
"sa nepodarilo otvoriÅ¥ a ÄÃ­taÅ¥:\n"
"%s"

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""
"\"%s\" sa nepodarilo otvoriÅ¥\n"
"a/alebo zapÃ­saÅ¥ do:\n"
"%s"

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr "Å½iadna obsluha pre krok %s"

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr "Prostredie sa zmenilo, opÃ¤tovnÃ© skÃºÅ¡anie..."

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr "CHYBA: Vyskytla sa ChybaIntegrity: \n"

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr "OpakovanÃ© zlyhania"

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""
"    Import je dokonÄenÃ½:\n"
"        ZaÄiatoÄnÃ½ Äas: %s\n"
"        KoncovÃ½ Äas:   %s\n"
"        UplynulÃ½:    %s\n"
"          "

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr "hodiny"

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr "minÃºty"

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr "sekundy"

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""
"CHYBA: Na vÃ½pise chÃ½bajÃº dÃ¡ta balÃ­kov, pouÅ¾ite --no-rpms na preskoÄenie "
"tohto kroku alebo opravte obsah tak, aby obsahoval dÃ¡ta balÃ­kov."

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr "SUSE Manager master nepodporuje synchronizÃ¡ciu Ãºdajov organizÃ¡ciÃ­."

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr "Preskakovanie..."

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr "SprÃ¡va synchronizÃ¡cie pre SUSE Manager Inter Server od %s"

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr " - synchronizÃ¡cia sÃºborovÃ©ho systÃ©mu"

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr " - Å¾ivÃ¡ synchronizÃ¡cia"

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""
"CHYBA: SynchronizÃ¡cia Å¾ivÃ©ho obsahu so serverom RHN Classic Hosted uÅ¾ nie je "
"podporovanÃ¡.\n"
"Namiesto toho pouÅ¾ite prÃ­kaz cdn-sync, pokiaÄ¾ sa nepokÃºÅ¡ate synchronizovaÅ¥ s "
"ÄalÅ¡Ã­m {PRODUCT_NAME} cez Inter-Satelite-Sync (ISS) alebo s lokÃ¡lnym obsahom "
"na disku cez Channel Dump ISO."

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr "   url: %s"

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr "   ladiaca/vÃ½stupnÃ¡ ÃºroveÅˆ: %s"

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr "CHYBA: tento server musÃ­ byÅ¥ zaregistrovanÃ½ v SUSE Manager."

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr "ZÃ­skavanie / analyzovanie dÃ¡t %s"

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr "*** VOLANÃ‰ SYSTÃ‰MOVÃ‰ PRERUÅ ENIE ***"

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr "CHYBA: vyskytla sa kritickÃ¡ vÃ½nimka analyzÃ¡tora "

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr "(riadok: %s, stÄºpec: %s sprÃ¡va: %s)"

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr "CHYBA: vyskytla sa vÃ½nimka analyzÃ¡tora: %s"

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr "CHYBA: vyskytla sa vÃ½nimka (poÄas analÃ½zy): "

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""
"   Vyskytli sa nejakÃ© chyby s dÃ¡tami %s (ÄalÅ¡ie informÃ¡cie nÃ¡jdete v "
"zÃ¡znamoch (%s))"

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr "   Vyskytli sa nejakÃ© chyby s dÃ¡tami %s:"

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr "   ------- CHYBA ANALÃZY / IMPORTU %s -------"

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr "   ---------------------------------------"

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr "dÃ¡ta %s sÃº kompletnÃ©"

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr "ZÃ­skavanie / analyzovanie dÃ¡t kanÃ¡la"

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr "DÃ¡ta kanÃ¡la sÃº kompletnÃ©"

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr "%10s import z %s"

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr "%10s import z %s - %s"

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr "%10s"

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr "p"

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr "."

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr "   p = predtÃ½m importovanÃ½/synchronizovanÃ½ kanÃ¡l"

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr "   . = kanÃ¡l eÅ¡te nebol importovanÃ½/synchronizovanÃ½"

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr "   e = kanÃ¡l uÅ¾ nie je podporovanÃ½ (koniec sluÅ¾by)"

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr "   ? = Å¡tÃ­tok kanÃ¡la je neplatnÃ½ --- preklep?"

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr "   %s:"

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr "      %s %-40s %4s %s"

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr "zÃ¡kladnÃ©-kanÃ¡ly"

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr "Å½IADNE RELEVANTNÃ‰"

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr "koniec-sluÅ¾by"

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr "e"

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr "   preklepy:"

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr "?"

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr "XXX: importovanÃ© kanÃ¡ly: %s"

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr "XXX:   kanÃ¡ly vo vyrovnÃ¡vacej pamÃ¤ti: %s"

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr "XXX: zoznam volanÃ½ch kanÃ¡lov"

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr "CHYBA: tieto kanÃ¡ly buÄ neexistujÃº, alebo nie sÃº k dispozÃ­cii:"

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr "       (pozrieÅ¥ si zoznam Å¡tÃ­tkov kanÃ¡lov: %s --list-channels)"

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr "   ZÃ­skavanie / analyzovanie metadÃ¡t krÃ¡tkych balÃ­kov: %s (%s)"

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr "PorovnÃ¡vanie metadÃ¡t balÃ­kov (Äo chÃ½ba lokÃ¡lne?): %s"

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr "PorovnÃ¡vanie:    "

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr "CHYBA: preskoÄenÃ½ prÃ­rastkovÃ½ vÃ½pis"

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr "SÅ¥ahovanie rpm balÃ­kov"

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr "   SÅ¥ahovanie vÅ¡etkÃ½ch chÃ½bajÃºcich RPM: %s (%s)"

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr "Å½IADNY NECHÃBA"

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr "Spracovanie rpm balÃ­kov je dokonÄenÃ©"

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr "SÅ¥ahovanie metadÃ¡t balÃ­kov"

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr "SÅ¥ahovanie srpm balÃ­kov"

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr "   SÅ¥ahovanie vÅ¡etkÃ½ch chÃ½bajÃºcich SRPM: %s (%s)"

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr "PorovnÃ¡vanie metadÃ¡t zdrojovÃ½ch balÃ­kov (Äo chÃ½ba lokÃ¡lne?): %s"

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr "SÅ¥ahovanie metadÃ¡t zdrojovÃ½ch balÃ­kov"

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr "Nepodarilo sa uloÅ¾iÅ¥ sÃºbor %s: %s"

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr "Zlyhalo stiahnutie sÃºboru %s"

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr "SÅ¥ahovanie metadÃ¡t stromov schopnÃ½ch kickstart"

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr "SÅ¥ahovanie sÃºborov stromov schopnÃ½ch kickstart"

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr "ZÃ­skanie vÅ¡etkÃ½ch oprÃ¡v pre kanÃ¡l %s"

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr "SÅ¥ahovanie dÃ¡t oprÃ¡v"

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr "VynÃºtenie stiahnutia vÅ¡etkÃ½ch dÃ¡t oprÃ¡v pre poÅ¾adovanÃ© kanÃ¡ly."

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr "SÅ¥ahovanie dÃ¡t oprÃ¡v je dokonÄenÃ©"

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr "SÅ¥ahovanie:"

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr " - dokonÄenÃ©"

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr "Importovanie metadÃ¡t zdrojovÃ½ch balÃ­kov"

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr "Importovanie metadÃ¡t balÃ­kov"

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr "Importovanie:  "

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""
"BalÃ­k sa nenaÅ¡iel vo vyrovnÃ¡vacej pamÃ¤ti, vyÄistite vyrovnÃ¡vaciu pamÃ¤Å¥ "
"do                                  Obnovte ju."

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr "Importovanie oprÃ¡v kanÃ¡lov"

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr "Importovanie %s oprÃ¡v pre kanÃ¡l %s."

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr "CHYBA: server.bod_pripojenia nie je nastavenÃ½ v konfiguraÄnom sÃºbore"

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr "CHYBA: server.bod_pripojenia %s neexistuje"

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr "CHYBA: cesta pod server.bod_pripojenia (%s)  neexistuje"

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr "PrÃ­kazovÃ½ riadok: %s"

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""
"IBA LADIÅ¤: max. veÄ¾kosÅ¥-dÃ¡vky pre spracovanie XML/database-import (1..%s). "
"Viac informÃ¡ciÃ­ v \"man satellite-sync\"."

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr "alternatÃ­vny SSL CA certifikÃ¡t (ÃºplnÃ¡ cesta k certifikaÄnÃ©mu sÃºboru)"

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr "spracovaÅ¥ dÃ¡ta iba pre tento kanÃ¡l"

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""
"vÃ½pis disku sa bude povaÅ¾ovaÅ¥ za ÃºplnÃ½ export; ÄalÅ¡ie informÃ¡cie nÃ¡jdete v "
"\"man satellite-sync\"."

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""
"existujÃºce vlastnÃ© kanÃ¡ly budÃº tieÅ¾ synchronizovanÃ© (pokiaÄ¾ sa nepouÅ¾ije -c)"

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""
"prepÃ­saÅ¥ nastavenie Ãºrovne ladenia v /etc/rhn/rhn.conf (ktorÃ© je momentÃ¡lne "
"nastavenÃ© na %s)."

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr "poÅ¾adovanÃ¡ verzia vÃ½pisu XML (predvolenÃ©: %s)"

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr "poslaÅ¥ e-mailom sprÃ¡vu o tom, Äo bolo synchronizovanÃ©/importovanÃ©"

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr "nÃºtene spracovaÅ¥ vÅ¡etky (nie odliÅ¡nÃ©) metadÃ¡ta oprÃ¡v"

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr "Za Å¾iadnych okolnostÃ­ nepouÅ¾iÅ¥ http proxy."

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr "alternatÃ­vne http proxy (nÃ¡zov_hostiteÄ¾a:port)"

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr "pouÅ¾Ã­vateÄ¾skÃ© meno alternatÃ­vneho http proxy"

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr "heslo alternatÃ­vneho http proxy"

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr "rodiÄovskÃ½ SUSE Manager, z ktorÃ©ho sa mÃ¡ importovaÅ¥ obsah"

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr "vypÃ­saÅ¥ zoznam vÅ¡etkÃ½ch dostupnÃ½ch kanÃ¡lov a ukonÄiÅ¥"

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr "pomocnÃ­k pri vÅ¡etkÃ½ch chybovÃ½ch kÃ³doch, ktorÃ© vracia mgr-inter-sync"

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr "zdrojovÃ½ bod pripojenia pre import - iba aktualizÃ¡cia disku"

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr "nespracovÃ¡vaÅ¥ dÃ¡ta oprÃ¡v"

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr "nespracovÃ¡vaÅ¥ dÃ¡ta kickstart (iba poskytovanie)"

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr "nespracovÃ¡vaÅ¥ ÃºplnÃ© metadÃ¡ta balÃ­kov"

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr "nesÅ¥ahovaÅ¥ ani nespracovÃ¡vaÅ¥ Å¾iadne RPM"

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr "vypnÃºÅ¥ SSL (neodporÃºÄa sa)"

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""
"organizÃ¡cia, do ktorej synchronizÃ¡cia importuje dÃ¡ta. predvolenÃ© nastavenia "
"pre ÃºÄet administrÃ¡tora"

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr "vytlaÄiÅ¥ konfigurÃ¡ciu a ukonÄiÅ¥"

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr "alternatÃ­vny server, s ktorÃ½m sa moÅ¾no spojiÅ¥ (nÃ¡zov hostiteÄ¾a)"

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr "synchronizovaÅ¥ s tÃ½mto krokom (viac informÃ¡ciÃ­ v man satellite-sync)"

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""
"zapÃ­saÅ¥ kompletnÃ© dÃ¡ta do doÄasnÃ©ho sÃºboru pred streamovanÃ­m do zvyÅ¡ku "
"aplikÃ¡cie"

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr "IBA LADIÅ¤: alternatÃ­vna cesta k digitÃ¡lnemu systÃ©movÃ©mu id"

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""
"alternatÃ­vne emailovÃ© adresa(y) pre synchronizovanÃ½ vÃ½stup (voÄ¾ba --email)"

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr "neodstraÅˆovaÅ¥ rpm pri importe z lokÃ¡lneho vÃ½pisu"

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""
"plne kvalifikovanÃ½ nÃ¡zov domÃ©ny hlavnÃ©ho Satellite. PlatnÃ© iba s --mount-"
"point. VyÅ¾aduje sa, ak chcete importovaÅ¥ dÃ¡ta organizÃ¡cie a oprÃ¡vnenia "
"kanÃ¡lov."

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""
"CHYBA: tieto argumenty nedÃ¡vajÃº v tejto sÃºvislosti Å¾iadny zmysel (skÃºste --"
"help): %s"

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr "ERROR: NedÃ¡ sa pripojiÅ¥ k databÃ¡ze: %s"

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr "CHYBA: Skontrolujte, Äi je vaÅ¡a databÃ¡za spustenÃ¡."

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr "CHYBA: --debug-level vezme celÃ© ÄÃ­slo v rozsahu %s."

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr "  0  - mÃ¡lo zaznamenÃ¡vania/odosielania sprÃ¡v."

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr "  1  - minimÃ¡lne zaznamenÃ¡vanie/odosielanie sprÃ¡v."

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr "  2  - normÃ¡lna ÃºroveÅˆ zaznamenÃ¡vania/odosielania sprÃ¡v."

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr "  3  - veÄ¾a zaznamenÃ¡vania/odosielania sprÃ¡v."

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr "  4+ - nadmernÃ© zaznamenÃ¡vanie/odosielanie sprÃ¡v."

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr "CHYBA: VoÄ¾ba --master je platnÃ¡ iba s voÄ¾bou --mount-point"

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr "CHYBA: Nepodarilo sa nÃ¡jsÅ¥ Org Id %s"

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""
"UPOZORNENIE: VoÄ¾ba --list-channels prepÃ­Å¡e akÃºkoÄ¾vek voÄ¾bu --step. --step "
"ignorovanÃ©."

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""
"CHYBA: '%s' nie je platnÃ½ krok. ÄŽalÅ¡ie informÃ¡cie nÃ¡jdete v 'man mgr-inter-"
"sync'."

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""
"CHYBA: MomentÃ¡lne nie sÃº importovanÃ© Å¾iadne kanÃ¡ly; skÃºste mgr-inter-sync --"
"list-channels; potom mgr-inter-sync -c chn0 -c chn1..."

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr "CHYBA: --batch-size musÃ­ maÅ¥ hodnotu v rozsahu: 1..50"

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr "CHYBA: adresÃ¡r %s neexistuje"

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr "ChybovÃ© kÃ³dy: VrÃ¡tenÃ© kÃ³dy znamenajÃº:"

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""
" -1  - Nepodarilo sa zamknÃºÅ¥ sÃºbor alebo PreruÅ¡enieKlÃ¡vesnice alebo "
"UkonÄenieSystÃ©m"

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr "  0  - PouÅ¾Ã­vateÄ¾ preruÅ¡il alebo Ãºmyselne ukonÄil"

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr "  1  - pokus o spustenie viac ako jednej inÅ¡tancie mgr-inter-sync."

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr "  2  - Nepodarilo sa nÃ¡jsÅ¥ synchronizaÄnÃ© nÃ¡stroje."

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr "  3  - vyskytla sa vÅ¡eobecnÃ¡ vÃ½nimka soketu"

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr "  4  - vyskytla sa chyba SSL. Prekontrolujte svoje nastavenia SSL."

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr "  5  - chyba ISS"

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr "  6  - vyskytla sa neoÅ¡etrenÃ¡ vÃ½nimka"

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr "  7  - neznÃ¡ma chyba synchronizÃ¡cie"

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr "  8  - CHYBA: na vykonanie musÃ­ byÅ¥ sprÃ¡vca systÃ©mu"

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr "  9  - zlyhanie rpclib poÄas inicializÃ¡cie synchronizÃ¡cie"

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr "  10 - chyba inicializÃ¡cie synchronizÃ¡cie"

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr "  11 - Chyba analÃ½zy prÃºdu XML"

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr "  12 - KanÃ¡l neexistuje"

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr "  13 - Chyba SQL poÄas importovania metadÃ¡t balÃ­ka"

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr "  14 - Chyba SQL poÄas prepÃ¡jania balÃ­kov kanÃ¡lov"

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr "  15 - chyba SQL poÄas spracovania xml"

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr "  16 - server.bod_pripojenia nie je nastavenÃ© v konfiguraÄnom sÃºbore"

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""
"  17 - chyba SQL poÄas zÃ­skavania kanÃ¡lov uÅ¾ importovanÃ½ch v databÃ¡ze SUSE "
"Manager"

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr "  18 - NesprÃ¡vny reÅ¥azec pripojenia db v rhn.conf"

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr "  19 - ZlÃ© argumenty"

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr "  20 - Nepodarilo sa pripojiÅ¥ k db."

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr "  21 - ZlÃ¡ ÃºroveÅˆ ladenia"

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr "  22 - NeplatnÃ½ krok"

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr "  24 - sÃºbor neexistuje"

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr "  25 - adresÃ¡r neexistuje"

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr "  26 - bod_pripojenia neexistuje"

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr "  27 - OrganizÃ¡cia neexistuje"

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr "  28 - chyba: --master je platnÃ© iba s --mount-point"

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr "CHYBA: neznÃ¡ma verzia vÃ½pisu, vyskÃºÅ¡ajte jeden z %s"

#~ msgid "Your system was not found in the RHN database"
#~ msgstr "VÃ¡Å¡ systÃ©m sa nenaÅ¡iel v databÃ¡ze RHN"

#~ msgid "ISS is disabled on this satellite."
#~ msgstr "Na tomto satellite je ISS zakÃ¡zanÃ©."

#~ msgid "Spacewalk Proxy service not enabled for server profile: \"%s\""
#~ msgstr "SluÅ¾ba Spacewalk Proxy nie je povolenÃ¡ pre profil servera: \"%s\""

#~ msgid "Red Hat Satellite Welcome Message"
#~ msgstr "UvÃ­tacia sprÃ¡va Red Hat Satellite"

#~ msgid "Red Hat Satellite Privacy Statement"
#~ msgstr "VyhlÃ¡senie o ochrane sÃºkromia Red Hat Satellite"

#~ msgid ""
#~ "ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
#~ "supported.\n"
#~ "Please use the cdn-sync command instead unless you are attempting to sync "
#~ "from another Satellite via Inter-Satelite-Sync (ISS), or from local "
#~ "content on disk via Channel Dump ISOs."
#~ msgstr ""
#~ "CHYBA: SynchronizÃ¡cia Å¾ivÃ©ho obsahu so serverom RHN Classic Hosted uÅ¾ nie "
#~ "je podporovanÃ¡.\n"
#~ "Namiesto toho pouÅ¾ite prÃ­kaz cdn-sync, pokiaÄ¾ sa nepokÃºÅ¡ate "
#~ "synchronizovaÅ¥ s ÄalÅ¡Ã­m Satellite cez Inter-Satelite-Sync (ISS) alebo s "
#~ "lokÃ¡lnym obsahom na disku cez Channel Dump ISO."

#~ msgid ""
#~ "ERROR: '%s' is not a valid step. See 'man satellite-sync' for more detail."
#~ msgstr ""
#~ "CHYBA: '%s' nie je platnÃ½ krok. ÄŽalÅ¡ie informÃ¡cie nÃ¡jdete v 'man "
#~ "satellite-sync'."
  0707010000008B000081B40000000000000000000000015FBBE8EE0000B64C000000000000000000000000000000000000001B00000000spacewalk-backend/po/sl.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Rok Papez <rok.papez@lugos.si>, 2004.
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: sl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
"%100==4 ? 2 : 3)\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
0707010000008C000081B40000000000000000000000015FBBE8EE0000B5E5000000000000000000000000000000000000003200000000spacewalk-backend/po/spacewalk-backend-server.pot # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
   0707010000008D000081B40000000000000000000000015FBBE8EE0000B61F000000000000000000000000000000000000001B00000000spacewalk-backend/po/sq.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Albanian (http://www.transifex.com/projects/p/fedora/language/"
"sq/)\n"
"Language: sq\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
 0707010000008E000081B40000000000000000000000015FBBE8EE0000B651000000000000000000000000000000000000001B00000000spacewalk-backend/po/sr.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Serbian <trans-sr@lists.fedoraproject.org>\n"
"Language: sr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
   0707010000008F000081B40000000000000000000000015FBBE8EE0000E3B6000000000000000000000000000000000000001B00000000spacewalk-backend/po/sv.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Christian Rose <menthos@menthos.com>, 2002-2005.
# GÃ¶ran Uddeborg <goeran@uddeborg.se>, 2012.
# Magnus Larsson <fedoratrans@gmail.com>, 2006-2007.
# Miroslav SuchÃ½ <msuchy@redhat.com>, 2011.
# Jiri Dostal <jdostal@redhat.com>, 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2018-03-16 10:54+0000\n"
"Last-Translator: Copied by Zanata <copied-by-zanata@zanata.org>\n"
"Language-Team: Swedish (http://www.transifex.com/projects/p/fedora/language/"
"sv/)\n"
"Language: sv\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Zanata 4.6.2\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr "ofullstÃ¤ndig proxy-autenticeringsnyckel: %s"

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr "Skickad proxy-signatur %s stÃ¤mmer inte med vÃ¥ran %s."

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr "nekad proxy-autenticering"

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr "Ogiltig begÃ¤ran mottagen (%s)."

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""
"VIKTIGT MEDDELANDE FÃ–LJER:\n"
"%s"

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""
"NÃ¤r \"%s\" kÃ¶rdes: fÃ¥ngade\n"
"%s : %s\n"

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr "Ogiltig URI %s"

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""
"\n"
"                   %s-kontot har avaktiverats pÃ¥ denna server.\n"
"                   Kontakta din organisationsadministratÃ¶r fÃ¶r mer hjÃ¤lp."

#: ../server/handlers/applet/applet.py:78
#, fuzzy, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr "Ditt system fanns inte i RHN-databasen"

#: ../server/handlers/sat/auth.py:45
#, fuzzy
msgid "ISS is disabled on this server."
msgstr "ISS Ã¤r inaktiverat pÃ¥ denna satellit."

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr "Servern \"%s\" har inte ISS aktiverat."

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr "Ett paketnamn fÃ¶rvÃ¤ntades, inte: %s"

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr "Ett paket fÃ¶rvÃ¤ntades, inte: %s"

#: ../server/handlers/xmlrpc/proxy.py:65
#, fuzzy, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr "RHN-proxy-tjÃ¤nst inte aktiverat fÃ¶r serverprofilen: \"%s\""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr "Ogiltig sessionsnyckel"

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr "Denna server-ID finns inte lÃ¤ngre"

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr "Otiltig typ pÃ¥ Ã¥tgÃ¤rsvÃ¤rde %s (%s)"

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr "Ã…tgÃ¤rd %s hÃ¶r inte till server %s"

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr "NÃ¶dvÃ¤ndiga data saknas"

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr "NÃ¶dvÃ¤ndiga medlemmar saknas"

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr "FÃ¶rsÃ¶k att registrera ett system med ett ogiltigt anvÃ¤ndarnamn"

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr "Ogiltig systemutgÃ¥veversion begÃ¤rd"

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
#, fuzzy
msgid "Privacy Statement"
msgstr "Red Hat Network integritetspolicy"

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr "FÃ¶rvÃ¤ntade ett lexikon som ett produktargument"

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr "Ogiltigt vÃ¤rde \"%s\" pÃ¥ %s (%s)"

#: ../server/handlers/xmlrpc/scap.py:104
#, fuzzy
msgid "Invalid system_id/action_id pair."
msgstr "Ogiltiga systemrÃ¤ttigheter."

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr "Ogiltigt vÃ¤rde %s (%s)"

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr "Du har inte rÃ¤ttigheter att hantera paket i den tomma organisationen"

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr "Du har inte tillÃ¥telse att hantera paket i organisationen %s"

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr "Du har inte tillÃ¥telse att utfÃ¶ra administrativa uppgifter"

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""
"Du har inte tillÃ¥telse att hantera kanal %s, eller sÃ¥ finns inte kanalen"

#: ../server/importlib/userAuth.py:204
#, fuzzy, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""
"\n"
"                   %s-kontot har avaktiverats pÃ¥ denna server.\n"
"                   Kontakta din organisationsadministratÃ¶r fÃ¶r mer hjÃ¤lp."

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""
"Ditt konto har inte tillgÃ¥ng till nÃ¥gra kanaler som stÃ¤mmer "
"(utgÃ¥va='%(release)s', ark='%(arch)s')%(www_activation)s"

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""
"\n"
"Om du har ett registreringsnummer, registrera det fÃ¶rst pÃ¥ http://www.redhat."
"com/apps/activate/ och fÃ¶rsÃ¶k sedan igen.\n"
"\n"

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr "OfullstÃ¤ndiga prenumerationsrÃ¤ttigheter fÃ¶r utgÃ¥van (%s, %s"

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr "Systemet registrerat men inaktivt"

#: ../server/rhnChannel.py:2277
#, fuzzy, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""
"\n"
"Ogiltig kombination av arkitektur och OS-utgÃ¥va (%s, %s).\n"
"Ditt system har registrerats, men kommer inte fÃ¥ nÃ¥gra uppdateringar\n"
"eftersom det inte prenumererar pÃ¥ nÃ¥gon kanal.  Om du Ã¤nnu inte\n"
"aktiverat din produkt fÃ¶r drift, besÃ¶k vÃ¥r webbsida pÃ¥:\n"
"  \n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"â€¦ fÃ¶r att aktivera din produkt."

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""
"\n"
"Ogiltig kombination av arkitektur och OS-utgÃ¥va (%s, %s).\n"
"Ditt system har registrerats, men kommer inte fÃ¥ nÃ¥gra uppdateringar\n"
"eftersom det inte kunde prenumerera pÃ¥ nÃ¥gon baskanal.\n"
"Kontakta din organisationsadministratÃ¶r fÃ¶r assistans.\n"

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""
"\n"
"  Detta system har nu kunnat registreras, men har Ã¤nnu inte rÃ¤ttigheter fÃ¶r\n"
"  drift.  FÃ¶r att ge detta system driftsrÃ¤ttigheter, logga in pÃ¥ webbsajten "
"pÃ¥:\n"
"\n"
"  %(entitlement_url)s\n"

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""
"\n"
"  Detta system har nu kunnat registreras, men inga driftsrÃ¤ttigheter fanns\n"
"  tillgÃ¤ngliga.  FÃ¶r att ge detta system driftsrÃ¤ttigheter, logga in pÃ¥\n"
"  webbsajten pÃ¥:\n"
"\n"
"  %(entitlement_url)s\n"

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr "Drift ej aktiverat fÃ¶r systemprofilen: \"%s\""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr "Ogiltigt RPM-paket %s begÃ¤rt"

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr "Paketet finns inte"

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr "Arkitekturen \"%s\" stÃ¶ds inte"

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr "Nyckeln \"%s\" har mer Ã¤n en baskanal tilldelad"

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr "Baskanaler i konflikt"

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr "Kunde inte lÃ¤gga till en server till gruppen %s"

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr "Maximalt antal anvÃ¤ndingar pÃ¥ %s uppnÃ¥tt"

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""
"Att lÃ¤gga samman omregistreringsnycklar med olika baskanalrÃ¤ttigheter stÃ¶ds "
"inte"

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr "Nyckeln \"%s\" finns inte"

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr "Nycklar frÃ¥n organisationer som inte stÃ¤mmer Ã¶verens"

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr "Kickstart-sessioner stÃ¤mmer inte Ã¶verens"

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr "Att lÃ¤gga samman omregistreringsnycklar stÃ¶ds inte"

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr "Ogiltigt anvÃ¤ndarnamn/lÃ¶senords-kombination"

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr "AnvÃ¤ndarnamnet \"%s\" har inte reserverats"

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr "E-postadress inte angiven"

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr "anvÃ¤ndarnamn skall vara Ã¥tminstone %d tecken"

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr "anvÃ¤ndarman skall vara mindre Ã¤n %d tecken"

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr "anvÃ¤ndarnamn = \"%s\", otiltigt tecken \"%s\""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr "BegrÃ¤nsa din e-postadress till %s tecken"

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr "lÃ¶senord mÃ¥ste vara Ã¥tminstone %d tecken"

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr "LÃ¶senord mÃ¥ste vara kortare Ã¤n %d tecken"

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr "lÃ¶senordet innehÃ¥ller tecknet \"%s\""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr "anvÃ¤ndarnamn skall vara Ã¥tminstone %d tecken lÃ¥nga"

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr "Det gÃ¥r inte att registrera anvÃ¤ndarnamn som slutar med %s"

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr "Detta tycks inte vara ett giltigt anvÃ¤ndarnamn."

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr "Ogiltig kombination av anvÃ¤ndarnamn och lÃ¶senord."

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr "Denna inloggning Ã¤r redan tagen, eller sÃ¥ Ã¤r lÃ¶senordet felaktigt."

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr "Ã…tkomst nekas."

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr "Objektet finns inte."

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr "Ogiltig digital ID fÃ¶r system."

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr "Ogiltiga systemrÃ¤ttigheter."

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr "Det gick inte att hÃ¤mta anvÃ¤ndardata frÃ¥n databasen."

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr "Giltigt anvÃ¤ndarnamn krÃ¤vs."

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr "Giltigt lÃ¶senord krÃ¤vs."

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr "MinimigrÃ¤nsen pÃ¥ anvÃ¤ndarnamn bruten."

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr "MinimigrÃ¤nsen pÃ¥ lÃ¶senordslÃ¤ngt bruten."

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr "AnvÃ¤ndarnamnet innehÃ¥ller otillÃ¥tna tecken."

#: ../common/rhnException.py:66
msgid "File not found."
msgstr "Filen finns inte."

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr "Kombinationen av arkitektur och OS-utgÃ¥va stÃ¶ds inte."

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr "Det gick inte att hÃ¤mta systemdata frÃ¥n databasen."

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr "Ogiltigt argument skickad till funktionen."

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr "Det gÃ¥r inte att hÃ¤mta den begÃ¤rda posten."

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr "Det gick inte att uppdatera databasposten."

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr "Ej stÃ¶dd serverarkitektur."

#: ../common/rhnException.py:73
#, fuzzy, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""
"\n"
"     Den anonyma serverfunktionen Ã¤r inte tillgÃ¤nglig lÃ¤ngre.\n"
"\n"
"     Registrera om detta system genom att kÃ¶ra rhn_register (eller\n"
"     up2date --register pÃ¥ Red Hat Enterprise Linux 3+) som root.\n"
"     BesÃ¶k https://%(hostname)s/rhn/systems/SystemEntitlements.do eller\n"
"     logga in pÃ¥ https://%(hostname)s, och frÃ¥n fliken \"Overview\", vÃ¤lj\n"
"     \"Subscription Management\" fÃ¶r att aktivera RHN-tjÃ¤nsten fÃ¶r detta "
"system.\n"
"     "

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr "Posten inte tillgÃ¤nglig i databasen."

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr "Ogiltigt vÃ¤rde pÃ¥ post."

#: ../common/rhnException.py:83
#, fuzzy, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""
"\n"
"     Detta system har inte en giltiga driftsrÃ¤ttigheter fÃ¶r Red Hat "
"Network.\n"
"     BesÃ¶k https://%(hostname)s/rhn/systems/SystemEntitlements.do eller\n"
"     logga in pÃ¥ https://%(hostname)s, och frÃ¥n fliken \"Overview\", vÃ¤lj\n"
"     \"Subscription Management\" fÃ¶r att aktivera RHN-tjÃ¤nsten fÃ¶r detta "
"system.\n"
"     "

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr "Kanalfel"

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr "Klientsessionsnyckeln Ã¤r ogiltig."

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr "Klientsessionsnyckeln har gÃ¥tt ut."

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr "Du har inte rÃ¤ttigheter att hÃ¤mta det begÃ¤rda objektet."

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr "Ogiltig Ã¥tgÃ¤rd"

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr "Du har inte rÃ¤tt att utfÃ¶ra administrativa Ã¥tgÃ¤rder pÃ¥ detta system."

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr "Systemet prenumererar redan pÃ¥ den angivna kanalen."

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr "Systemet prenumererar fÃ¶r nÃ¤rvarande inte pÃ¥ den angivna kanalen."

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr "Den angivna kanalen finns inte."

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr "Ogiltig kanalversion."

#: ../common/rhnException.py:100
#, fuzzy
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""
"\n"
"     BegrÃ¤nsningen pÃ¥ medlemskap i anvÃ¤ndargrupper Ã¶verskriden.\n"
"\n"
"     De nuvarande instÃ¤llningarna fÃ¶r ditt konto tillÃ¥ter inte att du "
"lÃ¤gger\n"
"     till ett ytterligare anvÃ¤ndarkonto.  Kontrollera med organisationens\n"
"     administratÃ¶r fÃ¶r ditt konto om det maximala antalet anvÃ¤ndare som fÃ¥r\n"
"     prenumerera pÃ¥ RHN behÃ¶ver Ã¤ndras.\n"
"     "

#: ../common/rhnException.py:108
#, fuzzy
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""
"\n"
"     BegrÃ¤nsningen pÃ¥ medlemskap i sysmgrupper Ã¶verskriden.\n"
"\n"
"     De nuvarande instÃ¤llningarna fÃ¶r ditt konto tillÃ¥ter inte att du "
"lÃ¤gger\n"
"     till en ytterligare systemprofil.  Kontrollera med organisationens\n"
"     administratÃ¶r fÃ¶r ditt konto fÃ¶r att Ã¤ndra det maximala antalet\n"
"     systemprofiler som kan prenumerera pÃ¥ ditt RHN-konto.\n"
"     "

#: ../common/rhnException.py:116
#, fuzzy
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""
"\n"
"     Ogiltig arkitektur.\n"
"\n"
"     Paketets arkitektur stÃ¶ds inte av Red Hat Network\n"
"     "

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr "Ogiltigt RPM-huvud"

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr "Ogiltig information skickad till servern"

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr "Fel nÃ¤r konfiguration av nÃ¤tverksgrÃ¤nssnitt skickades."

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""
"\n"
"     Det gick inte att skicka paket fÃ¶r att regeln om unika paket brÃ¶ts.\n"
"     Se till att paketet inte har nÃ¥gra dubblerade beroenden eller redan\n"
"     rinns pÃ¥ servern\n"
"     "

#: ../common/rhnException.py:134
#, fuzzy
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""
"\n"
"     Flaggan --force till rhnpush Ã¤r avstÃ¤ngt pÃ¥ denna server.\n"
"     Kontakta din satellitadministratÃ¶r fÃ¶r mer hjÃ¤lp.\n"
"     "

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""
"\n"
"     Den angivna aktiveringsnyckeln fanns inte pÃ¥ servern.  FÃ¶rsÃ¶k igen med\n"
"     en giltig nyckel.\n"
"     "

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr "FÃ¶r mÃ¥nga system registrerade med denna registreringsnyckel"

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""
"Nyckeln innehÃ¥ller ogiltiga, fÃ¶rÃ¥ldrade eller ofullstÃ¤ndiga instÃ¤llningar"

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr "Konflikt mellan aktiveringsnycklar"

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""
"\n"
"     Du har inte rÃ¤ttigheter att prenumerera pÃ¥ den angivna kanalen.\n"
"     Kontakta din organisations kanal- eller organisationsadministratÃ¶rer\n"
"     fÃ¶r ytterligare detaljer.\n"
"     "

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr "Du kan inte avsluta prenumererationen pÃ¥ baskanalen."

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr "Ett fel uppstod vid fÃ¶rsÃ¶k att lÃ¤gga till systemet till dess grupper"

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr "Kan inte ge systemet driftsrÃ¤ttigheter"

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr "Maximal lÃ¤ngd pÃ¥ e-post Ã¶verskriden."

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr "Detta system har registrerats tidigare."

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr "Ogiltigt anvÃ¤ndarnamn"

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr "Kan inte slÃ¥ upp servern"

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr "NÃ¶dvÃ¤ndigt argument saknas"

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr "Ingen driftsrÃ¤ttighetsinformation bunden till hÃ¥rdvaran"

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr "Installationsnumret ger inte driftsrÃ¤ttigheter"

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr "Maximal lÃ¤ngd pÃ¥ anvÃ¤ndarnamn Ã¶verskriden"

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr "Maximal lÃ¤ngd pÃ¥ lÃ¶senord Ã¶verskriden"

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
#, fuzzy
msgid "System Name cannot be less than 1 character"
msgstr "anvÃ¤ndarman skall vara mindre Ã¤n %d tecken"

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
#, fuzzy
msgid "SUSE Manager Proxy error."
msgstr "RHN-proxyfel."

#: ../common/rhnException.py:191
#, fuzzy
msgid "SUSE Manager Proxy unable to login."
msgstr "Kan inte logga in pÃ¥ RHN-proxy."

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
#, fuzzy
msgid "SUSE Manager Proxy session token is invalid."
msgstr "RHN-proxysessionsnyckeln Ã¤r ogiltig."

#: ../common/rhnException.py:198
#, fuzzy
msgid "SUSE Manager Proxy session token has expired."
msgstr "RHN-proxysessionsnyckeln har gÃ¥tt ut."

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
#, fuzzy
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""
"\n"
"     Att skapa anvÃ¤ndare pÃ¥ RHN-satelliten Ã¤r inte tillÃ¥tet via "
"rhn_register\n"
"     (eller up2date --register pÃ¥ Red Hat Enterprise Linux 3 och senare);\n"
"     kontakta din systemadministratÃ¶r fÃ¶r att fÃ¥ ditt konto skapat.\n"
"     "

#: ../common/rhnException.py:206
#, fuzzy
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""
"\n"
"     Denna satellitserver fÃ¥r inte anvÃ¤nda Inter Satellite Sync pÃ¥ denna "
"satellit\n"
"     "

#: ../common/rhnException.py:209
#, fuzzy
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""
"\n"
"     Inter Satellite Sync Ã¤r avslaged pÃ¥ dena satellit.\n"
"     "

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr "Ogiltig datatyp skickad"

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr "Kan inte hÃ¤mta kanalen"

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr "Kan inte hÃ¤mta paketet"

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr "Kan inte hÃ¤mta erratan"

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr "Filen saknas"

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr "Fel nÃ¤r funktion hÃ¤mtades"

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr "Fel nÃ¤r funktion kÃ¶rdes"

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr "VersionsstrÃ¤ng saknas"

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr "Ogiltig versionsstrÃ¤ng"

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr "Versioner stÃ¤mmer inte"

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr "Ogiltig kanalversion"

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr "Ingen comps-fil fÃ¶r kanalen"

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr "Kan inte hÃ¤mta comps-filen"

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr "KonfigurationsÃ¥tgÃ¤rd saknas"

#: ../common/rhnException.py:230
msgid "File too large"
msgstr "Filen Ã¤r fÃ¶r stor"

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr "Filen innehÃ¥ller binÃ¤rdata"

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr "Konfigurationskanalen Ã¤r inte tom"

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr "RÃ¤ttighetsfel"

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr "InnehÃ¥ll saknas fÃ¶r konfigurationsfilen"

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr "MallavgrÃ¤nsare inte angivna"

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr "Konfigurationskanalen finns inte"

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr "Konfigurationskanalen finns redan"

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr "Fil saknas i konfigurationskanalen"

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr "Olika versioner av denna fil Ã¤r skickade"

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr "Filen Ã¤r redan skickad till konfigurationskanalen"

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr "Filen Ã¶verskrider Ã¥terstÃ¥ende utrymmeskvota"

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr "FullstÃ¤ndig sÃ¶kvÃ¤g till filen mÃ¥ste anges"

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr "Ogiltigt revisionsnummer"

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr "Kan inte jÃ¤mfÃ¶ra filer med olika filtyp"

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
#, fuzzy
msgid "Invalid content encoding"
msgstr "Ogiltig elementkod"

#: ../common/rhnException.py:253
#, fuzzy
msgid "Invalid crash name"
msgstr "Ogiltigt paketnamn"

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
#, fuzzy
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""
"\n"
"     Ett fel uppstod nÃ¤r din begÃ¤ran behandlades.  Om detta problem "
"kvarstÃ¥r,\n"
"     fyll dÃ¥ i en felrapport pÃ¥ bugzilla.redhat.com.  Om du vÃ¤ljer att "
"skicka\n"
"     felrapporten, se dÃ¥ till att ta med detaljer om vad du fÃ¶rsÃ¶kte gÃ¶ra "
"nÃ¤r\n"
"     detta fel uppstod och detaljer om hur man Ã¥terupprepar problemet.\n"

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""
"Felmeddelande:\n"
"    %s\n"

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr "Felklasskod: %s\n"

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr "Felklassinformation: %s\n"

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr "FÃ¶rklaring: %s"

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, fuzzy, python-format
msgid "    Extinct package:  %s"
msgstr "Ett paket fÃ¶rvÃ¤ntades, inte: %s"

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
#, fuzzy
msgid "Linking packages to channels"
msgstr "Baskanaler i konflikt"

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
#, fuzzy
msgid "base-channels"
msgstr "Baskanaler i konflikt"

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, fuzzy, python-format
msgid "Unable to save file %s: %s"
msgstr "Kan inte ge systemet driftsrÃ¤ttigheter"

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
#, fuzzy
msgid "print the configuration and exit"
msgstr "Konfigurationskanalen finns inte"

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, fuzzy, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr "Kan inte slÃ¥ upp servern"

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
#, fuzzy
msgid "  12 - Channel do not exist"
msgstr "Den angivna kanalen finns inte."

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""

#~ msgid "Your system was not found in the RHN database"
#~ msgstr "Ditt system fanns inte i RHN-databasen"

#~ msgid "ISS is disabled on this satellite."
#~ msgstr "ISS Ã¤r inaktiverat pÃ¥ denna satellit."

#, fuzzy
#~ msgid "Spacewalk Proxy service not enabled for server profile: \"%s\""
#~ msgstr "RHN-proxy-tjÃ¤nst inte aktiverat fÃ¶r serverprofilen: \"%s\""

#, fuzzy
#~ msgid "Red Hat Satellite Welcome Message"
#~ msgstr "Red Hat Network vÃ¤lkomstmeddelande"

#, fuzzy
#~ msgid "Red Hat Satellite Privacy Statement"
#~ msgstr "Red Hat Network integritetspolicy"
  07070100000090000081B40000000000000000000000015FBBE8EE0000B682000000000000000000000000000000000000001B00000000spacewalk-backend/po/ta.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Felix <ifelix@redhat.com>, 2006, 2007.
# Jayaradha N <jaya@pune.redhat.com>, 2004.
# Jayaradha N <njaya@redhat.com>, 2004.
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Tamil <tamil-users@lists.fedoraproject.org>\n"
"Language: ta\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
  07070100000091000081B40000000000000000000000015FBBE8EE0000B67C000000000000000000000000000000000000001B00000000spacewalk-backend/po/te.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Krishna Babu K <kkrothap@redhat.com>, 2010.
# Sree Ganesh <sthottem@redhat.com>, 2006, 2007.
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Telugu (http://www.transifex.com/projects/p/fedora/language/"
"te/)\n"
"Language: te\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
07070100000092000081B40000000000000000000000015FBBE8EE0000B61C000000000000000000000000000000000000001B00000000spacewalk-backend/po/tg.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Tajik (http://www.transifex.com/projects/p/fedora/language/"
"tg/)\n"
"Language: tg\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
07070100000093000081B40000000000000000000000015FBBE8EE0000B644000000000000000000000000000000000000001B00000000spacewalk-backend/po/tr.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Ismail ASCI <ismail.asci@gmail.com>, 2006.
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Turkish (http://www.transifex.com/projects/p/fedora/language/"
"tr/)\n"
"Language: tr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
07070100000094000081B40000000000000000000000015FBBE8EE00010E50000000000000000000000000000000000000001B00000000spacewalk-backend/po/uk.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
#   <jonny_nut@hotmail.com>, 2012.
# Maxim Dziumanenko <dziumanenko@gmail.com>, 2003.
# Yuri Chornoivan <yurchor@ukr.net>, 2012.
# Yuri Chornoivan <yurchor@ukr.net>, 2015. #zanata
# Yuri Chornoivan <yurchor@ukr.net>, 2016. #zanata
# Yuri Chornoivan <yurchor@ukr.net>, 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2018-03-16 12:50+0000\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <trans-uk@lists.fedoraproject.org>\n"
"Language: uk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Zanata 4.6.2\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr "Ð½ÐµÐ¿Ð¾Ð²Ð½Ð¸Ð¹ ÐºÐ»ÑŽÑ‡ Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ Ð½Ð° Ð¿Ñ€Ð¾ÐºÑÑ–: %s"

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr "ÐÐ°Ð´Ñ–ÑÐ»Ð°Ð½Ð¸Ð¹ â€‹â€‹Ð¿Ñ–Ð´Ð¿Ð¸Ñ Ð¿Ñ€Ð¾ÐºÑÑ– %s Ð½Ðµ Ð·Ð±Ñ–Ð³Ð°Ñ”Ñ‚ÑŒÑÑ Ð· Ð½Ð°ÑˆÐ¸Ð¼ %s."

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr "Ñƒ Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ð²Ð°Ð½Ð½Ñ– Ð½Ð° Ð¿Ñ€Ð¾ÐºÑÑ–-ÑÐµÑ€Ð²ÐµÑ€Ñ– Ð²Ñ–Ð´Ð¼Ð¾Ð²Ð»ÐµÐ½Ð¾"

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr "ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð¾ Ð½ÐµÐ¿Ñ€Ð¸Ð¿ÑƒÑÑ‚Ð¸Ð¼Ð¸Ð¹ Ð·Ð°Ð¿Ð¸Ñ‚ (%s)."

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""
"Ð”ÐÐ›Ð† Ð’ÐšÐÐ—ÐÐÐž Ð’ÐÐ–Ð›Ð˜Ð’Ð• ÐŸÐžÐ’Ð†Ð”ÐžÐœÐ›Ð•ÐÐÐ¯:\n"
"%s"

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""
"ÐŸÑ–Ð´ Ñ‡Ð°Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ Â«%sÂ» Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð¾\n"
"%s : %s\n"

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr "ÐÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð° Ð°Ð´Ñ€ÐµÑÐ° %s"

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""
"\n"
"                   ÐÐ° Ñ†ÑŒÐ¾Ð¼Ñƒ ÑÐµÑ€Ð²ÐµÑ€Ñ– Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð¾ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¸Ð¹ Ð·Ð°Ð¿Ð¸Ñ %s.\n"
"                   Ð©Ð¾Ð± Ð´Ñ–Ð·Ð½Ð°Ñ‚Ð¸ÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ, Ð±ÑƒÐ´ÑŒ Ð»Ð°ÑÐºÐ°, Ð·Ð²ÐµÑ€Ð½Ñ–Ñ‚ÑŒÑÑ Ð´Ð¾ "
"Ð°Ð´Ð¼Ñ–Ð½Ñ–ÑÑ‚Ñ€Ð°Ñ‚Ð¾Ñ€Ð° Ð²Ð°ÑˆÐ¾Ñ— Ð¾Ñ€Ð³Ð°Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ—."

#: ../server/handlers/applet/applet.py:78
#, fuzzy, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr "Ð’Ð°ÑˆÐ¾Ñ— ÑÐ¸ÑÑ‚ÐµÐ¼Ð¸ Ð½Ðµ Ð·Ð½Ð°Ð¹Ð´ÐµÐ½Ð¾ Ñƒ Ð±Ð°Ð·Ñ– Ð´Ð°Ð½Ð¸Ñ… RHN"

#: ../server/handlers/sat/auth.py:45
#, fuzzy
msgid "ISS is disabled on this server."
msgstr "ISS Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð¾ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ satellite."

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr "Ð¡ÐµÑ€Ð²ÐµÑ€ Â«%sÂ» Ð½Ðµ ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð¾ Ð´Ð»Ñ ISS."

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr "ÐœÐ°Ð»Ð¾ Ð±ÑƒÑ‚Ð¸ Ð²ÐºÐ°Ð·Ð°Ð½Ð¾ Ð½Ð°Ð·Ð²Ñƒ Ð¿Ð°ÐºÑƒÐ½ÐºÐ°, Ð° Ð½Ðµ: %s"

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr "ÐœÐ°Ð»Ð¾ Ð±ÑƒÑ‚Ð¸ Ð²ÐºÐ°Ð·Ð°Ð½Ð¾ Ð¿Ð°ÐºÑƒÐ½Ð¾Ðº, Ð° Ð½Ðµ: %s"

#: ../server/handlers/xmlrpc/proxy.py:65
#, fuzzy, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr "ÐŸÑ€Ð¾ÐºÑÑ–-ÑÐµÑ€Ð²Ñ–Ñ Spacewalk Ð½Ðµ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ð¹ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ„Ñ–Ð»ÑŽ ÑÐµÑ€Ð²ÐµÑ€Ð°: Â«%sÂ»"

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr "ÐÐµÐ¿Ñ€Ð¸Ð¿ÑƒÑÑ‚Ð¸Ð¼Ð¸Ð¹ ÐºÐ»ÑŽÑ‡ ÑÐµÐ°Ð½ÑÑƒ"

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr "Ð¦ÑŒÐ¾Ð³Ð¾ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ‚Ð¾Ñ€Ð° ÑÐµÑ€Ð²ÐµÑ€Ð° Ð±Ñ–Ð»ÑŒÑˆÐµ Ð½Ðµ Ñ–ÑÐ½ÑƒÑ”"

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr "ÐÐµÐ¿Ñ€Ð¸Ð¿ÑƒÑÑ‚Ð¸Ð¼Ðµ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ñ–Ñ— Ñ‚Ð¸Ð¿Ñƒ %s (%s)"

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr "Ð”Ñ–Ñ %s Ð½Ðµ Ð½Ð°Ð»ÐµÐ¶Ð¸Ñ‚ÑŒ Ð´Ð¾ ÑÐµÑ€Ð²ÐµÑ€Ð° %s"

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr "ÐÐµ Ð²Ð¸ÑÑ‚Ð°Ñ‡Ð°Ñ” Ð¿Ð¾Ñ‚Ñ€Ñ–Ð±Ð½Ð¸Ñ… Ð´Ð°Ð½Ð¸Ñ…"

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr "ÐÐµ Ð²Ð¸ÑÑ‚Ð°Ñ‡Ð°Ñ” Ð¿Ð¾Ñ‚Ñ€Ñ–Ð±Ð½Ð¸Ñ… ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚Ñ–Ð²"

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr "Ð¡Ð¿Ñ€Ð¾Ð±Ð° Ð·Ð°Ñ€ÐµÑ”ÑÑ‚Ñ€ÑƒÐ²Ð°Ñ‚Ð¸ ÑÐ¸ÑÑ‚ÐµÐ¼Ñƒ Ð½Ð° Ð½ÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ðµ Ñ–Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸ÑÑ‚ÑƒÐ²Ð°Ñ‡Ð°"

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr "ÐÐ°Ð´Ñ–ÑÐ»Ð°Ð½Ð¾ Ð·Ð°Ð¿Ð¸Ñ‚ Ñ‰Ð¾Ð´Ð¾ Ð½ÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¾Ñ— Ð²ÐµÑ€ÑÑ–Ñ— Ð²Ð¸Ð¿ÑƒÑÐºÑƒ ÑÐ¸ÑÑ‚ÐµÐ¼Ð¸"

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
#, fuzzy
msgid "Privacy Statement"
msgstr "Ð£Ð³Ð¾Ð´Ð° Ñ‰Ð¾Ð´Ð¾ ÐºÐ¾Ð½Ñ„Ñ–Ð´ÐµÐ½Ñ†Ñ–Ð¹Ð½Ð¾ÑÑ‚Ñ– Red Hat Satellite"

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr "ÐœÐ°Ð»Ð¾ Ð±ÑƒÑ‚Ð¸ Ð²ÐºÐ°Ð·Ð°Ð½Ð¾ ÑÐ»Ð¾Ð²Ð½Ð¸Ðº ÑÐº Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ñƒ"

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr "ÐÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ðµ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Â«%sÂ» Ð´Ð»Ñ %s (%s)"

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr "ÐÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð° Ð¿Ð°Ñ€Ð° Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ‚Ð¾Ñ€ ÑÐ¸ÑÑ‚ÐµÐ¼Ð¸/Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ‚Ð¾Ñ€ Ð´Ñ–Ñ—."

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr "ÐÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ðµ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %s (%s)"

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""
"Ð£ Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” ÑƒÐ¿Ð¾Ð²Ð½Ð¾Ð²Ð°Ð¶ÐµÐ½ÑŒ Ð½Ð° ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°ÐºÑƒÐ½ÐºÐ°Ð¼Ð¸ Ñƒ Ð¾Ñ€Ð³Ð°Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ— Ñ–Ð· Ð¿Ð¾Ñ€Ð¾Ð¶Ð½ÑŒÐ¾ÑŽ "
"Ð½Ð°Ð·Ð²Ð¾ÑŽ"

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr "Ð£ Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” Ð¿Ñ€Ð°Ð² Ð½Ð° ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°ÐºÑƒÐ½ÐºÐ°Ð¼Ð¸ Ñƒ Ð¾Ñ€Ð³Ð°Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ— %s"

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr "Ð’Ð¸ Ð½Ðµ Ð¼Ð°Ñ”Ñ‚Ðµ Ð¿Ñ€Ð°Ð²Ð° Ð²Ð¸ÐºÐ¾Ð½ÑƒÐ²Ð°Ñ‚Ð¸ Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð· Ð°Ð´Ð¼Ñ–Ð½Ñ–ÑÑ‚Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ"

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr "Ð£ Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” Ð¿Ñ€Ð°Ð²Ð° ÐºÐµÑ€ÑƒÐ²Ð°Ñ‚Ð¸ ÐºÐ°Ð½Ð°Ð»Ð¾Ð¼ %s Ð°Ð±Ð¾ Ñ†ÑŒÐ¾Ð³Ð¾ ÐºÐ°Ð½Ð°Ð»Ñƒ Ð½Ðµ Ñ–ÑÐ½ÑƒÑ”"

#: ../server/importlib/userAuth.py:204
#, fuzzy, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""
"\n"
"                   ÐÐ° Ñ†ÑŒÐ¾Ð¼Ñƒ ÑÐµÑ€Ð²ÐµÑ€Ñ– Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð¾ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¸Ð¹ Ð·Ð°Ð¿Ð¸Ñ %s.\n"
"                   Ð©Ð¾Ð± Ð´Ñ–Ð·Ð½Ð°Ñ‚Ð¸ÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ, Ð±ÑƒÐ´ÑŒ Ð»Ð°ÑÐºÐ°, Ð·Ð²ÐµÑ€Ð½Ñ–Ñ‚ÑŒÑÑ Ð´Ð¾ "
"Ð°Ð´Ð¼Ñ–Ð½Ñ–ÑÑ‚Ñ€Ð°Ñ‚Ð¾Ñ€Ð° Ð²Ð°ÑˆÐ¾Ñ— Ð¾Ñ€Ð³Ð°Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ—."

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""
"Ð’Ð°Ñˆ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¸Ð¹ Ð·Ð°Ð¿Ð¸Ñ Ð½Ðµ Ð¼Ð°Ñ” Ð´Ð¾ÑÑ‚ÑƒÐ¿Ñƒ Ð´Ð¾ Ð¶Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñ–Ð· Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ð¸Ñ… ÐºÐ°Ð½Ð°Ð»Ñ–Ð² "
"(Ð²Ð¸Ð¿ÑƒÑÐº=Â«%(release)sÂ», Ð°Ñ€Ñ…Ñ–Ñ‚ÐµÐºÑ‚ÑƒÑ€Ð°=Â«%(arch)sÂ»)%(www_activation)s"

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""
"\n"
"Ð¯ÐºÑ‰Ð¾ Ñƒ Ð²Ð°Ñ Ñ” Ñ€ÐµÑ”ÑÑ‚Ñ€Ð°Ñ†Ñ–Ð¹Ð½Ð¸Ð¹ Ð½Ð¾Ð¼ÐµÑ€, Ð±ÑƒÐ´ÑŒ Ð»Ð°ÑÐºÐ°, ÑÐ¿ÐµÑ€ÑˆÑƒ Ð·Ð°Ñ€ÐµÑ”ÑÑ‚Ñ€ÑƒÐ¹Ñ‚Ðµ Ð¹Ð¾Ð³Ð¾ Ð½Ð° "
"http://www.redhat.com/apps/activate/, Ð° Ð¿Ð¾Ñ‚Ñ–Ð¼ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ñ–Ñ‚ÑŒ ÑÐ¿Ñ€Ð¾Ð±Ñƒ.\n"
"\n"

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr "ÐÐµÐ´Ð¾ÑÑ‚Ð°Ñ‚Ð½Ñ– Ð¿Ñ€Ð°Ð²Ð° Ð¿ÐµÑ€ÐµÐ´Ð¿Ð»Ð°Ñ‚Ð¸ Ð½Ð° Ð²Ð¸Ð¿ÑƒÑÐº (%s, %s"

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr "Ð¡Ð¸ÑÑ‚ÐµÐ¼Ñƒ Ð·Ð°Ñ€ÐµÑ”ÑÑ‚Ñ€Ð¾Ð²Ð°Ð½Ð¾, Ð°Ð»Ðµ Ð½Ðµ Ð°ÐºÑ‚Ð¸Ð²Ð¾Ð²Ð°Ð½Ð¾"

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""
"\n"
"ÐÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð° ÐºÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ Ð°Ñ€Ñ…Ñ–Ñ‚ÐµÐºÑ‚ÑƒÑ€Ð¸ Ñ– Ð²Ð¸Ð¿ÑƒÑÐºÑƒ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ð¹Ð½Ð¾Ñ— ÑÐ¸ÑÑ‚ÐµÐ¼Ð¸ (%s, %s).\n"
"Ð’Ð°ÑˆÑƒ ÑÐ¸ÑÑ‚ÐµÐ¼Ñƒ Ð·Ð°Ñ€ÐµÑ”ÑÑ‚Ñ€Ð¾Ð²Ð°Ð½Ð¾, Ð°Ð»Ðµ Ð²Ð¾Ð½Ð° Ð½Ðµ Ð¾Ñ‚Ñ€Ð¸Ð¼ÑƒÐ²Ð°Ñ‚Ð¸Ð¼Ðµ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½ÑŒ, Ð¾ÑÐºÑ–Ð»ÑŒÐºÐ¸\n"
"Ñ—Ñ— Ð½Ðµ Ð¿Ñ–Ð´Ð¿Ð¸ÑÐ°Ð½Ð¾ Ð½Ð° ÐºÐ°Ð½Ð°Ð». Ð¯ÐºÑ‰Ð¾ Ð²Ð¸ Ñ‰Ðµ Ð½Ðµ Ð°ÐºÑ‚Ð¸Ð²ÑƒÐ²Ð°Ð»Ð¸ Ð²Ð°Ñˆ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚\n"
"Ð´Ð»Ñ Ð¾Ð±ÑÐ»ÑƒÐ³Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ, Ð±ÑƒÐ´ÑŒ Ð»Ð°ÑÐºÐ°, Ð²Ñ–Ð´Ð²Ñ–Ð´Ð°Ð¹Ñ‚Ðµ Ð½Ð°Ñˆ ÑÐ°Ð¹Ñ‚ Ð·Ð° Ð°Ð´Ñ€ÐµÑÐ¾ÑŽ:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...Ñ‰Ð¾Ð± Ð°ÐºÑ‚Ð¸Ð²ÑƒÐ²Ð°Ñ‚Ð¸ Ð²Ð°Ñˆ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚."

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""
"\n"
"ÐÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð° ÐºÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ Ð°Ñ€Ñ…Ñ–Ñ‚ÐµÐºÑ‚ÑƒÑ€Ð¸ Ñ– Ð²Ð¸Ð¿ÑƒÑÐºÑƒ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ð¹Ð½Ð¾Ñ— ÑÐ¸ÑÑ‚ÐµÐ¼Ð¸ (%s, %s).\n"
"Ð’Ð°ÑˆÑƒ ÑÐ¸ÑÑ‚ÐµÐ¼Ñƒ Ð·Ð°Ñ€ÐµÑ”ÑÑ‚Ñ€Ð¾Ð²Ð°Ð½Ð¾, Ð°Ð»Ðµ Ð²Ð¾Ð½Ð° Ð½Ðµ Ð¾Ñ‚Ñ€Ð¸Ð¼ÑƒÐ²Ð°Ñ‚Ð¸Ð¼Ðµ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½ÑŒ, Ð¾ÑÐºÑ–Ð»ÑŒÐºÐ¸\n"
"Ñ—Ñ— Ð½Ðµ Ð²Ð´Ð°Ð»Ð¾ÑÑ Ð¿Ñ–Ð´Ð¿Ð¸ÑÐ°Ñ‚Ð¸ Ð½Ð° Ð±Ð°Ð·Ð¾Ð²Ð¸Ð¹ ÐºÐ°Ð½Ð°Ð».\n"
"Ð‘ÑƒÐ´ÑŒ Ð»Ð°ÑÐºÐ°, Ð·Ð²â€™ÑÐ¶Ñ–Ñ‚ÑŒÑÑ Ñ–Ð· Ð°Ð´Ð¼Ñ–Ð½Ñ–ÑÑ‚Ñ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð¼ Ð²Ð°ÑˆÐ¾Ñ— Ð¾Ñ€Ð³Ð°Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ—, Ñ‰Ð¾Ð± Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ "
"Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ñƒ.\n"

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""
"\n"
"  Ð¦ÑŽ ÑÐ¸ÑÑ‚ÐµÐ¼Ñƒ ÑƒÑÐ¿Ñ–ÑˆÐ½Ð¾ Ð·Ð°Ñ€ÐµÑ”ÑÑ‚Ñ€Ð¾Ð²Ð°Ð½Ð¾, Ð°Ð»Ðµ Ñ—Ñ— Ñ‰Ðµ Ð½Ðµ Ð´Ð¾Ð¿ÑƒÑ‰ÐµÐ½Ð¾ Ð´Ð¾\n"
"  Ð¾Ð±ÑÐ»ÑƒÐ³Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ. Ð©Ð¾Ð± Ð´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ñ‚Ð¸ Ñ†ÑŽ ÑÐ¸ÑÑ‚ÐµÐ¼Ñƒ Ð´Ð¾ Ð¾Ð±ÑÐ»ÑƒÐ³Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ, ÑƒÐ²Ñ–Ð¹Ð´Ñ–Ñ‚ÑŒ Ð´Ð¾ "
"ÑÐ¸ÑÑ‚ÐµÐ¼Ð¸ Ð½Ð° Ñ†ÑŒÐ¾Ð¼Ñƒ ÑÐ°Ð¹Ñ‚Ñ–:\n"
"\n"
"  %(entitlement_url)s\n"

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""
"\n"
"  Ð¦ÑŽ ÑÐ¸ÑÑ‚ÐµÐ¼Ñƒ ÑƒÑÐ¿Ñ–ÑˆÐ½Ð¾ Ð·Ð°Ñ€ÐµÑ”ÑÑ‚Ñ€Ð¾Ð²Ð°Ð½Ð¾, Ð°Ð»Ðµ Ð½Ðµ Ð²Ð¸ÑÐ²Ð»ÐµÐ½Ð¾ Ð´Ð¾Ð¿ÑƒÑÐºÑ–Ð² Ð´Ð¾ "
"Ð¾Ð±ÑÐ»ÑƒÐ³Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ.\n"
"  Ð©Ð¾Ð± Ð´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ñ‚Ð¸ Ñ†ÑŽ ÑÐ¸ÑÑ‚ÐµÐ¼Ñƒ Ð´Ð¾ Ð¾Ð±ÑÐ»ÑƒÐ³Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ, ÑƒÐ²Ñ–Ð¹Ð´Ñ–Ñ‚ÑŒ Ð´Ð¾ ÑÐ¸ÑÑ‚ÐµÐ¼Ð¸ Ð½Ð° Ñ†ÑŒÐ¾Ð¼Ñƒ "
"ÑÐ°Ð¹Ñ‚Ñ–:\n"
"\n"
"  %(entitlement_url)s\n"

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""
"Ð‘ÑƒÐ´ÑŒ Ð»Ð°ÑÐºÐ°, Ð·Ð°Ð¿ÑƒÑÑ‚Ñ–Ñ‚ÑŒ Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— ÐºÐ»Ñ–Ñ”Ð½Ñ‚ÑÑŒÐºÐ¾Ñ— ÑÐ¸ÑÑ‚ÐµÐ¼Ð¸ rhn_register Ð²Ñ–Ð´ Ñ–Ð¼ÐµÐ½Ñ– "
"Ð°Ð´Ð¼Ñ–Ð½Ñ–ÑÑ‚Ñ€Ð°Ñ‚Ð¾Ñ€Ð° (root)"

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr "Ð¡Ð»ÑƒÐ¶Ð±Ñƒ Ð½Ðµ ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð¾ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ„Ñ–Ð»ÑŽ ÑÐ¸ÑÑ‚ÐµÐ¼Ð¸: Â«%sÂ»"

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr "ÐÐ°Ð´Ñ–ÑÐ»Ð°Ð½Ð¾ Ð·Ð°Ð¿Ð¸Ñ‚ Ñ‰Ð¾Ð´Ð¾ Ð½ÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¾Ð³Ð¾ Ð¿Ð°ÐºÑƒÐ½ÐºÐ° RPM %s"

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr "ÐŸÐ°ÐºÑƒÐ½Ð¾Ðº Ð½Ðµ Ð·Ð½Ð°Ð¹Ð´ÐµÐ½Ð¾"

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr "ÐŸÑ–Ð´Ñ‚Ñ€Ð¸Ð¼ÐºÐ¸ Ð°Ñ€Ñ…Ñ–Ñ‚ÐµÐºÑ‚ÑƒÑ€Ð¸ Â«%sÂ» Ð½Ðµ Ð¿ÐµÑ€ÐµÐ´Ð±Ð°Ñ‡ÐµÐ½Ð¾"

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr "Ð†Ð· ÐºÐ»ÑŽÑ‡ÐµÐ¼ Â«%sÂ» Ð¿Ð¾Ð²â€™ÑÐ·Ð°Ð½Ð¾ Ð´ÐµÐºÑ–Ð»ÑŒÐºÐ° Ð±Ð°Ð·Ð¾Ð²Ð¸Ñ… ÐºÐ°Ð½Ð°Ð»Ñ–Ð²"

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr "ÐšÐ¾Ð½Ñ„Ð»Ñ–ÐºÑ‚ Ð¾ÑÐ½Ð¾Ð²Ð½Ð¸Ñ… ÐºÐ°Ð½Ð°Ð»Ñ–Ð²"

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr "ÐÐµ Ð²Ð´Ð°Ð»Ð¾ÑÑ Ð´Ð¾Ð´Ð°Ñ‚Ð¸ ÑÐµÑ€Ð²ÐµÑ€ Ð´Ð¾ Ð³Ñ€ÑƒÐ¿Ð¸ %s"

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr "ÐŸÐµÑ€ÐµÐ²Ð¸Ñ‰ÐµÐ½Ð¾ Ð¼Ð°ÐºÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ñƒ ÐºÑ–Ð»ÑŒÐºÑ–ÑÑ‚ÑŒ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð¾ %s"

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""
"ÐŸÑ–Ð´Ñ‚Ñ€Ð¸Ð¼ÐºÐ¸ ÑÑ‚Ð¾ÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¸Ñ… Ñ€ÐµÑ”ÑÑ‚Ñ€Ð°Ñ†Ñ–Ð¹Ð½Ð¸Ñ… ÐºÐ»ÑŽÑ‡Ñ–Ð² Ñ–Ð· Ñ€Ñ–Ð·Ð½Ð¸Ð¼Ð¸ Ð±Ð°Ð·Ð¾Ð²Ð¸Ð¼Ð¸ "
"Ð¿Ñ€Ð¸Ð²â€™ÑÐ·ÐºÐ°Ð¼Ð¸ Ð½Ðµ Ð¿ÐµÑ€ÐµÐ´Ð±Ð°Ñ‡ÐµÐ½Ð¾"

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr "ÐÐµ Ð²Ð´Ð°Ð»Ð¾ÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ ÐºÐ»ÑŽÑ‡ Â«%sÂ»"

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr "ÐšÐ»ÑŽÑ‡Ñ– Ð· Ð½ÐµÐ²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ð¸Ñ… ÑƒÑÑ‚Ð°Ð½Ð¾Ð²"

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr "ÐÐµÐ²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ñ–ÑÑ‚ÑŒ ÑÐµÐ°Ð½ÑÑ–Ð² kickstart"

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr "ÐŸÑ–Ð´Ñ‚Ñ€Ð¸Ð¼ÐºÐ¸ ÑÑ‚Ð¾ÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¸Ñ… Ñ€ÐµÑ”ÑÑ‚Ñ€Ð°Ñ†Ñ–Ð¹Ð½Ð¸Ñ… ÐºÐ»ÑŽÑ‡Ñ–Ð² Ð½Ðµ Ð¿ÐµÑ€ÐµÐ´Ð±Ð°Ñ‡ÐµÐ½Ð¾"

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr "ÐÐµÐ¿Ñ€Ð¸Ð¿ÑƒÑÑ‚Ð¸Ð¼Ð° ÐºÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ Ñ–Ð¼'Ñ/Ð¿Ð°Ñ€Ð¾Ð»ÑŒ"

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr "Ð†Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸ÑÑ‚ÑƒÐ²Ð°Ñ‡Ð° Â«%sÂ» Ð½Ðµ Ð±ÑƒÐ»Ð¾ Ð·Ð°Ñ€ÐµÐ·ÐµÑ€Ð²Ð¾Ð²Ð°Ð½Ð¾"

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr "ÐÐµ Ð²ÐºÐ°Ð·Ð°Ð½Ð¾ Ð°Ð´Ñ€ÐµÑÑƒ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— Ð¿Ð¾ÑˆÑ‚Ð¸"

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr "Ñ–Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸ÑÑ‚ÑƒÐ²Ð°Ñ‡Ð° Ð¼Ð°Ñ” ÑÐºÐ»Ð°Ð´Ð°Ñ‚Ð¸ÑÑ Ð¿Ñ€Ð¸Ð½Ð°Ð¹Ð¼Ð½Ñ– Ð· %d ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ–Ð²"

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr "Ð´Ð¾Ð²Ð¶Ð¸Ð½Ð° Ñ–Ð¼ÐµÐ½Ñ– ÐºÐ¾Ñ€Ð¸ÑÑ‚ÑƒÐ²Ð°Ñ‡Ð° Ð½Ðµ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð° Ð¿ÐµÑ€ÐµÐ²Ð¸Ñ‰ÑƒÐ²Ð°Ñ‚Ð¸ %d ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ–Ð²"

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr "Ñ–Ð¼'Ñ ÐºÐ¾Ñ€Ð¸ÑÑ‚ÑƒÐ²Ð°Ñ‡Ð° = Â«%sÂ», Ð½ÐµÐ¿Ñ€Ð¸Ð¿ÑƒÑÑ‚Ð¸Ð¼Ð¸Ð¹ ÑÐ¸Ð¼Ð²Ð¾Ð» Â«%sÂ»"

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""
"Ð‘ÑƒÐ´ÑŒ Ð»Ð°ÑÐºÐ°, Ð²ÐºÐ°Ð¶Ñ–Ñ‚ÑŒ Ð°Ð´Ñ€ÐµÑÑƒ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— Ð¿Ð¾ÑˆÑ‚Ð¸, Ñ‰Ð¾ Ð½Ðµ Ð¿ÐµÑ€ÐµÐ²Ð¸Ñ‰ÑƒÑ” %s ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ–Ð² Ñƒ "
"Ð´Ð¾Ð²Ð¶Ð¸Ð½Ñƒ"

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr "Ð¿Ð°Ñ€Ð¾Ð»ÑŒ Ð¼Ð°Ñ” ÑÐºÐ»Ð°Ð´Ð°Ñ‚Ð¸ÑÑ Ð¿Ñ€Ð¸Ð½Ð°Ð¹Ð¼Ð½Ñ– Ð· %d ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ–Ð²"

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr "ÐŸÐ°Ñ€Ð¾Ð»ÑŒ Ð¼Ð°Ñ” Ð½Ðµ Ð¿ÐµÑ€ÐµÐ²Ð¸Ñ‰ÑƒÐ²Ð°Ñ‚Ð¸ %d ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ–Ð² Ñƒ Ð´Ð¾Ð²Ð¶Ð¸Ð½Ñƒ"

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr "Ð¿Ð°Ñ€Ð¾Ð»ÑŒ Ð¼Ñ–ÑÑ‚Ð¸Ñ‚ÑŒ ÑÐ¸Ð¼Ð²Ð¾Ð» Â«%sÂ»"

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr "Ñ–Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸ÑÑ‚ÑƒÐ²Ð°Ñ‡Ð° Ð¼Ð°Ñ” ÑÐºÐ»Ð°Ð´Ð°Ñ‚Ð¸ÑÑ Ð¿Ñ€Ð¸Ð½Ð°Ð¹Ð¼Ð½Ñ– Ð· %d ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ–Ð²"

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr "ÐÐµ Ð¼Ð¾Ð¶Ð½Ð° Ñ€ÐµÑ”ÑÑ‚Ñ€ÑƒÐ²Ð°Ñ‚Ð¸ Ñ–Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸ÑÑ‚ÑƒÐ²Ð°Ñ‡Ð°, Ñ‰Ð¾ Ð·Ð°Ð²ÐµÑ€ÑˆÑƒÑ”Ñ‚ÑŒÑÑ Ð½Ð° %s"

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr "Ð—Ð´Ð°Ñ”Ñ‚ÑŒÑÑ, Ñ†Ðµ Ð½Ðµ Ñ” ÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¸Ð¼ Ñ–Ð¼ÐµÐ½ÐµÐ¼ ÐºÐ¾Ñ€Ð¸ÑÑ‚ÑƒÐ²Ð°Ñ‡Ð°."

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr "ÐÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ðµ Ð¿Ð¾Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ–Ð¼ÐµÐ½Ñ– ÐºÐ¾Ñ€Ð¸ÑÑ‚ÑƒÐ²Ð°Ñ‡Ð° Ñ– Ð¿Ð°Ñ€Ð¾Ð»Ñ."

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr "Ð¦Ðµ Ñ–Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸ÑÑ‚ÑƒÐ²Ð°Ñ‡Ð° Ð²Ð¶Ðµ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð¾ Ð°Ð±Ð¾ Ð²ÐºÐ°Ð·Ð°Ð½Ð¾ Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð¸Ð¹ Ð¿Ð°Ñ€Ð¾Ð»ÑŒ."

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr "Ð”Ð¾ÑÑ‚ÑƒÐ¿ Ð·Ð°Ð±Ð¾Ñ€Ð¾Ð½ÐµÐ½Ð¾."

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr "ÐžÐ±â€™Ñ”ÐºÑ‚ Ð½Ðµ Ð·Ð½Ð°Ð¹Ð´ÐµÐ½Ð¾."

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr "ÐÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¸Ð¹ Ñ†Ð¸Ñ„Ñ€Ð¾Ð²Ð¸Ð¹ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ‚Ð¾Ñ€ ÑÐ¸ÑÑ‚ÐµÐ¼Ð¸."

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr "ÐÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ñ– Ñ€ÐµÑ”ÑÑ‚Ñ€Ð°Ñ†Ñ–Ð¹Ð½Ñ– Ð´Ð°Ð½Ñ– ÑÐ¸ÑÑ‚ÐµÐ¼Ð¸."

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr "ÐÐµ Ð²Ð´Ð°Ð»Ð¾ÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ð´Ð°Ð½Ñ– ÐºÐ¾Ñ€Ð¸ÑÑ‚ÑƒÐ²Ð°Ñ‡Ð° Ð· Ð±Ð°Ð·Ð¸ Ð´Ð°Ð½Ð¸Ñ…."

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr "ÐŸÐ¾Ñ‚Ñ€Ñ–Ð±Ð½Ðµ ÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ðµ Ñ–Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸ÑÑ‚ÑƒÐ²Ð°Ñ‡Ð°."

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr "ÐŸÐ¾Ñ‚Ñ€Ñ–Ð±ÐµÐ½ ÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¸Ð¹ Ð¿Ð°Ñ€Ð¾Ð»ÑŒ."

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr "ÐŸÐ¾Ñ€ÑƒÑˆÐµÐ½Ð¾ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð° Ð¼Ñ–Ð½Ñ–Ð¼Ð°Ð»ÑŒÐ½Ñƒ Ð´Ð¾Ð²Ð¶Ð¸Ð½Ñƒ Ñ–Ð¼ÐµÐ½Ñ– ÐºÐ¾Ñ€Ð¸ÑÑ‚ÑƒÐ²Ð°Ñ‡Ð°."

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr "ÐŸÐ¾Ñ€ÑƒÑˆÐµÐ½Ð½Ñ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð° Ð¼Ñ–Ð½Ñ–Ð¼Ð°Ð»ÑŒÐ½Ñƒ Ð´Ð¾Ð²Ð¶Ð¸Ð½Ñƒ Ð¿Ð°Ñ€Ð¾Ð»Ñ."

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr "Ð£ Ñ–Ð¼ÐµÐ½Ñ– ÐºÐ¾Ñ€Ð¸ÑÑ‚ÑƒÐ²Ð°Ñ‡Ð° Ð¼Ñ–ÑÑ‚ÑÑ‚ÑŒÑÑ Ð½ÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ñ– ÑÐ¸Ð¼Ð²Ð¾Ð»Ð¸."

#: ../common/rhnException.py:66
msgid "File not found."
msgstr "Ð¤Ð°Ð¹Ð» Ð½Ðµ Ð·Ð½Ð°Ð¹Ð´ÐµÐ½Ð¾."

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""
"ÐŸÑ–Ð´Ñ‚Ñ€Ð¸Ð¼ÐºÐ¸ Ñ‚Ð°ÐºÐ¾Ñ— ÐºÐ¾Ð¼Ð±Ñ–Ð½Ð°Ñ†Ñ–Ñ— Ð°Ñ€Ñ…Ñ–Ñ‚ÐµÐºÑ‚ÑƒÑ€Ð¸ Ñ– Ð²ÐµÑ€ÑÑ–Ñ— Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ð¹Ð½Ð¾Ñ— ÑÐ¸ÑÑ‚ÐµÐ¼Ð¸ Ð½Ðµ "
"Ð¿ÐµÑ€ÐµÐ´Ð±Ð°Ñ‡ÐµÐ½Ð¾."

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr "ÐÐµ Ð²Ð´Ð°Ð»Ð¾ÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ð´Ð°Ð½Ñ– Ñ‰Ð¾Ð´Ð¾ ÑÐ¸ÑÑ‚ÐµÐ¼Ð¸ Ñ–Ð· Ð±Ð°Ð·Ð¸ Ð´Ð°Ð½Ð¸Ñ…."

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr "Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ— Ð¿ÐµÑ€ÐµÐ´Ð°Ð½Ð¾ Ð½ÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ñ– Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð¸."

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr "ÐÐµ Ð²Ð´Ð°Ð»Ð¾ÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ð¿Ð¾Ñ‚Ñ€Ñ–Ð±Ð½Ð¸Ð¹ Ð·Ð°Ð¿Ð¸Ñ."

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr "ÐÐµ Ð²Ð´Ð°Ð»Ð¾ÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ Ð·Ð°Ð¿Ð¸Ñ Ñƒ Ð±Ð°Ð·Ñ– Ð´Ð°Ð½Ð¸Ñ…."

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr "ÐÐµÐ¿Ñ–Ð´Ñ‚Ñ€Ð¸Ð¼ÑƒÐ²Ð°Ð½Ð° Ð°Ñ€Ñ…Ñ–Ñ‚ÐµÐºÑ‚ÑƒÑ€Ð° ÑÐµÑ€Ð²ÐµÑ€Ð°."

#: ../common/rhnException.py:73
#, fuzzy, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""
"\n"
"     Ð¤ÑƒÐ½ÐºÑ†Ñ–Ð¾Ð½Ð°Ð»ÑŒÐ½Ñ– Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾ÑÑ‚Ñ– Ð°Ð½Ð¾Ð½Ñ–Ð¼Ð½Ð¾Ð³Ð¾ ÑÐµÑ€Ð²ÐµÑ€Ð° Ð±Ñ–Ð»ÑŒÑˆÐµ Ð½Ðµ Ð´Ð¾ÑÑ‚ÑƒÐ¿Ð½Ñ–.\n"
"\n"
"     Ð‘ÑƒÐ´ÑŒ Ð»Ð°ÑÐºÐ°, Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾ Ð·Ð°Ñ€ÐµÑ”ÑÑ‚Ñ€ÑƒÐ¹Ñ‚Ðµ Ñ†ÑŽ ÑÐ¸ÑÑ‚ÐµÐ¼Ñƒ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾ÑŽ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ "
"rhn_register,\n"
"     Ð²Ñ–Ð´Ð´Ð°Ð½Ð¾Ñ— Ð²Ñ–Ð´ Ñ–Ð¼ÐµÐ½Ñ– ÐºÐ¾Ñ€Ð¸ÑÑ‚ÑƒÐ²Ð°Ñ‡Ð° root.\n"
"     Ð‘ÑƒÐ´ÑŒ Ð»Ð°ÑÐºÐ°, Ð²Ñ–Ð´Ð²Ñ–Ð´Ð°Ð¹Ñ‚Ðµ https://%(hostname)s/rhn/systems/"
"SystemEntitlements.do\n"
"     Ð°Ð±Ð¾ ÑƒÐ²Ñ–Ð¹Ð´Ñ–Ñ‚ÑŒ Ð´Ð¾ ÑÐ¸ÑÑ‚ÐµÐ¼Ð¸ Ð½Ð° ÑÑ‚Ð¾Ñ€Ñ–Ð½Ñ†Ñ– https://%(hostname)s, Ð° Ð¿Ð¾Ñ‚Ñ–Ð¼ Ð½Ð° "
"Ð²ÐºÐ»Ð°Ð´Ñ†Ñ– Â«ÐžÐ³Ð»ÑÐ´Â» (Â«OverviewÂ»),\n"
"     Ð²Ð¸Ð±ÐµÑ€Ñ–Ñ‚ÑŒ Â«ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´Ð¿Ð»Ð°Ñ‚Ð°Ð¼Ð¸Â» (Â«Subscription ManagementÂ»), Ñ‰Ð¾Ð± "
"ÑƒÐ²Ñ–Ð¼ÐºÐ½ÑƒÑ‚Ð¸ ÑÐ»ÑƒÐ¶Ð±Ñƒ Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— ÑÐ¸ÑÑ‚ÐµÐ¼Ð¸.\n"
"     "

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr "Ð—Ð°Ð¿Ð¸Ñ Ñƒ Ð±Ð°Ð·Ñ– Ð´Ð°Ð½Ð¸Ñ… Ñ” Ð½ÐµÐ´Ð¾ÑÑ‚ÑƒÐ¿Ð½Ð¸Ð¼."

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr "ÐÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ðµ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸ÑÑƒ."

#: ../common/rhnException.py:83
#, fuzzy, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""
"\n"
"     Ð¦Ñ ÑÐ¸ÑÑ‚ÐµÐ¼Ð° Ð½Ðµ Ð¼Ð°Ñ” ÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¾Ñ— Ñ€ÐµÑ”ÑÑ‚Ñ€Ð°Ñ†Ñ–Ñ— Ñƒ Red Hat Satellite.\n"
"     Ð‘ÑƒÐ´ÑŒ Ð»Ð°ÑÐºÐ°, Ð²Ñ–Ð´Ð²Ñ–Ð´Ð°Ð¹Ñ‚Ðµ https://%(hostname)s/rhn/systems/"
"SystemEntitlements.do\n"
"     Ð°Ð±Ð¾ ÑƒÐ²Ñ–Ð¹Ð´Ñ–Ñ‚ÑŒ Ð´Ð¾ ÑÐ¸ÑÑ‚ÐµÐ¼Ð¸ Ð½Ð° ÑÑ‚Ð¾Ñ€Ñ–Ð½Ñ†Ñ– https://%(hostname)s, Ð° Ð¿Ð¾Ñ‚Ñ–Ð¼ Ð½Ð° "
"Ð²ÐºÐ»Ð°Ð´Ñ†Ñ– Â«ÐžÐ³Ð»ÑÐ´Â» (Â«OverviewÂ»),\n"
"     Ð²Ð¸Ð±ÐµÑ€Ñ–Ñ‚ÑŒ Â«ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´Ð¿Ð»Ð°Ñ‚Ð°Ð¼Ð¸Â» (Â«Subscription ManagementÂ»), Ñ‰Ð¾Ð± "
"ÑƒÐ²Ñ–Ð¼ÐºÐ½ÑƒÑ‚Ð¸ ÑÐ»ÑƒÐ¶Ð±Ñƒ Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— ÑÐ¸ÑÑ‚ÐµÐ¼Ð¸.\n"
"     \n"
"     "

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr "ÐŸÐ¾Ð¼Ð¸Ð»ÐºÐ° ÐºÐ°Ð½Ð°Ð»Ñƒ"

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr "ÐšÐ»ÑŽÑ‡ ÑÐµÐ°Ð½ÑÑƒ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ð° Ñ” Ð½ÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¸Ð¼."

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr "Ð¡Ñ‚Ñ€Ð¾Ðº Ð´Ñ–Ñ— ÐºÐ»ÑŽÑ‡Ð° ÑÐµÐ°Ð½ÑÑƒ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ð° Ð²Ð¸Ñ‡ÐµÑ€Ð¿Ð°Ð½Ð¾."

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr "Ð£ Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” Ð¿Ñ€Ð°Ð² Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ð°Ð½Ð¾Ð³Ð¾ Ð¾Ð±â€™Ñ”ÐºÑ‚Ð°."

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr "ÐÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð° Ð´Ñ–Ñ"

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr "Ð’Ð¸ Ð½Ðµ Ð¼Ð°Ñ”Ñ‚Ðµ Ð¿Ñ€Ð°Ð²Ð° Ð²Ð¸ÐºÐ¾Ð½ÑƒÐ²Ð°Ñ‚Ð¸ Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð· Ð°Ð´Ð¼Ñ–Ð½Ñ–ÑÑ‚Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñƒ Ñ†Ñ–Ð¹ ÑÐ¸ÑÑ‚ÐµÐ¼Ñ–."

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr "Ð¡Ð¸ÑÑ‚ÐµÐ¼Ñƒ Ð²Ð¶Ðµ Ð¿Ñ–Ð´Ð¿Ð¸ÑÐ°Ð½Ð¾ Ð½Ð° Ð²ÐºÐ°Ð·Ð°Ð½Ð¸Ð¹ ÐºÐ°Ð½Ð°Ð»."

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr "Ð¡Ð¸ÑÑ‚ÐµÐ¼Ñƒ Ð·Ð°Ñ€Ð°Ð· Ð½Ðµ Ð¿Ñ–Ð´Ð¿Ð¸ÑÐ°Ð½Ð¾ Ð½Ð° Ð²ÐºÐ°Ð·Ð°Ð½Ð¸Ð¹ ÐºÐ°Ð½Ð°Ð»."

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr "Ð’ÐºÐ°Ð·Ð°Ð½Ð¾Ð³Ð¾ ÐºÐ°Ð½Ð°Ð»Ñƒ Ð½Ðµ Ñ–ÑÐ½ÑƒÑ”."

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr "ÐÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð° Ð²ÐµÑ€ÑÑ–Ñ ÐºÐ°Ð½Ð°Ð»Ñƒ."

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""
"\n"
"     ÐŸÐµÑ€ÐµÐ²Ð¸Ñ‰ÐµÐ½Ð¾ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð° ÑƒÑ‡Ð°ÑÑ‚ÑŒ Ñƒ Ð³Ñ€ÑƒÐ¿Ñ–.\n"
"\n"
"     ÐŸÐ¾Ñ‚Ð¾Ñ‡Ð½Ñ– Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¸ Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ Ð·Ð°Ð¿Ð¸ÑÑƒ Ð½Ðµ Ð´Ð¾Ð·Ð²Ð¾Ð»ÑÑŽÑ‚ÑŒ\n"
"     Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ñ‰Ðµ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ Ð·Ð°Ð¿Ð¸ÑÑƒ ÐºÐ¾Ñ€Ð¸ÑÑ‚ÑƒÐ²Ð°Ñ‡Ð°. Ð‘ÑƒÐ´ÑŒ Ð»Ð°ÑÐºÐ°, "
"Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€Ñ‚Ðµ\n"
"     Ñ€Ð°Ð·Ð¾Ð¼ Ñ–Ð· Ð°Ð´Ð¼Ñ–Ð½Ñ–ÑÑ‚Ñ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð¼ Ð²Ð°ÑˆÐ¾Ð³Ð¾ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ Ð·Ð°Ð¿Ð¸ÑÑƒ Ñƒ Ð²Ð°ÑˆÑ–Ð¹ ÑƒÑÑ‚Ð°Ð½Ð¾Ð²Ñ–,\n"
"     Ñ‡Ð¸ ÑÐ»Ñ–Ð´ Ð·Ð¼Ñ–Ð½ÑŽÐ²Ð°Ñ‚Ð¸ Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ñƒ Ð¼Ð°ÐºÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ñƒ ÐºÑ–Ð»ÑŒÐºÑ–ÑÑ‚ÑŒ ÐºÐ¾Ñ€Ð¸ÑÑ‚ÑƒÐ²Ð°Ñ‡Ñ–Ð²,\n"
"     ÑÐºÑ– Ð¼Ð¾Ð¶ÑƒÑ‚ÑŒ Ð¿ÐµÑ€ÐµÐ´Ð¿Ð»Ð°Ñ‡ÑƒÐ²Ð°Ñ‚Ð¸ Ð¿Ð¾ÑÐ»ÑƒÐ³Ð¸ ÑÐµÑ€Ð²ÐµÑ€Ð°.\n"
"     "

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""
"\n"
"     ÐŸÐµÑ€ÐµÐ²Ð¸Ñ‰ÐµÐ½Ð¾ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð° ÑƒÑ‡Ð°ÑÑ‚ÑŒ ÑÐ¸ÑÑ‚ÐµÐ¼ Ñƒ Ð³Ñ€ÑƒÐ¿Ñ–.\n"
"\n"
"     ÐŸÐ¾Ñ‚Ð¾Ñ‡Ð½Ñ– Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¸ Ð²Ð°ÑˆÐ¾Ð³Ð¾ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ Ð·Ð°Ð¿Ð¸ÑÑƒ Ð·Ð°Ð±Ð¾Ñ€Ð¾Ð½ÑÑŽÑ‚ÑŒ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ\n"
"     Ñ‰Ðµ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ð¿Ñ€Ð¾Ñ„Ñ–Ð»ÑŽ ÑÐ¸ÑÑ‚ÐµÐ¼Ð¸. Ð‘ÑƒÐ´ÑŒ Ð»Ð°ÑÐºÐ°, Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€Ñ‚Ðµ Ñ€Ð°Ð·Ð¾Ð¼ Ñ–Ð· "
"Ð°Ð´Ð¼Ñ–Ð½Ñ–ÑÑ‚Ñ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð¼\n"
"     Ð²Ð°ÑˆÐ¾Ð³Ð¾ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ Ð·Ð°Ð¿Ð¸ÑÑƒ Ð² ÑƒÑÑ‚Ð°Ð½Ð¾Ð²Ñ–, Ñ‡Ð¸ ÑÐ»Ñ–Ð´ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ Ð¼Ð°ÐºÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ñƒ "
"ÐºÑ–Ð»ÑŒÐºÑ–ÑÑ‚ÑŒ\n"
"     Ð¿Ñ€Ð¾Ñ„Ñ–Ð»Ñ–Ð² ÑÐ¸ÑÑ‚ÐµÐ¼, ÑÐºÑ– Ð¼Ð¾Ð¶ÑƒÑ‚ÑŒ Ð¿Ñ€Ð°Ñ†ÑŽÐ²Ð°Ñ‚Ð¸ Ñƒ Ð¼ÐµÐ¶Ð°Ñ… Ð¿ÐµÑ€ÐµÐ´Ð¿Ð»Ð°Ñ‚Ð¸ Ð²Ð°ÑˆÐ¾Ð³Ð¾ "
"Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ Ð·Ð°Ð¿Ð¸ÑÑƒ.\n"
"     "

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""
"\n"
"     ÐÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð° Ð°Ñ€Ñ…Ñ–Ñ‚ÐµÐºÑ‚ÑƒÑ€Ð°.\n"
"\n"
"     ÐŸÑ–Ð´Ñ‚Ñ€Ð¸Ð¼ÐºÐ¸ Ð°Ñ€Ñ…Ñ–Ñ‚ÐµÐºÑ‚ÑƒÑ€Ð¸ Ð¿Ð°ÐºÑƒÐ½ÐºÐ° Ð½Ðµ Ð¿ÐµÑ€ÐµÐ´Ð±Ð°Ñ‡ÐµÐ½Ð¾ Ñƒ\n"
"     "

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr "ÐÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¸Ð¹ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº RPM"

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr "ÐÐ° ÑÐµÑ€Ð²ÐµÑ€ Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð¾ Ð½ÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ñ– Ð´Ð°Ð½Ñ–"

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr "ÐŸÐ¾Ð¼Ð¸Ð»ÐºÐ° Ð¿Ñ–Ð´ Ñ‡Ð°Ñ ÑÐ¿Ñ€Ð¾Ð±Ð¸ Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹ÑÑ–Ð² Ð¼ÐµÑ€ÐµÐ¶Ñ–."

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""
"\n"
"     Ð¡Ð¿Ñ€Ð¾Ð±Ð° Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ð°ÐºÑƒÐ½ÐºÐ° Ð·Ð°Ð·Ð½Ð°Ð»Ð° Ð½ÐµÐ²Ð´Ð°Ñ‡Ñ– Ñ‡ÐµÑ€ÐµÐ· Ð¿Ð¾Ñ€ÑƒÑˆÐµÐ½Ð½Ñ ÑƒÐ¼Ð¾Ð² "
"Ð¾Ð´Ð½Ð¾Ð·Ð½Ð°Ñ‡Ð½Ð¾ÑÑ‚Ñ–.\n"
"     ÐŸÐµÑ€ÐµÐºÐ¾Ð½Ð°Ð¹Ñ‚ÐµÑÑ, Ñ‰Ð¾ Ñƒ Ð¿Ð°ÐºÑƒÐ½ÐºÐ° Ð½ÐµÐ¼Ð°Ñ” Ð¿Ð¾Ð´Ð²Ñ–Ð¹Ð½Ð¸Ñ… Ð·Ð°Ð»ÐµÐ¶Ð½Ð¾ÑÑ‚ÐµÐ¹ Ñ– Ñ‰Ð¾\n"
"     Ð¿Ð°ÐºÑƒÐ½Ð¾Ðº Ð²Ð¶Ðµ Ð½Ðµ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ñ”Ñ‚ÑŒÑÑ Ð½Ð° ÑÐµÑ€Ð²ÐµÑ€Ñ–.\n"
"     "

#: ../common/rhnException.py:134
#, fuzzy
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""
"\n"
"     ÐÐ° Ñ†ÑŒÐ¾Ð¼Ñƒ ÑÐµÑ€Ð²ÐµÑ€Ñ– Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð¾ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ñ–ÑÑ‚ÑŒ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ --force rhnpush. \n"
"     Ð‘ÑƒÐ´ÑŒ Ð»Ð°ÑÐºÐ°, Ð·Ð²â€™ÑÐ¶Ñ–Ñ‚ÑŒÑÑ Ñ–Ð· Ð²Ð°ÑˆÐ¸Ð¼ Ð°Ð´Ð¼Ñ–Ð½Ñ–ÑÑ‚Ñ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð¼ Satellite, Ñ‰Ð¾Ð± Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ "
"Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ñ– Ð²Ñ–Ð´Ð¾Ð¼Ð¾ÑÑ‚Ñ–.\n"
"     "

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""
"\n"
"     ÐÐµ Ð²Ð´Ð°Ð»Ð¾ÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ Ð²ÐºÐ°Ð·Ð°Ð½Ð¸Ð¹ ÐºÐ»ÑŽÑ‡ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ— Ð½Ð° ÑÐµÑ€Ð²ÐµÑ€Ñ–.\n"
"     Ð‘ÑƒÐ´ÑŒ Ð»Ð°ÑÐºÐ°, Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ñ–Ñ‚ÑŒ ÑÐ¿Ñ€Ð¾Ð±Ñƒ Ñ–Ð· ÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¸Ð¼ ÐºÐ»ÑŽÑ‡ÐµÐ¼.\n"
"     "

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""
"Ð—Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾ÑŽ Ñ†ÑŒÐ¾Ð³Ð¾ Ñ€ÐµÑ”ÑÑ‚Ñ€Ð°Ñ†Ñ–Ð¹Ð½Ð¾Ð³Ð¾ ÐºÐ»ÑŽÑ‡Ð° Ð·Ð°Ñ€ÐµÑ”ÑÑ‚Ñ€Ð¾Ð²Ð°Ð½Ð¾ Ð½Ð°Ð´Ñ‚Ð¾ Ð±Ð°Ð³Ð°Ñ‚Ð¾ ÑÐ¸ÑÑ‚ÐµÐ¼"

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr "Ð£ ÐºÐ»ÑŽÑ‡Ñ– Ð¼Ñ–ÑÑ‚ÑÑ‚ÑŒÑÑ Ð½ÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ñ–, Ð·Ð°ÑÑ‚Ð°Ñ€Ñ–Ð»Ñ– Ð°Ð±Ð¾ Ð½ÐµÐ´Ð¾ÑÑ‚Ð°Ñ‚Ð½Ñ– Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¸"

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr "ÐšÐ¾Ð½Ñ„Ð»Ñ–ÐºÑ‚ ÐºÐ»ÑŽÑ‡Ñ–Ð² Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ—"

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""
"\n"
"     Ð”Ð»Ñ Ð²Ð°ÑˆÐ¾Ñ— ÑÐ¸ÑÑ‚ÐµÐ¼Ð¸ Ð½Ðµ Ð·Ð½Ð°Ð¹Ð´ÐµÐ½Ð¾ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ð¾Ð³Ð¾ Ð±Ð°Ð·Ð¾Ð²Ð¾Ð³Ð¾ ÐºÐ°Ð½Ð°Ð»Ñƒ.\n"
"     "

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""
"\n"
"     Ð£ Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” Ð¿Ñ€Ð°Ð²Ð° Ð¿Ñ–Ð´Ð¿Ð¸ÑÑƒÐ²Ð°Ñ‚Ð¸ÑÑ Ð½Ð° Ð²ÐºÐ°Ð·Ð°Ð½Ð¸Ð¹ ÐºÐ°Ð½Ð°Ð».\n"
"     Ð‘ÑƒÐ´ÑŒ Ð»Ð°ÑÐºÐ°, Ð·Ð²ÐµÑ€Ð½Ñ–Ñ‚ÑŒÑÑ Ð´Ð¾ Ð¾Ð¿Ð¸ÑÑƒ ÐºÐ°Ð½Ð°Ð»Ñƒ Ð²Ð°ÑˆÐ¾Ñ— Ð¾Ñ€Ð³Ð°Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ— Ð°Ð±Ð¾\n"
"     Ð´Ð¾ Ð°Ð´Ð¼Ñ–Ð½Ñ–ÑÑ‚Ñ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð² Ð¾Ñ€Ð³Ð°Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ—, Ñ‰Ð¾Ð± Ð´Ñ–Ð·Ð½Ð°Ñ‚Ð¸ÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ.\n"
"     "

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr "ÐÐµ Ð¼Ð¾Ð¶Ð½Ð° Ð²Ñ–Ð´Ð¿Ð¸ÑÐ°Ñ‚Ð¸ÑÑ Ð²Ñ–Ð´ Ð±Ð°Ð·Ð¾Ð²Ð¾Ð³Ð¾ ÐºÐ°Ð½Ð°Ð»Ñƒ."

#: ../common/rhnException.py:158
#, fuzzy
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr "ÐÐµ Ð²Ð´Ð°Ð»Ð¾ÑÑ Ð¿ÐµÑ€ÐµÐ´Ð¿Ð»Ð°Ñ‚Ð¸Ñ‚Ð¸ ÐºÐ°Ð½Ð°Ð» Satellite Ð°Ð±Ð¾ Proxy."

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr "ÐŸÑ–Ð´ Ñ‡Ð°Ñ ÑÐ¿Ñ€Ð¾Ð±Ð¸ Ð´Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚Ð¸ ÑÐ¸ÑÑ‚ÐµÐ¼Ñƒ Ð´Ð¾ Ñ—Ñ— Ð³Ñ€ÑƒÐ¿ ÑÑ‚Ð°Ð»Ð°ÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°"

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr "ÐÐµ Ð²Ð´Ð°Ð»Ð¾ÑÑ Ð¿Ñ€Ð¸Ð²â€™ÑÐ·Ð°Ñ‚Ð¸ ÑÐ¸ÑÑ‚ÐµÐ¼Ñƒ"

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr "ÐŸÐµÑ€ÐµÐ²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð° Ð¼Ð°ÐºÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð¸Ð¹ Ñ€Ð¾Ð·Ð¼Ñ–Ñ€ Ð¿Ð¾ÑˆÑ‚Ð¾Ð²Ð¾Ð³Ð¾ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ."

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr "Ð¦ÑŽ ÑÐ¸ÑÑ‚ÐµÐ¼Ñƒ Ð²Ð¶Ðµ Ð±ÑƒÐ»Ð¾ Ð·Ð°Ñ€ÐµÑ”ÑÑ‚Ñ€Ð¾Ð²Ð°Ð½Ð¾."

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr "ÐÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ðµ Ñ–Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸ÑÑ‚ÑƒÐ²Ð°Ñ‡Ð°"

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr "ÐÐµ Ð²Ð´Ð°Ð»Ð¾ÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ ÑÐµÑ€Ð²ÐµÑ€"

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr "ÐŸÑ€Ð¾Ð¿ÑƒÑ‰ÐµÐ½Ð¾ Ð¾Ð±Ð¾Ð²â€™ÑÐ·ÐºÐ¾Ð²Ð¸Ð¹ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚"

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr "Ð— Ð¾Ð±Ð»Ð°Ð´Ð½Ð°Ð½Ð½ÑÐ¼ Ð½Ðµ Ð¿Ð¾Ð²â€™ÑÐ·Ð°Ð½Ð¾ Ñ€ÐµÑ”ÑÑ‚Ñ€Ð°Ñ†Ñ–Ð¹Ð½Ð¸Ñ… Ð´Ð°Ð½Ð¸Ñ…"

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr "ÐšÑ–Ð»ÑŒÐºÑ–ÑÑ‚ÑŒ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½ÑŒ Ð½Ðµ Ð´Ð¾Ð¿ÑƒÑÐºÐ°Ñ” Ð´Ð¾ Ð¾Ð±ÑÐ»ÑƒÐ³Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ"

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr "ÐŸÐµÑ€ÐµÐ²Ð¸Ñ‰ÐµÐ½Ð¾ Ð¼Ð°ÐºÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ñƒ Ð´Ð¾Ð²Ð¶Ð¸Ð½Ñƒ Ñ–Ð¼ÐµÐ½Ñ– ÐºÐ¾Ñ€Ð¸ÑÑ‚ÑƒÐ²Ð°Ñ‡Ð°"

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr "ÐŸÐµÑ€ÐµÐ²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð¼Ð°ÐºÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð¾Ñ— Ð´Ð¾Ð²Ð¶Ð¸Ð½Ð¸ Ð¿Ð°Ñ€Ð¾Ð»Ñ"

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""
"Ð£ Ñ†ÑŒÐ¾Ð³Ð¾ ÐºÐ¾Ñ€Ð¸ÑÑ‚ÑƒÐ²Ð°Ñ‡Ð° Ñ” Ð´Ð¾ÑÑ‚ÑƒÐ¿ Ð»Ð¸ÑˆÐµ Ð´Ð¾ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾ÑŽ API. Ð”Ñ–ÑŽ "
"Ð·Ð°Ð±Ð¾Ñ€Ð¾Ð½ÐµÐ½Ð¾."

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr "ÐÐ°Ð·Ð²Ð° ÑÐ¸ÑÑ‚ÐµÐ¼Ð¸ Ð¼Ð°Ñ” ÑÐºÐ»Ð°Ð´Ð°Ñ‚Ð¸ÑÑ Ñ–Ð· Ð¿Ñ€Ð¸Ð½Ð°Ð¹Ð¼Ð½Ñ– 1 ÑÐ¸Ð¼Ð²Ð¾Ð»Ñƒ"

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
#, fuzzy
msgid "SUSE Manager Proxy error."
msgstr "ÐŸÐ¾Ð¼Ð¸Ð»ÐºÐ° Ð¿Ñ€Ð¾ÐºÑÑ–-ÑÐµÑ€Ð²ÐµÑ€Ð° Spacewalk."

#: ../common/rhnException.py:191
#, fuzzy
msgid "SUSE Manager Proxy unable to login."
msgstr "ÐÐµ Ð²Ð´Ð°Ð»Ð¾ÑÑ ÑƒÐ²Ñ–Ð¹Ñ‚Ð¸ Ð´Ð¾ ÑÐ¸ÑÑ‚ÐµÐ¼Ð¸ Ð¿Ñ€Ð¾ÐºÑÑ–-ÑÐµÑ€Ð²ÐµÑ€Ð° Spacewalk."

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
#, fuzzy
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""
"\n"
"     Ð†Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ‚Ð¾Ñ€ ÑÐ¸ÑÑ‚ÐµÐ¼Ð¸ Ð¿Ñ€Ð¾ÐºÑÑ– Spacewalk Ð½Ðµ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð°Ñ” Ð·Ð°Ð¿Ð¸ÑÑƒ Ð¿Ñ€Ð¾ÐºÑÑ–-"
"ÑÐµÑ€Ð²ÐµÑ€Ð° Spacewalk\n"
"     Ñƒ Ð±Ð°Ð·Ñ– Ð´Ð°Ð½Ð¸Ñ….\n"
"     "

#: ../common/rhnException.py:197
#, fuzzy
msgid "SUSE Manager Proxy session token is invalid."
msgstr "ÐÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¸Ð¹ ÐºÐ»ÑŽÑ‡ ÑÐµÐ°Ð½ÑÑƒ Proxy Spacewalk."

#: ../common/rhnException.py:198
#, fuzzy
msgid "SUSE Manager Proxy session token has expired."
msgstr "Ð¡Ñ‚Ñ€Ð¾Ðº Ð´Ñ–Ñ— ÐºÐ»ÑŽÑ‡Ð° ÑÐµÐ°Ð½ÑÑƒ Proxy Spacewalk Ð²Ð¸Ñ‡ÐµÑ€Ð¿Ð°Ð½Ð¾."

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
#, fuzzy
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""
"\n"
"     Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸ÑÑ–Ð² ÐºÐ¾Ñ€Ð¸ÑÑ‚ÑƒÐ²Ð°Ñ‡Ñ–Ð² Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾ÑŽ rhn_register Ð·Ð°Ð±Ð¾Ñ€Ð¾Ð½ÐµÐ½Ð¾;\n"
"     Ð±ÑƒÐ´ÑŒ Ð»Ð°ÑÐºÐ°, Ð·Ð²â€™ÑÐ¶Ñ–Ñ‚ÑŒÑÑ Ñ–Ð· Ð²Ð°ÑˆÐ¸Ð¼ ÑÐ¸ÑÑ‚ÐµÐ¼Ð½Ð¸Ð¼ Ð°Ð´Ð¼Ñ–Ð½Ñ–ÑÑ‚Ñ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð¼ Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ "
"Ð²Ð°ÑˆÐ¾Ð³Ð¾ Ð¾Ð±Ð»Ñ–ÐºÐ¾Ð²Ð¾Ð³Ð¾ Ð·Ð°Ð¿Ð¸ÑÑƒ.\n"
"     "

#: ../common/rhnException.py:206
#, fuzzy
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""
"\n"
"     Ð¦ÑŒÐ¾Ð¼Ñƒ ÑÐµÑ€Ð²ÐµÑ€Ñƒ satellite Ð·Ð°Ð±Ð¾Ñ€Ð¾Ð½ÐµÐ½Ð¾ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ— Inter "
"Satellite Ð½Ð° Ñ†ÑŒÐ¾Ð¼Ñƒ satellite\n"
"     "

#: ../common/rhnException.py:209
#, fuzzy
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""
"\n"
"     Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–ÑŽ Inter Satellite Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð¾ Ð½Ð° Ñ†ÑŒÐ¾Ð¼Ñƒ satellite.\n"
"     "

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr "ÐŸÐµÑ€ÐµÐ´Ð°Ð½Ð¾ Ð½ÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¸Ð¹ Ñ‚Ð¸Ð¿ Ð´Ð°Ð½Ð¸Ñ…"

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr "ÐÐµ Ð²Ð´Ð°Ð»Ð¾ÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ÐºÐ°Ð½Ð°Ð»"

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr "ÐÐµ Ð²Ð´Ð°Ð»Ð¾ÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ð¿Ð°ÐºÑƒÐ½Ð¾Ðº"

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr "ÐÐµ Ð²Ð´Ð°Ð»Ð¾ÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ÑÐ¿Ð¸ÑÐ¾Ðº Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº"

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr "ÐÐµ Ð²Ð¸ÑÑ‚Ð°Ñ‡Ð°Ñ” Ñ„Ð°Ð¹Ð»Ð°"

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr "ÐŸÐ¾Ð¼Ð¸Ð»ÐºÐ° Ð¿Ñ–Ð´ Ñ‡Ð°Ñ ÑÐ¿Ñ€Ð¾Ð±Ð¸ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ—"

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr "ÐŸÐ¾Ð¼Ð¸Ð»ÐºÐ° Ð¿Ñ–Ð´ Ñ‡Ð°Ñ ÑÐ¿Ñ€Ð¾Ð±Ð¸ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ—"

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr "ÐÐµ Ð²Ð¸ÑÑ‚Ð°Ñ‡Ð°Ñ” Ñ€ÑÐ´ÐºÐ° Ð²ÐµÑ€ÑÑ–Ñ—"

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr "ÐÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¸Ð¹ Ñ€ÑÐ´Ð¾Ðº Ð²ÐµÑ€ÑÑ–Ñ—"

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr "ÐÐµÐ²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ñ–ÑÑ‚ÑŒ Ð²ÐµÑ€ÑÑ–Ð¹"

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr "ÐÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð° Ð²ÐµÑ€ÑÑ–Ñ ÐºÐ°Ð½Ð°Ð»Ñƒ"

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr "ÐÐ° ÐºÐ°Ð½Ð°Ð»Ñ– Ð½ÐµÐ¼Ð°Ñ” Ñ„Ð°Ð¹Ð»Ð° comps"

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr "ÐÐµ Ð²Ð´Ð°Ð»Ð¾ÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ñ„Ð°Ð¹Ð» comps"

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr "ÐÐµ Ð²ÐºÐ°Ð·Ð°Ð½Ð¾ Ð´Ñ–Ñ— Ð· Ð½Ð°Ð»Ð°ÑˆÑ‚Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ"

#: ../common/rhnException.py:230
msgid "File too large"
msgstr "Ð¤Ð°Ð¹Ð» Ñ” Ð½Ð°Ð´Ñ‚Ð¾ Ð²ÐµÐ»Ð¸ÐºÐ¸Ð¼"

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr "Ð£ Ñ„Ð°Ð¹Ð»Ñ– Ð¼Ñ–ÑÑ‚ÑÑ‚ÑŒÑÑ Ð±Ñ–Ð½Ð°Ñ€Ð½Ñ– Ð´Ð°Ð½Ñ–"

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr "ÐšÐ°Ð½Ð°Ð» Ð½Ð°Ð»Ð°ÑˆÑ‚Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ Ñ” Ð¿Ð¾Ñ€Ð¾Ð¶Ð½Ñ–Ð¼"

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr "ÐŸÐ¾Ð¼Ð¸Ð»ÐºÐ° Ð´Ð¾ÑÑ‚ÑƒÐ¿Ñƒ"

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr "Ð£ Ñ„Ð°Ð¹Ð»Ñ– Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½ÑŒ Ð½Ðµ Ð¼Ñ–ÑÑ‚Ð¸Ñ‚ÑŒÑÑ Ð´Ð°Ð½Ð¸Ñ…"

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr "ÐÐµ Ð²ÐºÐ°Ð·Ð°Ð½Ð¾ Ñ€Ð¾Ð·Ð´Ñ–Ð»ÑŒÐ½Ð¸ÐºÐ¸ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð°"

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr "ÐšÐ°Ð½Ð°Ð»Ñƒ Ð½Ð°Ð»Ð°ÑˆÑ‚Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ Ñ–ÑÐ½ÑƒÑ”"

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr "ÐšÐ°Ð½Ð°Ð» Ð½Ð°Ð»Ð°ÑˆÑ‚Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¶Ðµ Ñ–ÑÐ½ÑƒÑ”"

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr "ÐÐ° ÐºÐ°Ð½Ð°Ð»Ñ– Ð½Ð°Ð»Ð°ÑˆÑ‚Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ Ð²Ð¸ÑÑ‚Ð°Ñ‡Ð°Ñ” Ñ„Ð°Ð¹Ð»Ð°"

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr "Ð’Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð¾ Ñ–Ð½ÑˆÑƒ Ð¼Ð¾Ð´Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–ÑŽ Ñ†ÑŒÐ¾Ð³Ð¾ Ñ„Ð°Ð¹Ð»Ð°"

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr "Ð¤Ð°Ð¹Ð» Ð²Ð¶Ðµ Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð¾ Ð´Ð¾ ÐºÐ°Ð½Ð°Ð»Ñƒ Ð½Ð°Ð»Ð°ÑˆÑ‚Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ"

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr "Ð Ð¾Ð·Ð¼Ñ–Ñ€ Ñ„Ð°Ð¹Ð»Ð° Ð¿ÐµÑ€ÐµÐ²Ð¸Ñ‰ÑƒÑ” Ð·Ð°Ð»Ð¸ÑˆÐ¾Ðº ÐºÐ²Ð¾Ñ‚Ð¸ Ñƒ ÑÑ…Ð¾Ð²Ð¸Ñ‰Ñ– Ð´Ð°Ð½Ð¸Ñ…"

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr "Ð¨Ð»ÑÑ… Ð´Ð¾ Ñ„Ð°Ð¹Ð»Ð° Ð¼Ð°Ñ” Ð±ÑƒÑ‚Ð¸ Ð²ÐºÐ°Ð·Ð°Ð½Ð¾ Ð¿Ð¾Ð²Ð½Ñ–ÑÑ‚ÑŽ"

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr "ÐÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¸Ð¹ Ð½Ð¾Ð¼ÐµÑ€ Ð¼Ð¾Ð´Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ—"

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr "ÐÐµ Ð¼Ð¾Ð¶Ð½Ð° Ð¿Ð¾Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ñ‚Ð¸ Ñ„Ð°Ð¹Ð»Ð¸ Ñ€Ñ–Ð·Ð½Ð¸Ñ… Ñ‚Ð¸Ð¿Ñ–Ð²"

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr "Ð”Ð°Ð½Ñ– Ñ‰Ð¾Ð´Ð¾ Ð°Ð²Ð°Ñ€Ñ–Ñ— Ñ” Ð½ÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¸Ð¼Ð¸ Ð°Ð±Ð¾ Ð½ÐµÐ¿Ð¾Ð²Ð½Ð¸Ð¼Ð¸"

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr "Ð”Ð°Ð½Ñ– Ð· Ñ„Ð°Ð¹Ð»Ð° Ð´Ð°Ð½Ð¸Ñ… Ð°Ð²Ð°Ñ€Ñ–Ñ— Ñ” Ð½ÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¸Ð¼Ð¸ Ð°Ð±Ð¾ Ð½ÐµÐ¿Ð¾Ð²Ð½Ð¸Ð¼Ð¸"

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr "ÐŸÐ¾Ð¼Ð¸Ð»ÐºÐ° Ð¿Ñ–Ð´ Ñ‡Ð°Ñ ÑÐ¿Ñ€Ð¾Ð±Ð¸ ÑƒÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÑˆÐ»ÑÑ…Ñƒ Ð´Ð¾ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ Ð´Ð°Ð½Ð¸Ñ… Ð°Ð²Ð°Ñ€Ñ–Ñ—"

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr "ÐŸÐ¾Ð¼Ð¸Ð»ÐºÐ° Ð¿Ñ–Ð´ Ñ‡Ð°Ñ ÑÐ¿Ñ€Ð¾Ð±Ð¸ ÑƒÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÑˆÐ»ÑÑ…Ñƒ Ð´Ð¾ Ñ„Ð°Ð¹Ð»Ð° Ð´Ð°Ð½Ð¸Ñ… Ð°Ð²Ð°Ñ€Ñ–Ñ—"

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr "ÐÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ðµ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…"

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr "ÐÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð° Ð½Ð°Ð·Ð²Ð° Ð°Ð²Ð°Ñ€Ñ–Ñ—"

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr "Ð”Ð»Ñ Ñ†Ñ–Ñ”Ñ— Ð¾Ñ€Ð³Ð°Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ— Ð·Ð²Ñ–Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾ Ð²Ð°Ð´Ð¸ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð¾"

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr "ÐŸÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð° Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ñ–Ð² SCAP Ñ” Ð½ÐµÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¸Ð¼ Ð°Ð±Ð¾ Ð½ÐµÐ¿Ð¾Ð²Ð½Ð¸Ð¼"

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""
"ÐŸÐ¾Ð¼Ð¸Ð»ÐºÐ° Ð¿Ñ–Ð´ Ñ‡Ð°Ñ ÑÐ¿Ñ€Ð¾Ð±Ð¸ ÑƒÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÑˆÐ»ÑÑ…Ñƒ Ð´Ð¾ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ Ð´Ð»Ñ Ð´Ð¾ÐºÐ»Ð°Ð´Ð½Ð¸Ñ… Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ñ–Ð² "
"SCAP"

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""
"ÐŸÐ¾Ð¼Ð¸Ð»ÐºÐ° Ð¿Ñ–Ð´ Ñ‡Ð°Ñ ÑÐ¿Ñ€Ð¾Ð±Ð¸ ÑƒÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÑˆÐ»ÑÑ…Ñƒ Ð´Ð¾ Ñ„Ð°Ð¹Ð»Ð° Ð´Ð»Ñ Ð´Ð¾ÐºÐ»Ð°Ð´Ð½Ð¸Ñ… Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ñ–Ð² "
"SCAP"

#: ../common/rhnException.py:306
#, fuzzy
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""
"\n"
"     ÐŸÑ–Ð´ Ñ‡Ð°Ñ ÑÐ¿Ñ€Ð¾Ð±Ð¸ Ð¾Ð±Ñ€Ð¾Ð±Ð¸Ñ‚Ð¸ Ð²Ð°Ñˆ Ð·Ð°Ð¿Ð¸Ñ‚ ÑÑ‚Ð°Ð»Ð°ÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. Ð¯ÐºÑ‰Ð¾ Ñ†ÑŽ\n"
"     Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ñƒ Ð½Ðµ Ð²Ð´Ð°ÑÑ‚ÑŒÑÑ Ð²Ð¸Ñ€Ñ–ÑˆÐ¸Ñ‚Ð¸, Ð±ÑƒÐ´ÑŒ Ð»Ð°ÑÐºÐ°, ÑÑ‚Ð²Ð¾Ñ€Ñ–Ñ‚ÑŒ Ð·Ð²Ñ–Ñ‚ Ñ‰Ð¾Ð´Ð¾ Ð²Ð°Ð´Ð¸ Ð½Ð° "
"bugzilla.redhat.com.\n"
"     Ð¯ÐºÑ‰Ð¾ Ð²Ð¸ Ð²Ð¸Ñ€Ñ–ÑˆÐ¸Ñ‚Ðµ ÑÑ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ Ñ‚Ð°ÐºÐ¸Ð¹ Ð·Ð²Ñ–Ñ‚ Ñ‰Ð¾Ð´Ð¾ Ð²Ð°Ð´Ð¸, Ð±ÑƒÐ´ÑŒ Ð»Ð°ÑÐºÐ°, Ð½Ðµ Ð·Ð°Ð±ÑƒÐ´ÑŒÑ‚Ðµ "
"Ð²ÐºÐ°Ð·Ð°Ñ‚Ð¸ Ñƒ Ð½ÑŒÐ¾Ð¼Ñƒ\n"
"     Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð¸Ñ†Ñ– Ñ‰Ð¾Ð´Ð¾ Ñ‚Ð¾Ð³Ð¾, Ñ‰Ð¾ ÑÐ°Ð¼Ðµ Ð²Ð¸ Ñ€Ð¾Ð±Ð¸Ð»Ð¸, ÐºÐ¾Ð»Ð¸ ÑÑ‚Ð°Ð»Ð°ÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°, Ð° Ñ‚Ð°ÐºÐ¾Ð¶ "
"ÑÐ¿Ð¾ÑÑ–Ð±, Ñƒ ÑÐºÐ¸Ð¹\n"
"     Ñ†ÑŽ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ñƒ Ð¼Ð¾Ð¶Ð½Ð° Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸.\n"

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""
"ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑƒ:\n"
"    %s\n"

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr "ÐšÐ¾Ð´ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¾Ð²Ð¾Ð³Ð¾ ÐºÐ»Ð°ÑÑƒ: %s\n"

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr "Ð”Ð°Ð½Ñ– Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¾Ð²Ð¾Ð³Ð¾ ÐºÐ»Ð°ÑÑƒ: %s\n"

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr "ÐŸÐ¾ÑÑÐ½ÐµÐ½Ð½Ñ: %s"

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr "ÐŸÐžÐœÐ˜Ð›ÐšÐ: %s %s: %s"

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr "Ð¢Ð ÐÐ¡Ð£Ð’ÐÐÐÐ¯: %s"

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, fuzzy, python-format
msgid "    Extinct package:  %s"
msgstr "ÐœÐ°Ð»Ð¾ Ð±ÑƒÑ‚Ð¸ Ð²ÐºÐ°Ð·Ð°Ð½Ð¾ Ð¿Ð°ÐºÑƒÐ½Ð¾Ðº, Ð° Ð½Ðµ: %s"

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
#, fuzzy
msgid "Linking packages to channels"
msgstr "ÐšÐ¾Ð½Ñ„Ð»Ñ–ÐºÑ‚ Ð¾ÑÐ½Ð¾Ð²Ð½Ð¸Ñ… ÐºÐ°Ð½Ð°Ð»Ñ–Ð²"

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
#, fuzzy
msgid "base-channels"
msgstr "ÐšÐ¾Ð½Ñ„Ð»Ñ–ÐºÑ‚ Ð¾ÑÐ½Ð¾Ð²Ð½Ð¸Ñ… ÐºÐ°Ð½Ð°Ð»Ñ–Ð²"

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, fuzzy, python-format
msgid "Unable to save file %s: %s"
msgstr "ÐÐµ Ð²Ð´Ð°Ð»Ð¾ÑÑ Ð¿Ñ€Ð¸Ð²â€™ÑÐ·Ð°Ñ‚Ð¸ ÑÐ¸ÑÑ‚ÐµÐ¼Ñƒ"

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
#, fuzzy
msgid "print the configuration and exit"
msgstr "ÐšÐ°Ð½Ð°Ð»Ñƒ Ð½Ð°Ð»Ð°ÑˆÑ‚Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ Ñ–ÑÐ½ÑƒÑ”"

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, fuzzy, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr "ÐÐµ Ð²Ð´Ð°Ð»Ð¾ÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ ÑÐµÑ€Ð²ÐµÑ€"

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
#, fuzzy
msgid "  12 - Channel do not exist"
msgstr "Ð’ÐºÐ°Ð·Ð°Ð½Ð¾Ð³Ð¾ ÐºÐ°Ð½Ð°Ð»Ñƒ Ð½Ðµ Ñ–ÑÐ½ÑƒÑ”."

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""

#~ msgid "Your system was not found in the RHN database"
#~ msgstr "Ð’Ð°ÑˆÐ¾Ñ— ÑÐ¸ÑÑ‚ÐµÐ¼Ð¸ Ð½Ðµ Ð·Ð½Ð°Ð¹Ð´ÐµÐ½Ð¾ Ñƒ Ð±Ð°Ð·Ñ– Ð´Ð°Ð½Ð¸Ñ… RHN"

#~ msgid "ISS is disabled on this satellite."
#~ msgstr "ISS Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð¾ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ satellite."

#~ msgid "Spacewalk Proxy service not enabled for server profile: \"%s\""
#~ msgstr "ÐŸÑ€Ð¾ÐºÑÑ–-ÑÐµÑ€Ð²Ñ–Ñ Spacewalk Ð½Ðµ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ð¹ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ„Ñ–Ð»ÑŽ ÑÐµÑ€Ð²ÐµÑ€Ð°: Â«%sÂ»"

#~ msgid "Red Hat Satellite Welcome Message"
#~ msgstr "Ð’Ñ–Ñ‚Ð°Ð»ÑŒÐ½Ðµ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Red Hat Satellite"

#~ msgid "Red Hat Satellite Privacy Statement"
#~ msgstr "Ð£Ð³Ð¾Ð´Ð° Ñ‰Ð¾Ð´Ð¾ ÐºÐ¾Ð½Ñ„Ñ–Ð´ÐµÐ½Ñ†Ñ–Ð¹Ð½Ð¾ÑÑ‚Ñ– Red Hat Satellite"
07070100000095000081B40000000000000000000000015FBBE8EE0000B603000000000000000000000000000000000000001B00000000spacewalk-backend/po/ur.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Urdu <trans-urdu@lists.fedoraproject.org>\n"
"Language: ur\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
 07070100000096000081B40000000000000000000000015FBBE8EE0000B61A000000000000000000000000000000000000001B00000000spacewalk-backend/po/vi.po    # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Vietnamese (http://www.transifex.com/projects/p/fedora/"
"language/vi/)\n"
"Language: vi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
  07070100000097000081B40000000000000000000000015FBBE8EE0000B7AC000000000000000000000000000000000000001E00000000spacewalk-backend/po/zh_CN.po # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Leah Liu <lliu@redhat.com>, 2010.
# Leah Liu <weliu@redhat.com>, 2005, 2006.
# Sarah Smith <sarahs@redhat.com>, 2002.
# Sarah Wang <sarahs@redhat.com>, 2003, 2004.
# Tony Fu <tfu@redhat.com>, 2004, 2006.
# Xi Huang <xhuang@redhat.com>, 2006.
# Xi HUANG <xhuang@redhat.com>, 2007.
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2020-10-01 15:48+0000\n"
"Last-Translator: Pau Garcia Quiles <pau.garcia@suse.com>\n"
"Language-Team: Chinese (China) <https://l10n.opensuse.org/projects/uyuni/"
"backend/zh_CN/>\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 3.6.1\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
#, fuzzy
msgid "Please run rhn_register as root on this client"
msgstr "è¯·åœ¨è¿™ä¸ªå®¢æˆ·ç«¯ä¸­ä»¥ root èº«ä»½è¿è¡Œ rhn_register"

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
07070100000098000081B40000000000000000000000015FBBE8EE0000B60B000000000000000000000000000000000000001E00000000spacewalk-backend/po/zh_HK.po # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Chinese (Hong Kong) <chinese@lists.fedoraproject.org>\n"
"Language: zh_HK\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
 07070100000099000081B40000000000000000000000015FBBE8EE0000B71F000000000000000000000000000000000000001E00000000spacewalk-backend/po/zh_TW.po # SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# Ben Wu <hpwu@redhat.com>, 2002, 2003.
# Chester Cheng <ccheng@brisbane.redhat.com>, 2006.
# Chester Cheng <ccheng@redhat.com>, 2004, 2005, 2006, 2007.
# Leah Liu <weliu@redhat.com>, 2005.
# Waika Liu <wliu@redhat.com>, 2005.
# Walter Cheuk <wwycheuk@netvigator.com>, 2005.
msgid ""
msgstr ""
"Project-Id-Version: Spacewalk\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-10-16 13:34+0200\n"
"PO-Revision-Date: 2011-03-04 16:08+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: Chinese (Taiwan) <trans-zh_TW@lists.fedoraproject.org>\n"
"Language: zh_TW\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"

#: ../server/apacheAuth.py:66
#, python-format
msgid "incomplete proxy authentication token: %s"
msgstr ""

#: ../server/apacheAuth.py:84
#, python-format
msgid "Sent proxy signature %s does not match ours %s."
msgstr ""

#: ../server/apacheAuth.py:119
msgid "declined proxy authentication"
msgstr ""

#: ../server/apacheRequest.py:59
#, python-format
msgid "Invalid request received (%s)."
msgstr ""

#: ../server/apacheRequest.py:120
#, python-format
msgid ""
"IMPORTANT MESSAGE FOLLOWS:\n"
"%s"
msgstr ""

#: ../server/apacheRequest.py:149
#, python-format
msgid ""
"While running '%s': caught\n"
"%s : %s\n"
msgstr ""

#: ../server/apacheRequest.py:606
#, python-format
msgid "Invalid URI %s"
msgstr ""

#: ../server/configFilesHandler.py:129 ../server/handlers/app/packages.py:192
#: ../server/handlers/xmlrpc/registration.py:215
#: ../server/handlers/xmlrpc/registration.py:1168
#: ../server/handlers/xmlrpc/registration.py:1307
#, python-format
msgid ""
"\n"
"                   %s Account has been deactivated on this server.\n"
"                   Please contact your Org administrator for more help."
msgstr ""

#: ../server/handlers/applet/applet.py:78
#, python-brace-format
msgid "Your system was not found in the {PRODUCT_NAME} database"
msgstr ""

#: ../server/handlers/sat/auth.py:45
msgid "ISS is disabled on this server."
msgstr ""

#: ../server/handlers/sat/auth.py:50
#, python-format
msgid "Server \"%s\" is not enabled for ISS."
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:64
#, python-format
msgid "Expected a package name, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/errata.py:115
#, python-format
msgid "Expected a package, not: %s"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:65
#, python-format
msgid "SUSE Manager Proxy service not enabled for server profile: \"%s\""
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:85
msgid "Invalid session key"
msgstr ""

#: ../server/handlers/xmlrpc/proxy.py:93
msgid "This server ID no longer exists"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:433
#, python-format
msgid "Invalid action value type %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/queue.py:464
#, python-format
msgid "Action %s does not belong to server %s"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:194
msgid "Required data missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:198
msgid "Required members missing"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:207
msgid "Attempt to register a system to an invalid username"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:839
msgid "Invalid system release version requested"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1063
msgid ""
"Unable to find a valid network interface, both ipaddr and ip6addr not found."
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1115
#, python-brace-format
msgid "{PRODUCT_NAME} Welcome Message"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1125
msgid "Privacy Statement"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1146
msgid "Expected a dictionary as a product argument"
msgstr ""

#: ../server/handlers/xmlrpc/registration.py:1374
#, python-format
msgid "Invalid value '%s' for %s (%s)"
msgstr ""

#: ../server/handlers/xmlrpc/scap.py:104
msgid "Invalid system_id/action_id pair."
msgstr ""

#: ../server/handlers/xmlrpc/up2date.py:233
#, python-format
msgid "Invalid value %s (%s)"
msgstr ""

#: ../server/importlib/userAuth.py:98
msgid "You are not authorized to manage packages in the null org"
msgstr ""

#: ../server/importlib/userAuth.py:103
#, python-format
msgid "You are not allowed to manage packages in the %s org"
msgstr ""

#: ../server/importlib/userAuth.py:121
msgid "You are not allowed to perform administrative tasks"
msgstr ""

#: ../server/importlib/userAuth.py:144
#, python-format
msgid ""
"You are not allowed to manage channel %s, or that channel does not exist"
msgstr ""

#: ../server/importlib/userAuth.py:204
#, python-format
msgid ""
"\n"
"               %s Account has been deactivated on this server.\n"
"               Please contact your Org administrator for more help."
msgstr ""

#: ../server/rhnChannel.py:1992
#, python-format
msgid ""
"Your account does not have access to any channels matching "
"(release='%(release)s', arch='%(arch)s')%(www_activation)s"
msgstr ""

#: ../server/rhnChannel.py:2002
msgid ""
"\n"
"If you have a registration number, please register with it first at http://"
"www.redhat.com/apps/activate/ and then try again.\n"
"\n"
msgstr ""

#: ../server/rhnChannel.py:2012
#, python-format
msgid "Insufficient subscription permissions for release (%s, %s"
msgstr ""

#. Various messages that can be reused
#.
#. bretm 02/07/2007 -- when we have better old-client documentation, probably
#. will be safe to get rid of all this crap
#: ../server/rhnChannel.py:2276 ../server/rhnChannel.py:2287
#: ../server/rhnChannel.py:2302
msgid "System Registered but Inactive"
msgstr ""

#: ../server/rhnChannel.py:2277
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it is not subscribed to a channel. If you have not yet\n"
"activated your product for service, please visit our website at:\n"
"\n"
"     http://www.redhat.com/apps/activate/\n"
"\n"
"...to activate your product."
msgstr ""

#: ../server/rhnChannel.py:2288
#, python-format
msgid ""
"\n"
"Invalid Architecture and OS release combination (%s, %s).\n"
"Your system has been registered, but will not receive updates\n"
"because it could not be subscribed to a base channel.\n"
"Please contact your organization administrator for assistance.\n"
msgstr ""

#: ../server/rhnChannel.py:2295
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but is not yet entitled\n"
"  to service.  To entitle this system to service, login to the web site at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnChannel.py:2303
#, python-format
msgid ""
"\n"
"  This system has been successfully registered, but no service entitlements\n"
"  were available.  To entitle this system to service, login to the web site "
"at:\n"
"\n"
"  %(entitlement_url)s\n"
msgstr ""

#: ../server/rhnHandler.py:62
msgid "Please run rhn_register as root on this client"
msgstr ""

#: ../server/rhnHandler.py:75
#, python-format
msgid "Service not enabled for system profile: \"%s\""
msgstr ""

#: ../server/rhnPackage.py:49 ../server/rhnPackage.py:87
#: ../server/rhnPackage.py:107 ../server/rhnPackage.py:158
#, python-format
msgid "Invalid RPM package %s requested"
msgstr ""

#: ../server/rhnPackage.py:112
msgid "Package not found"
msgstr ""

#: ../server/rhnServer/server_class.py:97
#, python-format
msgid "Architecture `%s' is not supported"
msgstr ""

#: ../server/rhnServer/server_token.py:78
#, python-format
msgid "Token `%s' has more than one base channel assigned"
msgstr ""

#: ../server/rhnServer/server_token.py:80
msgid "Conflicting base channels"
msgstr ""

#: ../server/rhnServer/server_token.py:190
#, python-format
msgid "Failed to add server to group %s"
msgstr ""

#: ../server/rhnServer/server_token.py:503
#, python-format
msgid "Maximum usage count of %s reached"
msgstr ""

#: ../server/rhnServer/server_token.py:744
msgid ""
"Stacking of re-registration tokens with different base entitlements is not "
"supported"
msgstr ""

#: ../server/rhnServer/server_token.py:811
#, python-format
msgid "Could not find token '%s'"
msgstr ""

#. Cannot use activation keys from different orgs
#: ../server/rhnServer/server_token.py:843
msgid "Tokens from mismatching orgs"
msgstr ""

#. Two tokens with different kickstart sessions
#: ../server/rhnServer/server_token.py:853
msgid "Kickstart session mismatch"
msgstr ""

#: ../server/rhnServer/server_token.py:877
msgid "Stacking of re-registration tokens is not supported"
msgstr ""

#: ../server/rhnUser.py:289 ../server/rhnUser.py:292
msgid "Invalid username/password combination"
msgstr ""

#. nope, not reserved either
#: ../server/rhnUser.py:467
#, python-format
msgid "Username `%s' has not been reserved"
msgstr ""

#. New accounts have to specify an e-mail address
#: ../server/rhnUser.py:473
msgid "E-mail address not specified"
msgstr ""

#: ../server/rhnUser.py:509
#, python-format
msgid "username should be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:512
#, python-format
msgid "username should be less than %d characters"
msgstr ""

#: ../server/rhnUser.py:523
#, python-format
msgid "username = `%s', invalid character `%s'"
msgstr ""

#: ../server/rhnUser.py:542
#, python-format
msgid "Please limit your e-mail address to %s chars"
msgstr ""

#: ../server/rhnUser.py:623
#, python-format
msgid "password must be at least %d characters"
msgstr ""

#: ../server/rhnUser.py:626
#, python-format
msgid "Password must be shorter than %d characters"
msgstr ""

#: ../server/rhnUser.py:644
#, python-format
msgid "password contains character `%s'"
msgstr ""

#: ../server/rhnUser.py:651
#, python-format
msgid "username should be at least %d characters long"
msgstr ""

#: ../server/rhnUser.py:662
#, python-format
msgid "Cannot register usernames ending with %s"
msgstr ""

#. 0-999: Red Hat client/client-like interaction errors:
#: ../common/rhnException.py:53
msgid "This does not appear to be a valid username."
msgstr ""

#: ../common/rhnException.py:54
msgid "Invalid username and password combination."
msgstr ""

#: ../common/rhnException.py:55
msgid "This login is already taken, or the password is incorrect."
msgstr ""

#: ../common/rhnException.py:56
msgid "Permission denied."
msgstr ""

#: ../common/rhnException.py:57
msgid "Object not found."
msgstr ""

#: ../common/rhnException.py:58
msgid "Invalid System Digital ID."
msgstr ""

#: ../common/rhnException.py:59
msgid "Invalid System Credentials."
msgstr ""

#: ../common/rhnException.py:60
msgid "Could not retrieve user data from database."
msgstr ""

#: ../common/rhnException.py:61
msgid "Valid username required."
msgstr ""

#: ../common/rhnException.py:62
msgid "Valid password required."
msgstr ""

#: ../common/rhnException.py:63
msgid "Minimum username length violation."
msgstr ""

#: ../common/rhnException.py:64
msgid "Minimum password length violation."
msgstr ""

#: ../common/rhnException.py:65
msgid "The username contains invalid characters."
msgstr ""

#: ../common/rhnException.py:66
msgid "File not found."
msgstr ""

#: ../common/rhnException.py:67
msgid "Architecture and OS version combination is not supported."
msgstr ""

#: ../common/rhnException.py:68
msgid "Could not retrieve system data from database."
msgstr ""

#: ../common/rhnException.py:69
msgid "Invalid arguments passed to function."
msgstr ""

#: ../common/rhnException.py:70
msgid "Unable to retrieve requested entry."
msgstr ""

#: ../common/rhnException.py:71
msgid "Could not update database entry."
msgstr ""

#: ../common/rhnException.py:72
msgid "Unsupported server architecture."
msgstr ""

#: ../common/rhnException.py:73
#, python-format
msgid ""
"\n"
"     The anonymous server functionality is no longer available.\n"
"\n"
"     Please re-register this system by running mgr_register as root.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:81
msgid "Record not available in the database."
msgstr ""

#: ../common/rhnException.py:82
msgid "Invalid value for entry."
msgstr ""

#: ../common/rhnException.py:83
#, python-format
msgid ""
"\n"
"     This system does not have a valid entitlement for SUSE Manager.\n"
"     Please visit https://%(hostname)s/rhn/systems/SystemEntitlements.do\n"
"     or login at https://%(hostname)s, and from the \"Overview\" tab,\n"
"     select \"Subscription Management\" to enable the service for this "
"system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:89
msgid "Channel error"
msgstr ""

#: ../common/rhnException.py:90
msgid "Client session token is invalid."
msgstr ""

#: ../common/rhnException.py:91
msgid "Client session token has expired."
msgstr ""

#: ../common/rhnException.py:92
msgid "You are not authorized to retrieve the requested object."
msgstr ""

#: ../common/rhnException.py:93
msgid "Invalid action"
msgstr ""

#: ../common/rhnException.py:94
msgid "You are not allowed to perform administrative tasks on this system."
msgstr ""

#: ../common/rhnException.py:96
msgid "The system is already subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:97
msgid "The system is not currently subscribed to the specified channel."
msgstr ""

#: ../common/rhnException.py:98
msgid "The specified channel does not exist."
msgstr ""

#: ../common/rhnException.py:99
msgid "Invalid channel version."
msgstr ""

#: ../common/rhnException.py:100
msgid ""
"\n"
"     User group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     user account. Please check with the organization administrator for "
"your\n"
"     account if the maximum number of users allowed to subscribe to server "
"needs\n"
"     to be changed.\n"
"     "
msgstr ""

#: ../common/rhnException.py:108
msgid ""
"\n"
"     System group membership limits exceeded.\n"
"\n"
"     The current settings for your account do not allow you to add another\n"
"     system profile. Please check with the organization administrator for "
"your\n"
"     account for modifying the maximum number of system profiles that can "
"be\n"
"     subscribed to your account.\n"
"     "
msgstr ""

#: ../common/rhnException.py:116
msgid ""
"\n"
"     Invalid architecture.\n"
"\n"
"     The architecture of the package is not supported by\n"
"     "
msgstr ""

#: ../common/rhnException.py:121
msgid "Invalid RPM header"
msgstr ""

#: ../common/rhnException.py:122
msgid ""
"\n"
"    This system is already registered as a Salt Minion. If you want to "
"register it as a traditional client\n"
"    please delete it first via the web UI or API and then register it using "
"the traditional tools.\n"
"    "
msgstr ""

#. For the uploading tools
#: ../common/rhnException.py:127
msgid "Invalid information uploaded to the server"
msgstr ""

#: ../common/rhnException.py:128
msgid "Error uploading network interfaces configuration."
msgstr ""

#: ../common/rhnException.py:129
msgid ""
"\n"
"     Package Upload Failed due to uniqueness constraint violation.\n"
"     Make sure the package does not have any duplicate dependencies or\n"
"     does not already exists on the server\n"
"     "
msgstr ""

#: ../common/rhnException.py:134
msgid ""
"\n"
"     The --force rhnpush option is disabled on this server.\n"
"     Please contact your SUSE Manager administrator for more help.\n"
"     "
msgstr ""

#. 60-70: token errors
#: ../common/rhnException.py:140
msgid ""
"\n"
"     The activation token specified could not be found on the server.\n"
"     Please retry with a valid key.\n"
"     "
msgstr ""

#: ../common/rhnException.py:144
msgid "Too many systems registered using this registration token"
msgstr ""

#: ../common/rhnException.py:145
msgid "Token contains invalid, obsoleted or insufficient settings"
msgstr ""

#: ../common/rhnException.py:146
msgid "Conflicting activation tokens"
msgstr ""

#. 70-80: channel subscription errors
#: ../common/rhnException.py:149
msgid ""
"\n"
"     No matching base channel found for your system.\n"
"     "
msgstr ""

#: ../common/rhnException.py:152
msgid ""
"\n"
"     You do not have subscription permission to the designated channel.\n"
"     Please refer to your organization's channel or organization\n"
"     administrators for further details.\n"
"     "
msgstr ""

#: ../common/rhnException.py:157
msgid "You can not unsubscribe from base channel."
msgstr ""

#: ../common/rhnException.py:158
msgid "SUSE Manager or Proxy channel can not be subscribed."
msgstr ""

#. 80-90: server group errors
#: ../common/rhnException.py:161
msgid "There was an error while trying to join the system to its groups"
msgstr ""

#. 90-100: entitlement errors
#: ../common/rhnException.py:164
msgid "Unable to entitle system"
msgstr ""

#. 100-109: e-mail and uuid related faults
#: ../common/rhnException.py:167
msgid "Maximum e-mail length violation."
msgstr ""

#: ../common/rhnException.py:168
msgid "This system has been previously registered."
msgstr ""

#: ../common/rhnException.py:169
msgid "Invalid username"
msgstr ""

#. 140-159 applet errors
#: ../common/rhnException.py:172
msgid "Unable to look up server"
msgstr ""

#. 160-179: OSAD errors
#: ../common/rhnException.py:175
msgid "Required argument is missing"
msgstr ""

#. 600-699: RHEL5+ EN errors
#: ../common/rhnException.py:178
msgid "No entitlement information tied to hardware"
msgstr ""

#: ../common/rhnException.py:179
msgid "Installation number is not entitling"
msgstr ""

#. 700-799: Additional user input verification errors.
#: ../common/rhnException.py:182
msgid "Maximum username length violation"
msgstr ""

#: ../common/rhnException.py:183
msgid "Maximum password length violation"
msgstr ""

#: ../common/rhnException.py:184
msgid "This user has read only API access. Action denied."
msgstr ""

#: ../common/rhnException.py:186
msgid "System Name cannot be less than 1 character"
msgstr ""

#. 1000-1999: Proxy specific errors:
#. issued by a Proxy to the client
#: ../common/rhnException.py:190
msgid "SUSE Manager Proxy error."
msgstr ""

#: ../common/rhnException.py:191
msgid "SUSE Manager Proxy unable to login."
msgstr ""

#. issued by a SUSE Manager Server/Satellite to the proxy
#: ../common/rhnException.py:193
msgid ""
"\n"
"     SUSE Manager Proxy system ID does not match a Spacewalk Proxy Server\n"
"     in the database.\n"
"     "
msgstr ""

#: ../common/rhnException.py:197
msgid "SUSE Manager Proxy session token is invalid."
msgstr ""

#: ../common/rhnException.py:198
msgid "SUSE Manager Proxy session token has expired."
msgstr ""

#. 2000-2999: Red Hat Satellite specific errors:
#: ../common/rhnException.py:202
msgid ""
"\n"
"      user creation is not allowed via mgr_register;\n"
"     please contact your sysadmin to have your account created.\n"
"     "
msgstr ""

#: ../common/rhnException.py:206
msgid ""
"\n"
"     This SUSE Manager server is not allowed to use Inter Server Sync on "
"this server\n"
"     "
msgstr ""

#: ../common/rhnException.py:209
msgid ""
"\n"
"     Inter Server Sync is disabled on this SUSE Manager Server.\n"
"     "
msgstr ""

#. 3000-3999: XML dumper errors:
#: ../common/rhnException.py:214
msgid "Invalid datatype passed"
msgstr ""

#: ../common/rhnException.py:215
msgid "Unable to retrieve channel"
msgstr ""

#: ../common/rhnException.py:216
msgid "Unable to retrieve package"
msgstr ""

#: ../common/rhnException.py:217
msgid "Unable to retrieve erratum"
msgstr ""

#: ../common/rhnException.py:218
msgid "File is missing"
msgstr ""

#: ../common/rhnException.py:219
msgid "Function retrieval error"
msgstr ""

#: ../common/rhnException.py:220
msgid "Function execution error"
msgstr ""

#: ../common/rhnException.py:221
msgid "Missing version string"
msgstr ""

#: ../common/rhnException.py:222
msgid "Invalid version string"
msgstr ""

#: ../common/rhnException.py:223
msgid "Mismatching versions"
msgstr ""

#: ../common/rhnException.py:224
msgid "Invalid channel version"
msgstr ""

#: ../common/rhnException.py:225
msgid "No comps file for channel"
msgstr ""

#: ../common/rhnException.py:226
msgid "Unable to retrieve comps file"
msgstr ""

#. 4000 - 4999: config management errors
#: ../common/rhnException.py:229
msgid "Configuration action missing"
msgstr ""

#: ../common/rhnException.py:230
msgid "File too large"
msgstr ""

#: ../common/rhnException.py:231
msgid "File contains binary data"
msgstr ""

#: ../common/rhnException.py:232
msgid "Configuration channel is not empty"
msgstr ""

#: ../common/rhnException.py:233
msgid "Permission error"
msgstr ""

#: ../common/rhnException.py:234
msgid "Content missing for configuration file"
msgstr ""

#: ../common/rhnException.py:235
msgid "Template delimiters not specified"
msgstr ""

#: ../common/rhnException.py:236
msgid "Configuration channel does not exist"
msgstr ""

#: ../common/rhnException.py:237
msgid "Configuration channel already exists"
msgstr ""

#: ../common/rhnException.py:238
msgid "File missing from configuration channel"
msgstr ""

#: ../common/rhnException.py:239
msgid "Different revision of this file is uploaded"
msgstr ""

#: ../common/rhnException.py:240
msgid "File already uploaded to configuration channel"
msgstr ""

#: ../common/rhnException.py:241
msgid "File size exceeds remaining quota space"
msgstr ""

#: ../common/rhnException.py:242
msgid "Full path of file must be specified"
msgstr ""

#: ../common/rhnException.py:243
msgid "Invalid revision number"
msgstr ""

#: ../common/rhnException.py:244
msgid "Cannot compare files of different file type"
msgstr ""

#. 5000 - 5999: client content uploading errors
#. 5000 - 5099: crash reporting errors
#: ../common/rhnException.py:248
msgid "Crash information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:249
msgid "Crash file information is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:250
msgid "Error composing crash directory path"
msgstr ""

#: ../common/rhnException.py:251
msgid "Error composing crash file path"
msgstr ""

#: ../common/rhnException.py:252 ../common/rhnException.py:259
msgid "Invalid content encoding"
msgstr ""

#: ../common/rhnException.py:253
msgid "Invalid crash name"
msgstr ""

#: ../common/rhnException.py:254
msgid "Crash reporting is disabled for this organization"
msgstr ""

#. 5100 - 5199: scap results reporting error
#: ../common/rhnException.py:256
msgid "SCAP results file transfer is invalid or incomplete"
msgstr ""

#: ../common/rhnException.py:257
msgid "Error composing directory path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:258
msgid "Error composing file path for detailed SCAP results"
msgstr ""

#: ../common/rhnException.py:306
msgid ""
"\n"
"     An error has occurred while processing your request. If this problem\n"
"     persists please enter a bug report at scc.suse.com.\n"
"     If you choose to submit the bug report, please be sure to include\n"
"     details of what you were trying to do when this error occurred and\n"
"     details on how to reproduce this problem.\n"
msgstr ""

#: ../common/rhnException.py:358
#, python-format
msgid ""
"Error Message:\n"
"    %s\n"
msgstr ""

#: ../common/rhnException.py:360
#, python-format
msgid "Error Class Code: %s\n"
msgstr ""

#: ../common/rhnException.py:363
#, python-format
msgid "Error Class Info: %s\n"
msgstr ""

#: ../common/rhnException.py:365
#, python-format
msgid "Explanation: %s"
msgstr ""

#: ../common/rhnTB.py:205
#, python-format
msgid "ERROR: %s %s: %s"
msgstr ""

#: ../common/rhnTB.py:207
#, python-format
msgid "TRACEBACK: %s"
msgstr ""

#: ../satellite_tools/disk_dumper/iss.py:1294
#: ../satellite_tools/disk_dumper/iss.py:1298
#, python-format
msgid "format of %s should be at least YYYYMMDD.\n"
msgstr ""

#: ../satellite_tools/messages.py:26
#, python-format
msgid ""
"\n"
"ERROR: executing step %s. Error is:\n"
"%s\n"
msgstr ""

#: ../satellite_tools/messages.py:31
#, python-format
msgid ""
"\n"
"ERROR: there was a problem accessing the channel data from your temporary\n"
"       repository. Did you migrate all of the data from the channel ISOs\n"
"       do this directory? If so, please recheck the channels ISOs, ensure\n"
"       that you have them all, and then iteratively remount and repopulate\n"
"       the temporary repository (%s).\n"
msgstr ""

#: ../satellite_tools/messages.py:39
#, python-format
msgid ""
"\n"
"ERROR: there was a problem synchronizing the information.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:44
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       Depending on the specific error details, please review your "
"configuration,\n"
"       basic network connectivity, and/or name resolution, and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:51
#, python-format
msgid ""
"\n"
"ERROR: There was a problem communicating with the ISS Master.\n"
"       If the master satellite is older than v5.3, it does not have ISS "
"capability.\n"
"       Otherwise, depending on the specific error details, please review "
"your\n"
"       configuration, basic network connectivity, and/or name resolution, "
"and try again.\n"
"       Error message: %s\n"
msgstr ""

#: ../satellite_tools/messages.py:59
#, python-format
msgid ""
"\n"
"ERROR: a child-channel cannot be synced without its parent being synced as\n"
"       well. A parent needs to be either (a) previously synced or (b) "
"synced\n"
"       in tandem with the desired child-channel. Missing parents for this\n"
"       transaction:\n"
"       %s\n"
msgstr ""

#: ../satellite_tools/messages.py:67
#, python-format
msgid ""
"\n"
"ERROR: you are not entitled to sync a channel in this set of channels.\n"
"Please contact your SUSE Manager contact\n"
"%s"
msgstr ""

#: ../satellite_tools/messages.py:72
#, python-format
msgid "  ERROR: not enough free space (%s KB) on device."
msgstr ""

#: ../satellite_tools/messages.py:74
#, python-format
msgid "    %3d/%s Fetch successful: %s (%s bytes)"
msgstr ""

#: ../satellite_tools/messages.py:75
#, python-format
msgid "    Extinct package:  %s"
msgstr ""

#: ../satellite_tools/messages.py:76
#, python-format
msgid "   Total size: %s"
msgstr ""

#: ../satellite_tools/messages.py:77
#, python-format
msgid "      Downloaded %s of %s. Estimated remaining time: %s"
msgstr ""

#: ../satellite_tools/messages.py:78
#, python-format
msgid "    Fetch unsuccessful: %s"
msgstr ""

#: ../satellite_tools/messages.py:79
#, python-format
msgid "   RPM fetch summary: %s"
msgstr ""

#: ../satellite_tools/messages.py:80
#, python-format
msgid "       success: %d"
msgstr ""

#: ../satellite_tools/messages.py:81
#, python-format
msgid "       failed:  %d"
msgstr ""

#: ../satellite_tools/messages.py:82
#, python-format
msgid "       extinct: %d"
msgstr ""

#: ../satellite_tools/messages.py:84
#, python-format
msgid "   Retrieving / parsing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:85
#, python-format
msgid "   Retrieving / parsing errata data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:86
#, python-format
msgid "   Retrieving / parsing kickstart data: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:87
#, python-format
msgid "   Retrieving / parsing kickstart tree files: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:88
#, python-format
msgid "   Importing *relevant* package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:89
msgid "   * WARNING: this may be a slow process."
msgstr ""

#: ../satellite_tools/messages.py:90
msgid "Linking packages to channels"
msgstr ""

#: ../satellite_tools/messages.py:91
#, python-format
msgid "   Importing *relevant* errata: %s (%s)"
msgstr ""

#: ../satellite_tools/messages.py:92
msgid "   No new kickstartable tree to import"
msgstr ""

#: ../satellite_tools/messages.py:93
#, python-format
msgid "Importing kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/messages.py:94
#, python-format
msgid "Imported kickstartable trees (%d)"
msgstr ""

#: ../satellite_tools/reposync.py:111 ../satellite_tools/satsync.py:439
msgid "+++ sending log as an email +++"
msgstr ""

#: ../satellite_tools/reposync.py:114
#, python-format
msgid "%s sync. report from %s"
msgstr ""

#: ../satellite_tools/reposync.py:124 ../satellite_tools/satsync.py:449
msgid "+++ email requested, but there is nothing to send +++"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:198
#, python-format
msgid ""
"\"%s\" (specified in commandline)\n"
"could not be opened and read:\n"
"%s"
msgstr ""

#: ../satellite_tools/rhn_satellite_activate.py:205
#, python-format
msgid ""
"\"%s\" could not be opened\n"
"and/or written to:\n"
"%s"
msgstr ""

#: ../satellite_tools/satsync.py:258
#, python-format
msgid "No handler for step %s"
msgstr ""

#. Try one more time - this time it should be faster since
#. everything should be cached
#: ../satellite_tools/satsync.py:270
msgid "Environment changed, trying again..."
msgstr ""

#: ../satellite_tools/satsync.py:277
msgid "ERROR: Encountered IntegrityError: \n"
msgstr ""

#: ../satellite_tools/satsync.py:285
msgid "Repeated failures"
msgstr ""

#: ../satellite_tools/satsync.py:290
#, python-format
msgid ""
"    Import complete:\n"
"        Begin time: %s\n"
"        End time:   %s\n"
"        Elapsed:    %s\n"
"          "
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "hours"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "minutes"
msgstr ""

#: ../satellite_tools/satsync.py:311
msgid "seconds"
msgstr ""

#: ../satellite_tools/satsync.py:357
msgid ""
"ERROR: The dump is missing package data, use --no-rpms to skip this step or "
"fix the content to include package data."
msgstr ""

#. the orgs() method doesn't exist; that's fine we just
#. won't sync the orgs
#: ../satellite_tools/satsync.py:404
msgid "The SUSE Manager master does not support syncing orgs data."
msgstr ""

#: ../satellite_tools/satsync.py:404
msgid "Skipping..."
msgstr ""

#: ../satellite_tools/satsync.py:442
#, python-format
msgid "SUSE Manager Inter Server sync. report from %s"
msgstr ""

#: ../satellite_tools/satsync.py:521
msgid " - file-system synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:533 ../satellite_tools/satsync.py:541
msgid " - live synchronization"
msgstr ""

#: ../satellite_tools/satsync.py:534
#, python-brace-format
msgid ""
"ERROR: Live content synchronizing with RHN Classic Hosted is no longer "
"supported.\n"
"Please use the cdn-sync command instead unless you are attempting to sync "
"from another {PRODUCT_NAME} via Inter-Server-Sync (ISS), or from local "
"content on disk via Channel Dump ISOs."
msgstr ""

#: ../satellite_tools/satsync.py:542
#, python-format
msgid "   url: %s"
msgstr ""

#: ../satellite_tools/satsync.py:543
#, python-format
msgid "   debug/output level: %s"
msgstr ""

#: ../satellite_tools/satsync.py:553
msgid "ERROR: this server must be registered with SUSE Manager."
msgstr ""

#: ../satellite_tools/satsync.py:575
#, python-format
msgid "Retrieving / parsing %s data"
msgstr ""

#: ../satellite_tools/satsync.py:585 ../satellite_tools/satsync.py:600
msgid "*** SYSTEM INTERRUPT CALLED ***"
msgstr ""

#: ../satellite_tools/satsync.py:593
msgid "ERROR: fatal parser exception occurred "
msgstr ""

#: ../satellite_tools/satsync.py:594
#, python-format
msgid "(line: %s, col: %s msg: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:598
#, python-format
msgid "ERROR: parser exception occurred: %s"
msgstr ""

#: ../satellite_tools/satsync.py:603
msgid "ERROR: exception (during parse) occurred: "
msgstr ""

#: ../satellite_tools/satsync.py:604
#, python-format
msgid ""
"   Encountered some errors with %s data (see logs (%s) for more information)"
msgstr ""

#: ../satellite_tools/satsync.py:606
#, python-format
msgid "   Encountered some errors with %s data:"
msgstr ""

#: ../satellite_tools/satsync.py:607
#, python-format
msgid "   ------- %s PARSE/IMPORT ERROR -------"
msgstr ""

#: ../satellite_tools/satsync.py:609
msgid "   ---------------------------------------"
msgstr ""

#: ../satellite_tools/satsync.py:612
#, python-format
msgid "%s data complete"
msgstr ""

#: ../satellite_tools/satsync.py:665
msgid "Retrieving / parsing channel data"
msgstr ""

#: ../satellite_tools/satsync.py:718
msgid "Channel data complete"
msgstr ""

#: ../satellite_tools/satsync.py:736
#, python-format
msgid "%10s import from %s"
msgstr ""

#: ../satellite_tools/satsync.py:739
#, python-format
msgid "%10s import from %s - %s"
msgstr ""

#: ../satellite_tools/satsync.py:743
#, python-format
msgid "%10s"
msgstr ""

#: ../satellite_tools/satsync.py:750
msgid "p"
msgstr ""

#: ../satellite_tools/satsync.py:752
msgid "."
msgstr ""

#: ../satellite_tools/satsync.py:758
msgid "   p = previously imported/synced channel"
msgstr ""

#: ../satellite_tools/satsync.py:759
msgid "   . = channel not yet imported/synced"
msgstr ""

#: ../satellite_tools/satsync.py:765
msgid "   e = channel no longer supported (end-of-service)"
msgstr ""

#: ../satellite_tools/satsync.py:767
msgid "   ? = channel label invalid --- typo?"
msgstr ""

#: ../satellite_tools/satsync.py:771
#, python-format
msgid "   %s:"
msgstr ""

#: ../satellite_tools/satsync.py:772
#, python-format
msgid "      %s %-40s %4s %s"
msgstr ""

#: ../satellite_tools/satsync.py:773
msgid "base-channels"
msgstr ""

#: ../satellite_tools/satsync.py:786 ../satellite_tools/satsync.py:1603
msgid "NONE RELEVANT"
msgstr ""

#: ../satellite_tools/satsync.py:808
msgid "end-of-service"
msgstr ""

#: ../satellite_tools/satsync.py:809
msgid "e"
msgstr ""

#: ../satellite_tools/satsync.py:815
msgid "   typos:"
msgstr ""

#: ../satellite_tools/satsync.py:816
msgid "?"
msgstr ""

#: ../satellite_tools/satsync.py:831
#, python-format
msgid "XXX: imported channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:832
#, python-format
msgid "XXX:   cached channels: %s"
msgstr ""

#: ../satellite_tools/satsync.py:837
msgid "XXX: list channels called"
msgstr ""

#: ../satellite_tools/satsync.py:855
msgid "ERROR: these channels either do not exist or are not available:"
msgstr ""

#: ../satellite_tools/satsync.py:859
#, python-format
msgid "       (to see a list of channel labels: %s --list-channels)"
msgstr ""

#: ../satellite_tools/satsync.py:904
#, python-format
msgid "   Retrieving / parsing short package metadata: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:965
#, python-format
msgid "Diffing package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:971 ../satellite_tools/satsync.py:1254
msgid "Diffing:    "
msgstr ""

#: ../satellite_tools/satsync.py:988
msgid "ERROR: incremental dump skipped"
msgstr ""

#: ../satellite_tools/satsync.py:1079
msgid "Downloading rpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1084
#, python-format
msgid "   Fetching any missing RPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1085 ../satellite_tools/satsync.py:1153
msgid "NONE MISSING"
msgstr ""

#: ../satellite_tools/satsync.py:1094
msgid "Processing rpm packages complete"
msgstr ""

#: ../satellite_tools/satsync.py:1121
msgid "Downloading package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1146
msgid "Downloading srpm packages"
msgstr ""

#: ../satellite_tools/satsync.py:1152
#, python-format
msgid "   Fetching any missing SRPMs: %s (%s)"
msgstr ""

#: ../satellite_tools/satsync.py:1249
#, python-format
msgid "Diffing source package metadata (what's missing locally?): %s"
msgstr ""

#: ../satellite_tools/satsync.py:1260
msgid "Downloading source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1338 ../satellite_tools/satsync.py:2027
#, python-format
msgid "Unable to save file %s: %s"
msgstr ""

#. for
#. Retried a number of times and it still failed; log the
#. file as being failed and move on
#: ../satellite_tools/satsync.py:1345
#, python-format
msgid "Failed to fetch file %s"
msgstr ""

#: ../satellite_tools/satsync.py:1350
msgid "Downloading kickstartable trees metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1365
msgid "Downloading kickstartable trees files"
msgstr ""

#: ../satellite_tools/satsync.py:1504
#, python-format
msgid "Grabbing all patches for channel %s"
msgstr ""

#: ../satellite_tools/satsync.py:1554
msgid "Downloading patch data"
msgstr ""

#: ../satellite_tools/satsync.py:1556
msgid "Forcing download of all patch data for requested channels."
msgstr ""

#: ../satellite_tools/satsync.py:1571
msgid "Downloading patch data complete"
msgstr ""

#: ../satellite_tools/satsync.py:1576 ../satellite_tools/satsync.py:1597
msgid "Downloading:"
msgstr ""

#: ../satellite_tools/satsync.py:1579
msgid " - complete"
msgstr ""

#: ../satellite_tools/satsync.py:1624
msgid "Importing source package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1627
msgid "Importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:1635
msgid "Importing:  "
msgstr ""

#. not in the cache
#: ../satellite_tools/satsync.py:1703
msgid ""
"Package Not Found in Cache, Clear the Cache "
"to                                  Regenerate it."
msgstr ""

#: ../satellite_tools/satsync.py:1709
msgid "Importing channel patches"
msgstr ""

#: ../satellite_tools/satsync.py:1714
#, python-format
msgid "Importing %s patches for channel %s."
msgstr ""

#. Incomplete configuration
#: ../satellite_tools/satsync.py:2113
msgid "ERROR: server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2117
#, python-format
msgid "ERROR: server.mount_point %s do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2122
#, python-format
msgid "ERROR: path under server.mount_point (%s)  do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2199
#, python-format
msgid "Commandline: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2202
#, python-format
msgid ""
"DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).\"man "
"satellite-sync\" for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2205
msgid "alternative SSL CA Cert (fullpath to cert file)"
msgstr ""

#: ../satellite_tools/satsync.py:2207
msgid "process data for this channel only"
msgstr ""

#: ../satellite_tools/satsync.py:2209
msgid ""
"disk dump will be considered to be a full export; see \"man satellite-sync\" "
"for more information."
msgstr ""

#: ../satellite_tools/satsync.py:2212
msgid "existing custom channels will also be synced (unless -c is used)"
msgstr ""

#: ../satellite_tools/satsync.py:2214
#, python-format
msgid ""
"override debug level set in /etc/rhn/rhn.conf (which is currently set at %s)."
msgstr ""

#: ../satellite_tools/satsync.py:2216
#, python-format
msgid "requested version of XML dump (default: %s)"
msgstr ""

#: ../satellite_tools/satsync.py:2218
msgid "e-mail a report of what was synced/imported"
msgstr ""

#: ../satellite_tools/satsync.py:2220
msgid "forcibly process all (not a diff of) patch metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2222
msgid "Do not use an http proxy under any circumstances."
msgstr ""

#: ../satellite_tools/satsync.py:2224
msgid "alternative http proxy (hostname:port)"
msgstr ""

#: ../satellite_tools/satsync.py:2226
msgid "alternative http proxy username"
msgstr ""

#: ../satellite_tools/satsync.py:2228
msgid "alternative http proxy password"
msgstr ""

#: ../satellite_tools/satsync.py:2230
msgid "parent SUSE Manager to import content from"
msgstr ""

#: ../satellite_tools/satsync.py:2232
msgid "list all available channels and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2234
msgid "help on all error codes mgr-inter-sync returns"
msgstr ""

#: ../satellite_tools/satsync.py:2236
msgid "source mount point for import - disk update only"
msgstr ""

#: ../satellite_tools/satsync.py:2238
msgid "do not process patch data"
msgstr ""

#: ../satellite_tools/satsync.py:2240
msgid "do not process kickstart data (provisioning only)"
msgstr ""

#: ../satellite_tools/satsync.py:2242
msgid "do not process full package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2244
msgid "do not download, or process any RPMs"
msgstr ""

#: ../satellite_tools/satsync.py:2246
msgid "turn off SSL (not recommended)"
msgstr ""

#: ../satellite_tools/satsync.py:2248
msgid "org to which the sync imports data. defaults to the admin account"
msgstr ""

#: ../satellite_tools/satsync.py:2250
msgid "print the configuration and exit"
msgstr ""

#: ../satellite_tools/satsync.py:2252
msgid "alternative server with which to connect (hostname)"
msgstr ""

#: ../satellite_tools/satsync.py:2254
msgid "synchronize to this step (man satellite-sync for more info)"
msgstr ""

#: ../satellite_tools/satsync.py:2256
msgid "write complete data to tempfile before streaming to remainder of app"
msgstr ""

#: ../satellite_tools/satsync.py:2258
msgid "DEBUG ONLY: alternative path to digital system id"
msgstr ""

#: ../satellite_tools/satsync.py:2260
msgid "alternative email address(es) for sync output (--email option)"
msgstr ""

#: ../satellite_tools/satsync.py:2262
msgid "do not remove rpms when importing from local dump"
msgstr ""

#: ../satellite_tools/satsync.py:2264
msgid ""
"the fully qualified domain name of the master Satellite. Valid with --mount-"
"point only. Required if you want to import org data and channel permissions."
msgstr ""

#: ../satellite_tools/satsync.py:2274
#, python-format
msgid "ERROR: these arguments make no sense in this context (try --help): %s"
msgstr ""

#. An SQL error is fatal... crash and burn
#: ../satellite_tools/satsync.py:2286
#, python-format
msgid "ERROR: Can't connect to the database: %s"
msgstr ""

#: ../satellite_tools/satsync.py:2287
msgid "ERROR: Check if your database is running."
msgstr ""

#: ../satellite_tools/satsync.py:2322
#, python-format
msgid "ERROR: --debug-level takes an in integer value within the range %s."
msgstr ""

#: ../satellite_tools/satsync.py:2324
msgid "  0  - little logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2325
msgid "  1  - minimal logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2326
msgid "  2  - normal level of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2327
msgid "  3  - lots of logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2328
msgid "  4+ - excessive logging/messaging."
msgstr ""

#: ../satellite_tools/satsync.py:2341
msgid "ERROR: The --master option is only valid with the --mount-point option"
msgstr ""

#: ../satellite_tools/satsync.py:2351
#, python-format
msgid "ERROR: Unable to lookup Org Id %s"
msgstr ""

#: ../satellite_tools/satsync.py:2360
msgid ""
"WARNING: --list-channels option overrides any --step option. --step ignored."
msgstr ""

#: ../satellite_tools/satsync.py:2375
#, python-format
msgid ""
"ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail."
msgstr ""

#: ../satellite_tools/satsync.py:2407
msgid ""
"ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
"then mgr-inter-sync -c chn0 -c chn1..."
msgstr ""

#. int(None) --> TypeError
#. int('a')  --> ValueError
#: ../satellite_tools/satsync.py:2457 ../satellite_tools/satsync.py:2461
msgid "ERROR: --batch-size must have a value within the range: 1..50"
msgstr ""

#: ../satellite_tools/satsync.py:2469
#, python-format
msgid "ERROR: no such directory %s"
msgstr ""

#: ../satellite_tools/satsync.py:2474
msgid "Error Codes: Returned codes means:"
msgstr ""

#: ../satellite_tools/satsync.py:2475
msgid " -1  - Could not lock file or KeyboardInterrupt or SystemExit"
msgstr ""

#: ../satellite_tools/satsync.py:2476
msgid "  0  - User interrupted or intentional exit"
msgstr ""

#: ../satellite_tools/satsync.py:2477
msgid "  1  - attempting to run more than one instance of mgr-inter-sync."
msgstr ""

#: ../satellite_tools/satsync.py:2478
msgid "  2  - Unable to find synchronization tools."
msgstr ""

#: ../satellite_tools/satsync.py:2479
msgid "  3  - a general socket exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2480
msgid "  4  - an SSL error occurred. Recheck your SSL settings."
msgstr ""

#: ../satellite_tools/satsync.py:2481
msgid "  5  - ISS error"
msgstr ""

#: ../satellite_tools/satsync.py:2482
msgid "  6  - unhandled exception occurred"
msgstr ""

#: ../satellite_tools/satsync.py:2483
msgid "  7  - unknown sync error"
msgstr ""

#: ../satellite_tools/satsync.py:2484
msgid "  8  - ERROR: must be root to execute"
msgstr ""

#: ../satellite_tools/satsync.py:2485
msgid "  9  - rpclib fault during synchronization init"
msgstr ""

#: ../satellite_tools/satsync.py:2486
msgid "  10 - synchronization init error"
msgstr ""

#: ../satellite_tools/satsync.py:2487
msgid "  11 - Error parsing XML stream"
msgstr ""

#: ../satellite_tools/satsync.py:2488
msgid "  12 - Channel do not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2489
msgid "  13 - SQL error during importing package metadata"
msgstr ""

#: ../satellite_tools/satsync.py:2490
msgid "  14 - SQL error during linking channel packages"
msgstr ""

#: ../satellite_tools/satsync.py:2491
msgid "  15 - SQL error during xml processing"
msgstr ""

#: ../satellite_tools/satsync.py:2492
msgid "  16 - server.mount_point not set in the configuration file"
msgstr ""

#: ../satellite_tools/satsync.py:2493
msgid ""
"  17 - SQL error during retrieving the channels already imported in the SUSE "
"Manager database"
msgstr ""

#: ../satellite_tools/satsync.py:2494
msgid "  18 - Wrong db connection string in rhn.conf"
msgstr ""

#: ../satellite_tools/satsync.py:2495
msgid "  19 - Bad arguments"
msgstr ""

#: ../satellite_tools/satsync.py:2496
msgid "  20 - Could not connect to db."
msgstr ""

#: ../satellite_tools/satsync.py:2497
msgid "  21 - Bad debug level"
msgstr ""

#: ../satellite_tools/satsync.py:2498
msgid "  22 - Not valid step"
msgstr ""

#: ../satellite_tools/satsync.py:2499
msgid "  24 - no such file"
msgstr ""

#: ../satellite_tools/satsync.py:2500
msgid "  25 - no such directory"
msgstr ""

#: ../satellite_tools/satsync.py:2501
msgid "  26 - mount_point does not exist"
msgstr ""

#: ../satellite_tools/satsync.py:2502
msgid "  27 - No such org"
msgstr ""

#: ../satellite_tools/satsync.py:2503
msgid "  28 - error: --master is only valid with --mount-point"
msgstr ""

#: ../satellite_tools/satsync.py:2510
#, python-format
msgid "ERROR: unknown dump version, try one of %s"
msgstr ""
 0707010000009A000081B40000000000000000000000015FBBE8EE00000E51000000000000000000000000000000000000001B00000000spacewalk-backend/pylintrc    # Backend Pylint configuration

[MASTER]

# Profiled execution.
profile=no

# Pickle collected data for later comparisons.
persistent=no


[MESSAGES CONTROL]

# Disable the message(s) with the given id(s).
disable=I0011,
	C0302,
	C0111,
	R0801,
	R0902,
	R0903,
	R0904,
	R0912,
	R0913,
	R0914,
	R0915,
	R0921,
	R0922,
	W0142,
	W0403,
	W0603,
	C1001,
	W0121,
	useless-else-on-loop,
	bad-whitespace,
	unpacking-non-sequence,
	superfluous-parens,
	cyclic-import,
	redefined-variable-type,
	no-else-return

[REPORTS]

# Set the output format. Available formats are text, parseable, colorized, msvs
# (visual studio) and html
output-format=parseable

# Include message's id in output
include-ids=yes

# Tells whether to display a full report or only the messages
reports=yes

# Template used to display messages. This is a python new-style format string
# used to format the message information. See doc for all details
msg-template="{path}:{line}: [{msg_id}({symbol}), {obj}] {msg}"


[VARIABLES]

# A regular expression matching names used for dummy variables (i.e. not used).
dummy-variables-rgx=_|dummy


[BASIC]

# Regular expression which should only match correct module names
#module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
module-rgx=([a-zA-Z_][a-zA-Z0-9_]+)$

# Regular expression which should only match correct module level names
const-rgx=(([a-zA-Z_][a-zA-Z0-9_]*)|(__.*__))$

# Regular expression which should only match correct class names
class-rgx=[a-zA-Z_][a-zA-Z0-9_]+$

# Regular expression which should only match correct function names
function-rgx=[a-z_][a-zA-Z0-9_]{,42}$

# Regular expression which should only match correct method names
method-rgx=[a-z_][a-zA-Z0-9_]{,42}$

# Regular expression which should only match correct instance attribute names
attr-rgx=[a-z_][a-zA-Z0-9_]{,30}$

# Regular expression which should only match correct argument names
argument-rgx=[a-z_][a-zA-Z0-9_]{,30}$

# Regular expression which should only match correct variable names
variable-rgx=[a-z_][a-zA-Z0-9_]{,30}$

# Regular expression which should only match correct list comprehension /
# generator expression variable names
inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$

# Regular expression which should only match correct class sttribute names
class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,42}|(__.*__))$

# Good variable names which should always be accepted, separated by a comma
good-names=i,j,k,ex,Run,_

# Bad variable names which should always be refused, separated by a comma
bad-names=foo,bar,baz,toto,tutu,tata

# List of builtins function names that should not be used, separated by a comma
bad-functions=apply,input


[DESIGN]

# Maximum number of arguments for function / method
max-args=10

# Maximum number of locals for function / method body
max-locals=20

# Maximum number of return / yield for function / method body
max-returns=6

# Maximum number of branch for function / method body
max-branchs=20

# Maximum number of statements in function / method body
max-statements=50

# Maximum number of parents for a class (see R0901).
max-parents=7

# Maximum number of attributes for a class (see R0902).
max-attributes=7

# Minimum number of public methods for a class (see R0903).
min-public-methods=1

# Maximum number of public methods for a class (see R0904).
max-public-methods=20


[CLASSES]


[FORMAT]

# Maximum number of characters on a single line.
max-line-length=120

# Maximum number of lines in a module
max-module-lines=1000

# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
# tab).
indent-string='    '


[MISCELLANEOUS]

# List of note tags to take in consideration, separated by a comma.
notes=
   0707010000009B000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000001B00000000spacewalk-backend/rhn-conf    0707010000009C000081B40000000000000000000000015FBBE8EE00000101000000000000000000000000000000000000002400000000spacewalk-backend/rhn-conf/Makefile   # Makefile for installation of the RHN server configuration files
#

# what is the backend top dir
TOP	= ..

INSTALL_FILES	= $(wildcard *.conf)
INSTALL_DEST	= /usr/share/rhn/config-defaults

include $(TOP)/Makefile.defs

install :: $(PREFIX)$(INSTALL_DEST)
   0707010000009D000081B40000000000000000000000015FBBE8EE00000362000000000000000000000000000000000000002400000000spacewalk-backend/rhn-conf/rhn.conf   # ** DO NOT EDIT **
# Default configuration options for the common code
#

#The product name
product_name = SUSE Manager

## unexposed
quiet_mail = 15

## exposed
debug = 1
traceback_mail = admin@example.com
log_file = /var/log/rhn/rhn.log

enable_snapshots = 1

## SSL for database (PostgreSQL) connection
db_ssl_enabled = 0
db_sslrootcert = /etc/rhn/postgresql-db-root-ca.cert

## apache document root dir
documentroot = #DOCUMENTROOT#

db_backend =
db_user =
db_password =
db_name =
db_host =
db_port =

# Adjust taskomatic jvm max memory 
# taskomatic.java.maxmemory=4096

# If set to 1 all generated repository metadata will be signed
sign_metadata = 0

# install types for which salt should be used for registration
salt_enabled_kickstart_install_types=rhel_8

# possible auto kick start package names(comma separated)
kickstart_packages = spacewalk-koan,salt
  0707010000009E000081B40000000000000000000000015FBBE8EE00000D51000000000000000000000000000000000000002B00000000spacewalk-backend/rhn-conf/rhn_server.conf    # ** DO NOT EDIT **
# Spacewalk config for all backend receivers
#

### unexposed ###
log_file        = /var/log/rhn/rhn_server.log
buffer_size     = 16384
ca_chain        = /usr/share/rhn/RHNS-CA-CERT

# Name of parent for ISS.
# # If left blank rhn_parent is taken by default.
# # This option can be overriden on satellite-sync command line.
iss_parent      =
iss_ca_chain    = /usr/share/rhn/RHN-ORG-TRUSTED-SSL-CERT

# Enable package uploads for same nvrea but different vendors.
enable_nvrea = 1

# Force package upload from the client through rhnpush
force_package_upload = 0

# Session token timeouts
# an hour
client_auth_timeout = 3600.0
# 6 hours
proxy_auth_timeout = 21600.0

# rpclib connection timeout
timeout = 600

# Directory location of cached packages lists. (Created automatically)
pkg_list_dir = /var/up2date/list

# In HOURS, if throttling how long is the grace period for free users.
# 7 days
throttle_grace_period = 168.0

### exposed ###
debug           = 1
traceback_mail  = user@example.com
quiet_mail      = 15

# username/password control (not recommended to change)
min_passwd_len = 5
max_passwd_len = 32
min_user_len   = 3
max_user_len   = 64
max_email_len  = 128
# Do not allow usernames with these suffixes
disallowed_suffixes =

# DB configuration options
# NLS_LANG
nls_lang = english.UTF8

# Directory location of top of package tree:
mount_point = /pub

# allow users to be created via rhnapp server?
disallow_user_creation = 1

# Force encrypted passwords in the database
encrypted_passwords = 0

# The string that is prepended in front of the org_id/name/v-r/a/ path
prepended_dir = packages

# PAM authentication, turned off by default
pam_auth_service =

# System wide message filename and on/off flag
message_to_all = /etc/rhn/message_to_all.txt
send_message_to_all = 0

# Do we compress RPM headers?
compress_headers = 1

# Do we check for disablement of entire orgs?
#disabled_org_check = 0

qos = 0

throttle = 0

# Freeloader throttling (time based)
throttle_freeloaders = 0
freeloader_throttle_start = 9
freeloader_throttle_end = 21

# Don't throttle graced and falling-from-grace'd orgs?
grace_no_throttle = 0

# Update the state machine upon server registration?
join_rhn = 0


# email users if they register a box to an End Of Life base channel
send_eol_mail = 0

# have error messages refer to the www.redhat.com website for things
# like product activation, etc
refer_to_www = 0

# Session secrets
session_secret_1 =
session_secret_2 =
session_secret_3 =
session_secret_4 =

# Satellite install?
satellite = 1
disconnected = 0

# Maximum size for a config file
maximum_config_file_size = 131072

# Session lifetime in seconds
session_lifetime = 1800

# To be initialized by the installer
secret_key =
jabber_server =

# base channel reset by default.
# set to '0' if base channel needs to be preserved
reset_base_channel = 0

# location relative to mount point for yum repomd files
repomd_path_prefix = rhn/repodata

# Default to not using taskomatic for repomd
use_taskomatic_repomd = 1

# list of checksum types, most prefered first
checksum_priority_list = sha512, sha384, sha256, sha1, md5

# Decide whether xmlWireSource can unzip 'on the fly', or
# if it should write everything to a tempfile first
# 0 = on-the-fly (current behavior), 1 = to-tempfile-first
# (overridden by --sync-to-temp on satellite-sync)
sync_to_temp = 0

sync_source_packages = 0
   0707010000009F000081B40000000000000000000000015FBBE8EE00000160000000000000000000000000000000000000002F00000000spacewalk-backend/rhn-conf/rhn_server_app.conf    # ** DO NOT EDIT **
# Spacewalk config for requests traveling through /APP receiver
#

## unexposed
log_file = /var/log/rhn/rhn_server_app.log

# If a channel contains more than this number of servers (in hosted), don't
# schedule the errata cache refresh; send an e-mail instead
max_channel_servers_for_errata_cache_refresh = 5000
## exposed
# -none-
070701000000A0000081B40000000000000000000000015FBBE8EE0000010F000000000000000000000000000000000000003200000000spacewalk-backend/rhn-conf/rhn_server_applet.conf # ** DO NOT EDIT **
# Spacewalk config for requests traveling through the /APPLET receiver
#

log_file = /var/log/rhn/rhn_server_applet.log
# 15 min for the applet checkin
checkin_interval = 900
# 5 min max offset for the applet checkin
checkin_interval_max_offset = 300
 070701000000A1000081B40000000000000000000000015FBBE8EE000000D6000000000000000000000000000000000000004200000000spacewalk-backend/rhn-conf/rhn_server_config-management-tool.conf # ** DO NOT EDIT **
# Spacewalk config for requests traveling through /APP receiver
#

## unexposed
log_file = /var/log/rhn/rhn_config_management_tool.log

## exposed

config_delim_start = {|
config_delim_end = |}
  070701000000A2000081B40000000000000000000000015FBBE8EE000000D1000000000000000000000000000000000000003D00000000spacewalk-backend/rhn-conf/rhn_server_config-management.conf  # ** DO NOT EDIT **
# Spacewalk config for requests traveling through /APP receiver
#

## unexposed
log_file = /var/log/rhn/rhn_config_management.log

## exposed

config_delim_start = {|
config_delim_end = |}
   070701000000A3000081B40000000000000000000000015FBBE8EE000002BF000000000000000000000000000000000000002F00000000spacewalk-backend/rhn-conf/rhn_server_iss.conf    # ** DO NOT EDIT **
# Spacewalk config for requests traveling through the /SAT receiver
# ISS - Inter Spacewalk Sync
# variables which affects live synchronization between two Spacewalk or 
# between Satellite and hosted.

# newest XML dump version we can import
xml_dump_version = 3.6

sat_cert_generation = 2

# Completely disable ISS.
# If set to 1, then no slave will be able to sync from this server
# this option does not affect ability to sync to this server from 
# another spacewalk (or hosted).
disable_iss=0

# Spacewalk config for requests traveling through the /SAT receiver
# on the server-side of the connection.
log_file = /var/log/rhn/rhn_server_sat.log
satellite_auth_timeout = 7200.0
 070701000000A4000081B40000000000000000000000015FBBE8EE00000434000000000000000000000000000000000000003500000000spacewalk-backend/rhn-conf/rhn_server_satellite.conf  # ** DO NOT EDIT **
# Configuration settings used by the Red Hat Satellite and the satellite-sync tool.
# (i.e., Red Hat Satellite specific)
#

# used by satellite/sync-tool:
log_file = /var/log/rhn/rhn_server_satellite.log

# Default mount point
mount_point = /var/spacewalk

# used by sync-tool:
rhn_metadata_handler = /SAT-DUMP
rhn_iss_metadata_handler = /SAT-DUMP-INTERNAL
rhn_xmlrpc_handler = /SAT
ca_chain = /usr/share/rhn/RHNS-CA-CERT
rhn_parent = satellite.rhn.redhat.com

sync_cache_dir = /var/cache/rhn/
http_proxy =
http_proxy_username =
http_proxy_password =
no_proxy =

# default cache_refresh_level
cache_refresh_level = 2

# max number of satellite-sync's before a full cache refresh occurs (level 6)
cache_refresh_count_max = 5

# dump version
xml_dump_version = 3.5

cdn_root = https://cdn.redhat.com

# override candlepin server API
# https://subscription.rhsm.redhat.com/subscription/consumers/
candlepin_server_api = 
reposync_download_threads = 5

# alternative sender of email reports from satellite-sync/cdn-sync/spacewalk-repo-sync
default_mail_from =
070701000000A5000081B40000000000000000000000015FBBE8EE00000060000000000000000000000000000000000000003200000000spacewalk-backend/rhn-conf/rhn_server_upload.conf # ** DO NOT EDIT **
# Spacewalk config for requests traveling through the package upload code
#
070701000000A6000081B40000000000000000000000015FBBE8EE00000096000000000000000000000000000000000000003F00000000spacewalk-backend/rhn-conf/rhn_server_upload_package-push.conf    # ** DO NOT EDIT **
# Spacewalk config for requests traveling through the /PKG-UPLOAD receiver
#

log_file = /var/log/rhn/rhn_upload_package_push.log
  070701000000A7000081B40000000000000000000000015FBBE8EE00000312000000000000000000000000000000000000003200000000spacewalk-backend/rhn-conf/rhn_server_xmlrpc.conf # ** DO NOT EDIT **
# Spacewalk config for requests traveling through the /XMLRPC receiver
#

log_file = /var/log/rhn/rhn_server_xmlrpc.log

# whether to disable package profiles
disable_packages = 0

# whether to disable checkins for high traffic actions (like queue.get)
disable_checkins = 0

# registration.finish_message stuff
# Finish message return code; defaults to 0 (no message shown)
# Other possible values are -1 and 1; see the commented code in
# xmlrpc/registration.py for more information
reg_finish_message_return_code = 0
# Title
reg_finish_message_title = 
# Text to display is taken from a file
reg_finish_message_text_file = /usr/share/rhn/registration.finish_message.txt

cache_package_headers = 1

entitlement_service_url =
regnum_service_url =
user_service_url =
  070701000000A8000081B40000000000000000000000015FBBE8EE00000161000000000000000000000000000000000000002700000000spacewalk-backend/rhn-conf/signing.cnf    #
# GPG KEYID to sign with
# Note: The keyid must not include the length of the key, e.g. only "F24F1B08", not "1024D/F24F1B08"
#
KEYID=""

#
# GPG PASSPHRASE
#
GPGPASS=""

#
# GPG HOMEDIR (optional)
#
GNUPGHOME="/root/.gnupg"

#
# Digest algorithm to use when signing repo metadata.
# Note: Debian systems require at least SHA256.
#
#DIGESTPREF=SHA256
   070701000000A9000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002500000000spacewalk-backend/satellite_exporter  070701000000AA000081B40000000000000000000000015FBBE8EE000001F7000000000000000000000000000000000000002E00000000spacewalk-backend/satellite_exporter/Makefile # Makefile for the backend directory
#

CODE_DIRS = handlers

SUBDIR      = satellite_exporter
FILES	    = __init__
SPACEWALK_FILES       = __init__ satexport

TOP     = ..

# We look for config files in "well known" locations (rhn-conf,
# httpd-conf, logrotate)
EXTRA_DIRS = /var/log/rhn /var/cache/rhn

all :: all-code

%-code : Makefile
	@$(foreach d,$(CODE_DIRS), $(MAKE) -C $(d) $* || exit 1; ) 

include $(TOP)/Makefile.defs

install :: install-code

clean :: clean-code
	@rm -f *pyc
	@rm -f *pyo
 070701000000AB000081B40000000000000000000000015FBBE8EE00000281000000000000000000000000000000000000003100000000spacewalk-backend/satellite_exporter/__init__.py  # Copyright (C) 2008--2013 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# Init module
#

__all__ = []
   070701000000AC000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002E00000000spacewalk-backend/satellite_exporter/handlers 070701000000AD000081B40000000000000000000000015FBBE8EE00000090000000000000000000000000000000000000003700000000spacewalk-backend/satellite_exporter/handlers/Makefile    # Makefile for the handlers
#

TOP	= ../..
SUBDIR	= satellite_exporter/handlers

FILES	= __init__ non_auth_dumper

include $(TOP)/Makefile.defs
070701000000AE000081B40000000000000000000000015FBBE8EE000002B5000000000000000000000000000000000000003A00000000spacewalk-backend/satellite_exporter/handlers/__init__.py # Copyright (C) 2008--2013 Red Hat, Inc.
# Init module for the handlers used by the XML exporter listeners
#
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

__all__ = []
   070701000000AF000081B40000000000000000000000015FBBE8EE00005E9B000000000000000000000000000000000000004100000000spacewalk-backend/satellite_exporter/handlers/non_auth_dumper.py  # Copyright (c) 2008--2018 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

"""
Non-authenticated dumper
"""

import os
try:
    #  python 2
    import xmlrpclib
except ImportError:
    #  python3
    import xmlrpc.client as xmlrpclib
import gzip
import sys

from rhn.UserDictCase import UserDictCase
from uyuni.common.usix import raise_with_tb
from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.common.rhnConfig import CFG
from spacewalk.server import rhnSQL, rhnLib
from spacewalk.server.rhnHandler import rhnHandler
from spacewalk.server.importlib.backendLib import localtime
from spacewalk.common.rhnException import rhnFault

from spacewalk.common.rhnTranslate import _

from spacewalk.satellite_tools.exporter import exportLib
from spacewalk.satellite_tools.disk_dumper import dumper


class InvalidPackageError(Exception):
    pass


class NullPathPackageError(Exception):
    pass


class MissingPackageError(Exception):
    pass


class NonAuthenticatedDumper(rhnHandler, dumper.XML_Dumper):
    # pylint: disable=E1101,W0102,W0613,R0902,R0904

    def __init__(self, req):
        rhnHandler.__init__(self)
        dumper.XML_Dumper.__init__(self)
        self.headers_out = UserDictCase()
        self._raw_stream = req
        self._raw_stream.content_type = 'application/octet-stream'
        self.compress_level = 0
        # State machine
        self._headers_sent = 0
        self._is_closed = 0
        self._compressed_stream = None

        self.functions = [
            'arches',
            'arches_extra',
            'channel_families',
            'channels',
            'get_comps',
            'get_modules',
            'channel_packages_short',
            'packages_short',
            'packages',
            'source_packages',
            'errata',
            'blacklist_obsoletes',
            'product_names',
            'get_rpm',
            'kickstartable_trees',
            'get_ks_file',
            'orgs',
            'support_information',
            'suse_products',
            'suse_product_channels',
            'suse_upgrade_paths',
            'suse_product_extensions',
            'suse_product_repositories',
            'scc_repositories',
            'suse_subscriptions',
            'cloned_channels',
        ]

        self.system_id = None
        self._channel_family_query_template = """
            select cfm.channel_family_id, 0 quantity
              from rhnChannelFamilyMembers cfm,
                   rhnChannel c, rhnChannelFamily cf
             where cfm.channel_id = c.id
               and c.label in (%s)
               and cfm.channel_family_id = cf.id
               and cf.label != 'rh-public'
               and (cf.org_id in (%s)
                   or cf.org_id is null)
            union
            select id channel_family_id, NULL quantity
              from rhnChannelFamily
             where label = 'rh-public'
        """
        self._channel_family_query_public = """
            select id channel_family_id, 0 quantity
              from rhnChannelFamily
             where org_id in (%s)
                or org_id is null
        """
        self._channel_family_query = None

    def _send_headers(self, error=0, init_compressed_stream=1):
        log_debug(4, "is_closed", self._is_closed)
        if self._is_closed:
            raise Exception("Trying to write to a closed connection")
        if self._headers_sent:
            return
        self._headers_sent = 1
        if self.compress_level:
            self.headers_out['Content-Encoding'] = 'gzip'
        # Send the headers
        if error:
            # No compression
            self.compress_level = 0
            self._raw_stream.content_type = 'text/xml'
        for h, v in list(self.headers_out.items()):
            self._raw_stream.headers_out[h] = str(v)
        self._raw_stream.send_http_header()
        # If need be, start gzipping
        if self.compress_level and init_compressed_stream:
            log_debug(4, "Compressing with factor %s" % self.compress_level)
            self._compressed_stream = gzip.GzipFile(None, "wb",
                                                    self.compress_level, self._raw_stream)

    def send(self, data):
        log_debug(3, "Sending %d bytes" % len(data))
        try:
            self._send_headers()
            if self._compressed_stream:
                log_debug(4, "Sending through a compressed stream")
                self._compressed_stream.write(data)
            else:
                self._raw_stream.write(data)
        except IOError:
            log_error("Client appears to have closed connection")
            self.close()
            raise_with_tb(dumper.ClosedConnectionError, sys.exc_info()[2])
        log_debug(5, "Bytes sent", len(data))

    write = send

    def close(self):
        log_debug(2, "Closing")
        if self._is_closed:
            log_debug(3, "Already closed")
            return

        if self._compressed_stream:
            log_debug(5, "Closing a compressed stream")
            try:
                self._compressed_stream.close()
            except IOError:
                e = sys.exc_info()[1]
                # Remote end has closed connection already
                log_error("Error closing the stream", str(e))

            self._compressed_stream = None
        self._is_closed = 1
        log_debug(3, "Closed")

    def set_channel_family_query(self, channel_labels=[]):
        if not channel_labels:
            # All null-pwned channel families
            self._channel_family_query = self._channel_family_query_public % self.exportable_orgs
            return self

        self._channel_family_query = self._channel_family_query_template % (
            ', '.join(["'%s'" % x for x in channel_labels]),
            self.exportable_orgs)
        return self

    def _get_channel_data(self, channels):
        writer = ContainerWriter()
        d = ChannelsDumper(writer, params=list(channels.values()))
        d.dump()
        data = writer.get_data()
        # We don't care about <rhn-channels> here
        channel_data = self._cleanse_channels(data[2])
        return channel_data

    def _cleanse_channels(channels_dom):
        channels = {}
        for dummy, attributes, child_elements in channels_dom:
            channel_label = attributes['label']
            channels[channel_label] = channel_entry = {}

            packages = attributes['packages'].split()
            del attributes['packages']

            # Get dir of the prefix
            prefix = "rhn-package-"
            prefix_len = len(prefix)
            packages = [int(x[prefix_len:]) for x in packages]

            channel_entry['packages'] = packages

            ks_trees = attributes['kickstartable-trees'].split()

            channel_entry['ks_trees'] = ks_trees

            # Clean up to reduce memory footprint if possible
            attributes.clear()

            # tag name to object prefix
            maps = {
                'source-packages': ('source_packages', 'rhn-source-package-'),
                'rhn-channel-errata': ('errata', 'rhn-erratum-'),
            }
            # Now look for package sources
            for tag_name, dummy, celem in child_elements:
                if tag_name not in maps:
                    continue
                field, prefix = maps[tag_name]
                prefix_len = len(prefix)
                # Hmm. x[1] is the attributes hash; we fetch the id and we get
                # rid of te prefix, then we run that through int()
                objects = []
                for dummy, ceattr, dummy in celem:
                    obj_id = ceattr['id']
                    obj_id = int(obj_id[prefix_len:])
                    last_modified = localtime(ceattr['last-modified'])
                    objects.append((obj_id, last_modified))
                channel_entry[field] = objects

            # Clean up to reduce memory footprint if possible
            del child_elements[:]

        return channels

    _cleanse_channels = staticmethod(_cleanse_channels)

    # Dumper functions here
    def dump_channel_families(self):
        log_debug(2)

        h = self.get_channel_families_statement()
        h.execute()

        writer = self._get_xml_writer()
        d = dumper.SatelliteDumper(writer,
                                   exportLib.ChannelFamiliesDumper(writer,
                                                                   data_iterator=h, null_max_members=0,),)
        d.dump()
        writer.flush()
        log_debug(4, "OK")
        self.close()
        return 0

    def dump_channels(self, channel_labels=None):
        log_debug(2)
        channels = self._validate_channels(channel_labels=channel_labels)

        writer = self._get_xml_writer()
        d = dumper.SatelliteDumper(writer, dumper.ChannelsDumperEx(writer,
                                                                   params=list(channels.values())))
        d.dump()
        writer.flush()
        log_debug(4, "OK")
        self.close()
        return 0

    def dump_channel_packages_short(self, channel_label, last_modified):
        return dumper.XML_Dumper.dump_channel_packages_short(
            self, channel_label, last_modified, filepath=None,
            validate_channels=True, send_headers=True, open_stream=False)

    def _packages(self, packages, prefix, dump_class, sources=0):
        return dumper.XML_Dumper._packages(self, packages, prefix, dump_class, sources,
                                           verify_packages=True)

    def dump_errata(self, errata):
        return dumper.XML_Dumper.dump_errata(self, errata, verify_errata=True)

    def dump_kickstartable_trees(self, kickstart_labels=None):
        return dumper.XML_Dumper.dump_kickstartable_trees(self, kickstart_labels,
                                                          validate_kickstarts=True)

    def dump_product_names(self):
        return dumper.XML_Dumper.dump_product_names(self)

    def dump_support_information(self):
        log_debug(4)
        writer = self._get_xml_writer()
        d = dumper.SatelliteDumper(writer, exportLib.SupportInfoDumper(writer))
        d.dump()
        writer.flush()
        self.close()
        return 0

    def dump_suse_products(self):
        log_debug(4)
        writer = self._get_xml_writer()
        d = dumper.SatelliteDumper(writer, exportLib.SuseProductDumper(writer))
        d.dump()
        writer.flush()
        self.close()
        return 0

    def dump_suse_product_channels(self):
        log_debug(4)
        writer = self._get_xml_writer()
        d = dumper.SatelliteDumper(writer, exportLib.SuseProductChannelDumper(writer))
        d.dump()
        writer.flush()
        self.close()
        return 0

    def dump_suse_upgrade_paths(self):
        log_debug(4)
        writer = self._get_xml_writer()
        d = dumper.SatelliteDumper(writer, exportLib.SuseUpgradePathDumper(writer))
        d.dump()
        writer.flush()
        self.close()
        return 0

    def dump_suse_product_extensions(self):
        log_debug(4)
        writer = self._get_xml_writer()
        d = dumper.SatelliteDumper(writer, exportLib.SuseProductExtensionDumper(writer))
        d.dump()
        writer.flush()
        self.close()
        return 0

    def dump_suse_product_repositories(self):
        log_debug(4)
        writer = self._get_xml_writer()
        d = dumper.SatelliteDumper(writer, exportLib.SuseProductRepositoryDumper(writer))
        d.dump()
        writer.flush()
        self.close()
        return 0

    def dump_scc_repositories(self):
        log_debug(4)
        writer = self._get_xml_writer()
        d = dumper.SatelliteDumper(writer, exportLib.SCCRepositoryDumper(writer))
        d.dump()
        writer.flush()
        self.close()
        return 0

    def dump_suse_subscriptions(self):
        log_debug(4)
        writer = self._get_xml_writer()
        d = dumper.SatelliteDumper(writer, exportLib.SuseSubscriptionDumper(writer))
        d.dump()
        writer.flush()
        self.close()
        return 0

    def dump_cloned_channels(self):
        log_debug(4)
        writer = self._get_xml_writer()
        d = dumper.SatelliteDumper(writer, exportLib.ClonedChannelsDumper(writer))
        d.dump()
        writer.flush()
        self.close()
        return 0

    def arches(self):
        return self.dump_arches(rpm_arch_type_only=1)

    def arches_extra(self):
        return self.dump_server_group_type_server_arches(rpm_arch_type_only=1)

    def support_information(self):
        self.dump_support_information()

    def suse_products(self):
        self.dump_suse_products()

    def suse_product_channels(self):
        self.dump_suse_product_channels()

    def suse_upgrade_paths(self):
        self.dump_suse_upgrade_paths()

    def suse_product_extensions(self):
        self.dump_suse_product_extensions()

    def suse_product_repositories(self):
        self.dump_suse_product_repositories()

    def scc_repositories(self):
        self.dump_scc_repositories()

    def suse_subscriptions(self):
        self.dump_suse_subscriptions()

    def cloned_channels(self):
        self.dump_cloned_channels()

    def blacklist_obsoletes(self):
        return self.dump_blacklist_obsoletes()

    def product_names(self):
        return self.dump_product_names()

    def channel_families(self, channel_labels=[]):
        self.set_channel_family_query()
        return self.dump_channel_families()

    def channels(self, channel_labels, flags={}):
        if not channel_labels:
            channel_labels = []
        self.set_channel_family_query(channel_labels=channel_labels)
        return self.dump_channels(channel_labels=channel_labels)

    def get_comps(self, channel):
        return self.get_repomd_file(channel, 1)

    def get_modules(self, channel):
        return self.get_repomd_file(channel, 2)

    def channel_packages_short(self, channel_label, last_modified):
        self.set_channel_family_query(channel_labels=[channel_label])
        return self.dump_channel_packages_short(channel_label, last_modified)

    def packages(self, packages=[]):
        self.set_channel_family_query()
        return self.dump_packages(packages=packages)

    def packages_short(self, packages=[]):
        self.set_channel_family_query()
        return self.dump_packages_short(packages=packages)

    def source_packages(self, packages=[]):
        self.set_channel_family_query()
        return self.dump_source_packages(packages=packages)

    def errata(self, errata=[]):
        self.set_channel_family_query()
        return self.dump_errata(errata=errata)

    def orgs(self):
        return self.dump_orgs()

    def kickstartable_trees(self, kickstart_labels=[]):
        self.set_channel_family_query()
        return self.dump_kickstartable_trees(kickstart_labels=kickstart_labels)

    def get_rpm(self, package, channel, checksum):
        log_debug(1, package, channel, checksum)
        return self._send_package_stream(package, channel, checksum)

    def get_repomd_file(self, channel, comps_type_id):
        comps_query = """
            select relative_filename
            from rhnChannelComps
            where channel_id = (
                select id
                from rhnChannel
                where label = :channel_label
                and comps_type_id = :ctype_id
            )
            order by id desc
        """
        channel_comps_sth = rhnSQL.prepare(comps_query)
        channel_comps_sth.execute(channel_label=channel, ctype_id=comps_type_id)
        row = channel_comps_sth.fetchone_dict()
        if not row:
            raise rhnFault(3015, "No comps/modules file for channel [%s]" % channel)
        path = os.path.join(CFG.MOUNT_POINT, row['relative_filename'])
        if not os.path.exists(path):
            log_error("Missing comps/modules file [%s] for channel [%s]" % (path, channel))
            raise rhnFault(3016, "Unable to retrieve comps/modules file for channel [%s]" % channel)
        return self._send_stream(path)

    def get_ks_file(self, ks_label, relative_path):
        log_debug(1, ks_label, relative_path)
        h = rhnSQL.prepare("""
            select base_path
              from rhnKickstartableTree
             where label = :ks_label
               and org_id is null
        """)
        h.execute(ks_label=ks_label)
        row = h.fetchone_dict()
        if not row:
            raise rhnFault(3003, "No such file %s in tree %s" %
                           (relative_path, ks_label))
        path = os.path.join(CFG.MOUNT_POINT, row['base_path'], relative_path)
        if not os.path.exists(path):
            log_error("Missing file for SUSE Manager dumper: %s" % path)
            raise rhnFault(3007, "Unable to retrieve file %s in tree %s" %
                           (relative_path, ks_label))
        return self._send_stream(path)

    # Sends a package over the wire
    # prefix is whatever we prepend to the package id (rhn-package- or
    # rhn-source-package-)
    def _send_package_stream(self, package, channel, checksum):
        log_debug(3, package, channel, checksum)
        path, dummy = self.get_package_path_by_filename(package, channel, checksum)

        log_debug(3, "Package path", path)
        if not os.path.exists(path):
            log_error("Missing package (SUSE Manager dumper): %s" % path)
            raise rhnFault(3007, "Unable to retrieve package %s" % package)
        return self._send_stream(path)

    # This query is similar to the one aove, except that we have already
    # authorized this channel (so no need for server_id)
    _query_get_package_path_by_nvra_and_checksum = rhnSQL.Statement("""
            select distinct
                   p.id, p.path
              from rhnPackage p,
                   rhnChannelPackage cp,
                   rhnChannel c,
                   rhnPackageArch pa,
                   rhnChecksum ch
             where c.label = :channel
               and cp.channel_id = c.id
               and cp.package_id = p.id
               and p.name_id = LOOKUP_PACKAGE_NAME(:name)
               and p.evr_id = LOOKUP_EVR(:epoch, :version, :release)
               and p.package_arch_id = pa.id
               and p.checksum_id = ch.id
               and ch.checksum = :checksum
               and pa.label = :arch
    """)

    def get_package_path_by_filename(self, fileName, channel, checksum):
        log_debug(3, fileName, channel, checksum)
        fileName = str(fileName)
        n, e, v, r, a = rhnLib.parseRPMFilename(fileName)

        h = rhnSQL.prepare(self._query_get_package_path_by_nvra_and_checksum)
        h.execute(name=n, version=v, release=r, epoch=e, arch=a, channel=channel, checksum=checksum)
        try:
            return _get_path_from_cursor(h)
        except InvalidPackageError:
            log_debug(4, "Error", "Non-existent package requested", fileName)
            raise_with_tb(rhnFault(17, _("Invalid RPM package %s requested") % fileName), sys.exc_info()[2])
        except NullPathPackageError:
            e = sys.exc_info()[1]
            package_id = e[0]
            log_error("Package path null for package id", package_id)
            raise_with_tb(rhnFault(17, _("Invalid RPM package %s requested") % fileName), sys.exc_info()[2])
        except MissingPackageError:
            e = sys.exc_info()[1]
            filePath = e[0]
            log_error("Package not found", filePath)
            raise_with_tb(rhnFault(17, _("Package not found")), sys.exc_info()[2])

    # Opens the file and sends the stream
    def _send_stream(self, path):
        try:
            stream = open(path, mode="rb")
        except IOError:
            e = sys.exc_info()[1]
            if e.errno == 2:
                raise_with_tb(rhnFault(3007, "Missing file %s" % path), sys.exc_info()[2])
            # Let it flow so we can find it later
            raise

        stream.seek(0, 2)
        file_size = stream.tell()
        stream.seek(0, 0)
        log_debug(3, "Package size", file_size)
        self.headers_out['Content-Length'] = file_size
        self.compress_level = 0
        self._raw_stream.content_type = 'application/x-rpm'
        self._send_headers()
        self.send_rpm(stream)
        return 0

    def send_rpm(self, stream):
        buffer_size = 65536
        while 1:
            buf = stream.read(buffer_size)
            if not buf:
                break
            try:
                self._raw_stream.write(buf)
            except IOError:
                # client closed the connection?
                log_error("Client appears to have closed connection")
                self.close_rpm()
                raise_with_tb(dumper.ClosedConnectionError, sys.exc_info()[2])
        self.close_rpm()

    def close_rpm(self):
        self._is_closed = 1

    def _respond_xmlrpc(self, data):
        # Marshal
        s = xmlrpclib.dumps((data, ))

        self.headers_out['Content-Length'] = len(s)
        self._raw_stream.content_type = 'text/xml'
        for h, v in list(self.headers_out.items()):
            self._raw_stream.headers_out[h] = str(v)
        self._raw_stream.send_http_header()
        self._raw_stream.write(s)
        return 0


class ContainerWriter:
    # Same interface as an XML writer, but collects data in a hash instead

    def __init__(self):
        self._tag_stack = []
        self._cdata = []
        self._root = None

    def open_tag(self, tag_name, attributes=None):
        # print "+++", tag_name, len(self._tag_stack)
        if not attributes:
            attributes = {}
        self._cdata = []
        self._tag_stack.append((tag_name, attributes, self._cdata))

    def data(self, astring):
        self._cdata.append(astring)

    def close_tag(self, tag_name):
        # print "---", tag_name, len(self._tag_stack)
        # Extract the current item from the stack
        tag_name, attributes, cdata = self._tag_stack.pop()

        return self._add_node(tag_name, attributes, cdata)

    def empty_tag(self, tag_name, attributes=None):
        # print "+++---", tag_name, len(self._tag_stack)
        if not attributes:
            attributes = {}
        return self._add_node(tag_name, attributes, [])

    def _add_node(self, tag_name, attributes, cdata):
        node = (tag_name, attributes, cdata)
        if not self._tag_stack:
            # Parent
            self._root = node
            return self._root

        # Fetch the parent
        parent = self._tag_stack[-1]
        # Add this node as a child
        parent[2].append(node)
        return parent

    def get_data(self):
        assert self._root is not None
        return self._root

# Overwrite the ChannelsDumper class to filter packages/source packages/errata
# based on the creation date
# XXX No caching for now


class ChannelsDumper(dumper.ChannelsDumper):

    def dump_subelement(self, data):
        c = exportLib.ChannelDumper(self._writer, data)
        c.dump()


def _get_path_from_cursor(h):
    # Function shared between other retrieval functions
    rs = h.fetchall_dict()
    if not rs:
        raise InvalidPackageError

    max_row = rs[0]

    if max_row['path'] is None:

        raise NullPathPackageError(max_row['id'])
    filePath = "%s/%s" % (CFG.MOUNT_POINT, max_row['path'])
    pkgId = max_row['id']
    if not os.access(filePath, os.R_OK):
        # Package not found on the filesystem
        raise MissingPackageError(filePath)
    return filePath, pkgId

rpcClasses = {
    'dump': NonAuthenticatedDumper,
}
 070701000000B0000081B40000000000000000000000015FBBE8EE000025E1000000000000000000000000000000000000003200000000spacewalk-backend/satellite_exporter/satexport.py #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# Server-side uploading code

import time
import sys
try:
    #  python 2
    import xmlrpclib
except ImportError:
    #  python3
    import xmlrpc.client as xmlrpclib  # pylint: disable=F0401

from rhn.connections import idn_puny_to_unicode

from spacewalk.common import apache

from uyuni.common.usix import raise_with_tb
from spacewalk.common import rhnFlags
from spacewalk.common.rhnLog import log_debug, log_error, log_setreq, initLOG
from spacewalk.common.rhnConfig import CFG, initCFG
from spacewalk.common.rhnTranslate import _
from spacewalk.common.rhnTB import Traceback
from spacewalk.common.rhnException import rhnException, rhnFault
from spacewalk.server import rhnSQL, rhnImport
from spacewalk.satellite_tools.disk_dumper.dumper import ClosedConnectionError
from spacewalk.satellite_tools import constants


class BaseApacheServer:

    def __init__(self):
        # Init log to stderr
        initLOG()
        self.start_time = 0
        self._cleanup()

    def headerParserHandler(self, req):
        # pylint: disable=W0201
        log_setreq(req)
        self.start_time = time.time()
        # init configuration options with proper component
        options = req.get_options()
        # if we are initializing out of a <Location> handler don't
        # freak out
        if "RHNComponentType" not in options:
            # clearly nothing to do
            return apache.OK
        initCFG(options["RHNComponentType"])
        initLOG(CFG.LOG_FILE, CFG.DEBUG)
        # short-circuit everything if sending a system-wide message.
        if CFG.SEND_MESSAGE_TO_ALL:
            # Drop the database connection
            # pylint: disable=W0702
            try:
                rhnSQL.closeDB()
            except:
                pass

            # Fetch global message being sent to clients if applicable.
            msg = open(CFG.MESSAGE_TO_ALL).read()
            log_debug(3, "Sending message to all clients: %s" % msg)
            return self._send_xmlrpc(req, rhnFault(-1,
                                                   _("IMPORTANT MESSAGE FOLLOWS:\n%s") % msg, explain=0))

        rhnSQL.initDB()
        self.server = options['SERVER']

        self.server_classes = rhnImport.load("satellite_exporter/handlers")

        if self.server not in self.server_classes:
            # XXX do something interesting here
            log_error("Missing server", self.server)
            return apache.HTTP_NOT_FOUND

        return self._wrapper(req, self._headerParserHandler)

    def handler(self, req):
        return self._wrapper(req, self._handler)

    def cleanupHandler(self, req):
        self._timer()
        retval = self._wrapper(req, self._cleanupHandler)
        self._cleanup()
        # Reset the logger to stderr
        initLOG()
        return retval

    def _cleanup(self):
        # pylint: disable=W0201
        self.server = None
        self.server_classes = None
        self.server_instance = {}

    # Virtual functions
    # pylint: disable=R0201
    def _headerParserHandler(self, _req):
        return apache.OK

    def _handler(self, _req):
        return apache.OK

    def _cleanupHandler(self, _req):
        return apache.OK

    def _wrapper(self, req, function):
        try:
            ret = function(req)
        except rhnFault:
            e = sys.exc_info()[1]
            return self._send_xmlrpc(req, e)
        except ClosedConnectionError:
            # The error code most likely doesn't matter, the client won't see
            # it anyway
            return apache.HTTP_NOT_ACCEPTABLE
        except Exception:  # pylint: disable=E0012, W0703
            Traceback("satexport._wrapper", req=req)
            return apache.HTTP_INTERNAL_SERVER_ERROR
        return ret

    def _send_xmlrpc(self, req, data):
        log_debug(1)
        req.content_type = "text/xml"
        if isinstance(data, rhnFault):
            data = data.getxml()
        else:
            data = (data, )
        ret = xmlrpclib.dumps(data, methodresponse=1)
        req.headers_out['Content-Length'] = str(len(ret))
        req.send_http_header()
        req.write(ret)
        return apache.OK

    def _timer(self):
        if not self.start_time:
            return 0
        log_debug(2, "%.2f sec" % (time.time() - self.start_time))
        return 0


class ApacheServer(BaseApacheServer):

    def __init__(self):
        BaseApacheServer.__init__(self)

    def _headerParserHandler(self, req):
        log_debug(3, "Method", req.method)
        self._validate_version(req)
        return apache.OK

    def _handler(self, req):
        log_debug(3, "Method", req.method)

        # Read all the request
        data = req.read()
        log_debug(7, "Received", data)

        # Decode the data
        try:
            params, methodname = xmlrpclib.loads(data)
        except:
            raise

        log_debug(5, params, methodname)

        try:
            f = self.get_function(methodname, req)
        except FunctionRetrievalError:
            e = sys.exc_info()[1]
            Traceback(methodname, req)
            return self._send_xmlrpc(req, rhnFault(3008, str(e), explain=0))

        if len(params) < 2:
            params = []
        else:
            params = params[1:]

        result = f(*params)

        if result:
            # Error of some sort
            return self._send_xmlrpc(req, rhnFault(3009))

        # Presumably the function did all the sending
        log_debug(4, "Exiting OK")
        return apache.OK

    # pylint: disable=R0201
    def get_function(self, method_name, req):
        iss_slave_condition = self.auth_system(req)
        # Get the module name
        idx = method_name.rfind('.')
        module_name, function_name = method_name[:idx], method_name[idx + 1:]
        log_debug(5, module_name, function_name)

        handler_classes = self.server_classes[self.server]
        if module_name not in handler_classes:
            raise FunctionRetrievalError("Module %s not found" % module_name)

        mod = handler_classes[module_name](req)
        mod.set_exportable_orgs(iss_slave_condition)
        f = mod.get_function(function_name)
        if f is None:
            raise FunctionRetrievalError(
                "Module %s: function %s not found" %
                (module_name, function_name))
        return f

    def auth_system(self, req):
        if CFG.DISABLE_ISS:
            raise rhnFault(2005, _('ISS is disabled on this server.'))

        remote_hostname = req.get_remote_host(apache.REMOTE_DOUBLE_REV)
        row = rhnSQL.fetchone_dict("""
        select id, allow_all_orgs
          from rhnISSSlave
         where slave = :hostname
           and enabled = 'Y'
        """, hostname=idn_puny_to_unicode(remote_hostname))
        if not row:
            raise rhnFault(2004,
                           _('Server "%s" is not enabled for ISS.')
                           % remote_hostname)
        iss_slave_condition = "select id from web_customer"
        if not(row['allow_all_orgs'] == 'Y'):
            iss_slave_condition = "select rhnISSSlaveOrgs.org_id from rhnISSSlaveOrgs where slave_id = %d" % row['id']
        return iss_slave_condition

    @staticmethod
    def _validate_version(req):
        server_version = constants.PROTOCOL_VERSION
        vstr = 'X-RHN-Satellite-XML-Dump-Version'
        if vstr not in req.headers_in:
            raise rhnFault(3010, "Missing version string")
        client_version = req.headers_in[vstr]

        # set the client version  through rhnFlags to access later
        rhnFlags.set('X-RHN-Satellite-XML-Dump-Version', client_version)

        log_debug(1, "Server version", server_version, "Client version",
                  client_version)

        client_ver_arr = str(client_version).split(".")
        server_ver_arr = str(server_version).split(".")
        client_major = client_ver_arr[0]
        server_major = server_ver_arr[0]
        if len(client_ver_arr) >= 2:
            client_minor = client_ver_arr[1]
        else:
            client_minor = 0

        server_minor = server_ver_arr[1]

        try:
            client_major = int(client_major)
            client_minor = int(client_minor)
        except ValueError:
            raise_with_tb(rhnFault(3011, "Invalid version string %s" % client_version), sys.exc_info()[2])

        try:
            server_major = int(server_major)
            server_minor = int(server_minor)
        except ValueError:
            raise_with_tb(rhnException("Invalid server version string %s"
                                       % server_version), sys.exc_info()[2])

        if client_major != server_major:
            raise rhnFault(3012, "Client version %s does not match"
                           " server version %s" % (client_version, server_version),
                           explain=0)


class FunctionRetrievalError(Exception):
    pass


apache_server = ApacheServer()
HeaderParserHandler = apache_server.headerParserHandler
Handler = apache_server.handler
CleanupHandler = apache_server.cleanupHandler
   070701000000B1000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002200000000spacewalk-backend/satellite_tools 070701000000B2000081B40000000000000000000000015FBBE8EE00000274000000000000000000000000000000000000002600000000spacewalk-backend/satellite_tools/CFG # This viminfo file was generated by Vim 7.2.
# You may edit it if you're careful!

# Value of 'encoding' when this file was written
*encoding=utf-8


# hlsearch on (H) or off (h):
~H
# Command Line History (newest to oldest):

# Search String History (newest to oldest):

# Expression History (newest to oldest):

# Input Line History (newest to oldest):

# Input Line History (newest to oldest):

# Registers:

# File marks:
'0  1  0  ~/code/git/spacewalk/backend/satellite_tools/grep

# Jumplist (newest first):
-'  1  0  ~/code/git/spacewalk/backend/satellite_tools/grep

# History of marks within files (newest to oldest):
070701000000B3000081B40000000000000000000000015FBBE8EE000006FA000000000000000000000000000000000000002B00000000spacewalk-backend/satellite_tools/Makefile    # Makefile for satellite_tool for RHNS
#

TOP	= ..

# Specific stuff
SUBDIR	= satellite_tools
SUBDIRS = exporter disk_dumper accounts repo_plugins
SPACEWALK_FILES	= __init__ connection constants diskImportLib messages \
            progress_bar req_channels satCerts satsync syncCache \
            sync_handlers \
            syncLib SequenceServer xmlDiskSource \
            xmlSource xmlWireSource rhn_satellite_activate rhn_ssl_dbstore \
            satComputePkgHeaders updatePackages reposync \
	    geniso contentRemove download
SCRIPTS = satellite-sync spacewalk-debug \
	  rhn-schema-version rhn-satellite-activate rhn-charsets \
	  rhn-ssl-dbstore update-packages rhn-db-stats rhn-schema-stats \
          spacewalk-repo-sync spacewalk-remove-channel \
	  spacewalk-update-signatures spacewalk-data-fsck spacewalk-fips-tool \
	  mgr-sign-metadata mgr-sign-metadata-ctl spacewalk-diskcheck

# check if we can build man pages
DOCBOOK = $(wildcard /usr/bin/docbook2man)

SGMLS	= $(wildcard *.sgml)
MANS	= $(patsubst %.sgml,%.8,$(SGMLS))

BINDIR	= /usr/bin
MANDIR	?= /usr/man

EXTRA_DIRS = $(MANDIR)/man8 $(BINDIR)

CA_DBSTORE      = rhn-ssl-dbstore

include $(TOP)/Makefile.defs

# install scripts
all :: $(SCRIPTS)
install :: $(SCRIPTS) $(PREFIX)/$(BINDIR)
	$(INSTALL_BIN) $(SCRIPTS) $(PREFIX)/$(BINDIR)

ifneq ($(DOCBOOK),)
# install man pages
all	:: $(MANS)
install :: $(MANS) $(PREFIX)/$(MANDIR)
	$(INSTALL_DATA) $(MANS) $(PREFIX)/$(MANDIR)/man8
endif

install :: $(CA_DBSTORE).inst

$(CA_DBSTORE).inst : $(CA_DBSTORE) $(CA_DBSTORE).new $(PREFIX)/$(BINDIR)
	$(INSTALL_BIN) $(CA_DBSTORE).new $(PREFIX)/$(BINDIR)/$(CA_DBSTORE)
	rm -f $(CA_DBSTORE).new


%.new : %
	sed -e 's|@@ROOT@@|$(ROOT)|g' <$* >$@

%.8 : %.sgml
	$(DOCBOOK) $<

clean ::
	@rm -fv $(MANS) manpage.* *.new

  070701000000B4000081B40000000000000000000000015FBBE8EE00000C2A000000000000000000000000000000000000003400000000spacewalk-backend/satellite_tools/SequenceServer.py   #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# class SequenceServer, a class that nicely serves chunks
#    of any sequence.
#


class SequenceServer:

    """Given a sequence to serve, this class dishes them out in chunks
    or one at a time. This was written originally to reduce redundant
    code. Used only by class Syncer.

    This class was written so that a chunk can be snagged and
    processed. If the processing fails, one can tell the class to only
    present one at a time until that chunk is complete... and then
    resume normal operations.

    For example: the sequence can be a bunch of packageIds. We try to
    process all data that corresponds to some chunk of those package
    ids. If that process fails, we go back and reprocess that chunk,
    one at a time, until it is complete (identifying precisely which
    package broke). Then we resume processing a chunk at a time.

    """

    DIVISOR = 10
    NEVER_LESS_THAN = 10
    NEVER_MORE_THAN = 50

    def __init__(self, seq, divisor=None, neverlessthan=None, nevermorethan=None):
        """Constructor.

        Arguments:

        seq - any sequence to server chunks of
        divisor - the chunk size: 10 would be 1/10th of the seq length
        neverlessthan - chunk-size is never less than this (unless out
                        of data).
        nevermorethan - chunk-size if never more than this number.

        """

        divisor = divisor or self.DIVISOR
        neverlessthan = neverlessthan or self.NEVER_LESS_THAN
        nevermorethan = nevermorethan or self.NEVER_MORE_THAN

        self.seq = seq
        self.chunksize = int(min(max(len(seq) / divisor, neverlessthan),
                             nevermorethan))
        self.oneYN = 0
        self.alwaysOneYN = 0
        self.returnedChunksize = 0
        self.chunk = self.seq[:self.chunksize]

    def getChunk(self):
        """fetch a chunk from the sequence.
        Does not refresh the chunk until you self.clearChunk()"""

        if not self.chunk:
            self.chunk = self.seq[:self.chunksize]
        if self.oneYN or self.alwaysOneYN:
            _chunk = self.chunk[:1]
        else:
            _chunk = self.chunk
        self.returnedChunksize = len(_chunk)
        return _chunk

    def clearChunk(self):
        """zero the self.chunk you were working with."""

        del self.chunk[:self.returnedChunksize]
        del self.seq[:self.returnedChunksize]
        if not self.chunk:
            self.oneYN = 0

    def doneYN(self):
        return not self.seq
  070701000000B5000081B40000000000000000000000015FBBE8EE00000037000000000000000000000000000000000000002E00000000spacewalk-backend/satellite_tools/__init__.py # Copyright (c) 2005--2015 Red Hat, Inc.

__all__ = []
 070701000000B6000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002B00000000spacewalk-backend/satellite_tools/accounts    070701000000B7000081B40000000000000000000000015FBBE8EE00000538000000000000000000000000000000000000003400000000spacewalk-backend/satellite_tools/accounts/Makefile   # Makefile for spacewalk backend
#
#
# Copyright (c) 2008--2013 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

TOP	= ../..

# Specific stuff
SUBDIR  = satellite_tools/accounts
SCRIPTS = satpasswd satwho
BINDIR  = /usr/bin
include $(TOP)/Makefile.defs

#Man page specific stuff
DOCBOOK = $(wildcard /usr/bin/docbook2man)

SGMLS	= $(wildcard *.sgml)
MANS	= $(patsubst %.sgml,%.8,$(SGMLS))

MANDIR	?= /usr/man

EXTRA_DIRS = $(MANDIR)/man8 $(BINDIR)

# install scripts
all :: $(SCRIPTS)
install :: $(SCRIPTS) $(PREFIX)/$(BINDIR)
	$(INSTALL_BIN) $(SCRIPTS) $(PREFIX)/$(BINDIR)

ifneq ($(DOCBOOK),)
# install man pages
all	:: $(MANS)
install :: $(MANS) $(PREFIX)/$(MANDIR)
	$(INSTALL_DATA) $(MANS) $(PREFIX)/$(MANDIR)/man8
endif


%.8 : %.sgml
	$(DOCBOOK) $<

clean ::
	@rm -fv $(MANS) manpage.* *.new
070701000000B8000081B40000000000000000000000015FBBE8EE000001CE000000000000000000000000000000000000003200000000spacewalk-backend/satellite_tools/accounts/README This is a small set of tools for working with Satellite user accounts. Included are the following scripts:

1.   satwho.   Lists all the satellite users.

2.   satpasswd.  Sets a password for a satellite user.  Especially good if you've locked yourself out of your satellite admin account ;-)

3.   md5crypt.   A re-write of grub-md5-crypt that accepts --stdin.  This script was initially used by satpasswd; however, it has since been replaced by using openssl.
  070701000000B9000081FD0000000000000000000000015FBBE8EE0000098D000000000000000000000000000000000000003400000000spacewalk-backend/satellite_tools/accounts/md5crypt   #! /bin/sh

# Encrypt a password in MD5 format
#   Copyright (C) 2000,2002 Free Software Foundation, Inc.
#
# This file 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.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

# Replaced by the configure script.
prefix=/usr
exec_prefix=/usr
sbindir=/sbin
STDIN=FALSE

# Initialize some variables.
grub_shell=${sbindir}/grub
progname="grub-md5-crypt"

# Check the arguments.
for option in "$@"; do
    case "$option" in
    -h | --help)
	cat <<EOF
Usage: $progname [OPTION]
Encrypt a password in MD5 format.

  -h, --help              print this message and exit
  -v, --version           print the version information and exit
  --grub-shell=FILE       use FILE as the grub shell

Report bugs to <bug-grub@gnu.org>.
EOF
	exit 0
	;;

    -v | --version)
	echo "$progname (GNU GRUB ${VERSION})"
	exit 0
	;;

    --grub-shell=*)
	grub_shell=`echo "$option" | sed 's/--grub-shell=//'`
	;;

    --stdin)
	STDIN=TRUE
        ;;

    *)
	echo "$progname: unrecognized option \`$option'"
	echo "Usage: $progname [OPTION]"
	echo "Try \`$progname --help' for more information."
	exit 1
	;;
    esac
done

if [ "$STDIN" = "FALSE" ]
then
  # Suppress echo backs. I don't know if this is really portable. -okuji
  stty -echo

  # Prompt to enter a password.
  echo -n "Password: "
  read -r password
  echo

  # One more time.
  echo -n "Retype password: "
  read -r password2
  echo

  # Resume echo backs.
  stty echo
else
  read password
  password2="$password"
fi

if test "x$password" = x; then
    echo "Empty password is not permitted."
    exit 1
fi

if test "x$password" != "x$password2"; then
    echo "Sorry, passwords do not match."
    exit 1
fi

# Run the grub shell.
$grub_shell --batch --device-map=/dev/null <<EOF \
    | grep "^Encrypted: " | sed 's/^Encrypted: //'
md5crypt
$password
quit
EOF

# Bye.
exit 0
   070701000000BA000081FD0000000000000000000000015FBBE8EE000008EB000000000000000000000000000000000000003500000000spacewalk-backend/satellite_tools/accounts/satpasswd  #!/usr/bin/python
#
# Copyright (c) 2014--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.

import getpass
import sys

from spacewalk.common.rhnConfig import initCFG, CFG
from spacewalk.server import rhnSQL, rhnUser


def print_help():
    print("Usage: satpasswd [OPTIONS] user\n")
    print("Options:")
    print("\t-h, --help\tPrint this help message.")
    print("\t-s, --stdin\tRead the password from standard input.")


def read_passwd(stdin, msg):
    passwordIn = None
    if stdin:
        passwordIn = sys.stdin.readline().rstrip('\n')
    else:
        passwordIn = getpass.getpass(msg)
    return passwordIn

if __name__ == '__main__':
    if '-h' in sys.argv or '--help' in sys.argv:
        print_help()
        sys.exit(0)

    stdin = False
    for a in ('-s', '--stdin'):
        if a in sys.argv:
            stdin = True
            sys.argv.remove(a)

    if len(sys.argv) != 2:
        print_help()
        sys.exit(1)

    userIn = sys.argv.pop()

    initCFG('server.satellite')
    rhnSQL.initDB()

    user = rhnUser.search(userIn)
    if not user:
        print("User %s is not a valid Satellite user." % userIn)
        sys.exit(1)

    passwordIn = read_passwd(stdin, "Password:")
    passwordCheck = read_passwd(stdin, "Retype password:")

    if passwordIn != passwordCheck:
        print("Sorry, passwords do not match.")
        sys.exit(1)

    if len(passwordIn) == 0:
        print("Empty password is not permitted.")
        sys.exit(1)

    if len(passwordIn) < CFG.MIN_PASSWD_LEN:
        print(("User password should be at least %d characters long.") % CFG.MIN_PASSWD_LEN)
        sys.exit(1)

    user.contact['password'] = rhnUser.encrypt_password(passwordIn)
    user.contact.save()
    rhnSQL.commit()
 070701000000BB000081B40000000000000000000000015FBBE8EE00000803000000000000000000000000000000000000003A00000000spacewalk-backend/satellite_tools/accounts/satpasswd.sgml <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V3.1//EN">
<refentry>

<RefMeta>
<RefEntryTitle>satpasswd</RefEntryTitle><manvolnum>8</manvolnum>
<RefMiscInfo>Version 1.0</RefMiscInfo>
</RefMeta>

<RefNameDiv>
<RefName><command>satpasswd</command></RefName>
<RefPurpose>
Change a user's password on the management server.
</RefPurpose>
</RefNameDiv>

<RefSynopsisDiv>
<Synopsis>
    <cmdsynopsis>
        <command>satpasswd</command>
        <arg>options <replaceable>...</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg><replaceable>USER</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-s</arg><arg>--stdin</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-h</arg><arg>--help</arg>
    </cmdsynopsis>
</Synopsis>
</RefSynopsisDiv>

<RefSect1><Title>Description</Title>
    <para>
        <emphasis>satpasswd</emphasis> is used to change a user's password on the management server.  This password is used for accessing the user's account using the Web User Interface.  Due to the nature of the command, access to it is restricted to the root user.
    </para>
</RefSect1>

<RefSect1><Title>Options</Title>
<variablelist>
    <varlistentry>
        <term>-s, --stdin</term>
        <listitem>
            <para>Read the user password from standard input.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-h, --help</term>
        <listitem>
            <para>Display the help screen with a list of options.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term><replaceable>USER</replaceable></term>
        <listitem>
            <para>The login of the user being changed.</para>
        </listitem>
    </varlistentry>
</variablelist>
</RefSect1>

<RefSect1><Title>Authors</Title>
<simplelist>
    <member>G.R. Keech<email>rkeech@redhat.com</email></member>
    <member>Brad Buckingham<email>bbuckingham@redhat.com</email></member>
    <member>Milan ZÃ¡zrivec<email>mzazrivec@redhat.com</email></member>
</simplelist>
</RefSect1>
</RefEntry>
 070701000000BC000081FD0000000000000000000000015FBBE8EE000002A6000000000000000000000000000000000000003200000000spacewalk-backend/satellite_tools/accounts/satwho #!/bin/bash
# name:         satwho
# description:  Print a list of the satellite users.
# author:	G.R.Keech <rkeech@redhat.com>
# 		Jan Pazdziora
# date:		2006-01-31, 2011-01-11

BLOCK=0
echo "select login from web_contact;"| spacewalk-sql --select-mode - | grep -v "^$" |\
while read line
do
  if [ $BLOCK -eq 0 ]
  then
    # We are before the block so do not print anything.

    # First look for the horizontal separating line
    echo "$line" | grep "^-*$" &>/dev/null && BLOCK=1
  else
    # We are in the block, so print the line, so long as it is not the line with "rows selected"
    echo "$line" | egrep "rows?\)$|rows selected.$" &>/dev/null || echo $line
  fi
done

  070701000000BD000081B40000000000000000000000015FBBE8EE000003FC000000000000000000000000000000000000003700000000spacewalk-backend/satellite_tools/accounts/satwho.sgml    <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V3.1//EN">
<refentry>

<RefMeta>
<RefEntryTitle>satwho</RefEntryTitle><manvolnum>8</manvolnum>
<RefMiscInfo>Version 1.0</RefMiscInfo>
</RefMeta>

<RefNameDiv>
<RefName><command>satwho</command></RefName>
<RefPurpose>
List the login names of users on the management server.
</RefPurpose>
</RefNameDiv>

<RefSynopsisDiv>
<Synopsis>
    <cmdsynopsis>
        <command>satwho</command>
    </cmdsynopsis>
</Synopsis>
</RefSynopsisDiv>

<RefSect1><Title>Description</Title>
    <para>
        <emphasis>satwho</emphasis> lists the login names for users on the management server.  These login names are used for logging in to the Web User Interface.  Due to the nature of the command, access to it is restricted to the root user.
    </para>
</RefSect1>

<RefSect1><Title>Authors</Title>
<simplelist>
    <member>G.R. Keech<email>rkeech@redhat.com</email></member>
    <member>Brad Buckingham<email>bbuckingham@redhat.com</email></member>
</simplelist>
</RefSect1>
</RefEntry>
070701000000BE000081B40000000000000000000000015FBBE8EE00001764000000000000000000000000000000000000003000000000spacewalk-backend/satellite_tools/connection.py   #
# Module that provides the client-side functionality for an XML importer
#
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

import gzip

from rhn import rpclib
from spacewalk.satellite_tools import constants

__version__ = "0.1"


class Transport(rpclib.transports.Transport):
    user_agent = "satellite-sync/%s" % __version__

    def __init__(self, timeout=None):
        if timeout:
            rpclib.transports.Transport.__init__(self, timeout=timeout)
        else:
            rpclib.transports.Transport.__init__(self)
        self.add_header("Accept-Encoding", "gzip")

    def _process_response(self, fd, connection):
        # Content-Type defaults to txt/xml
        content_type = self.headers_in.get('Content-Type', 'text/xml')
        content_encoding = self.headers_in.get('Content-Encoding')

        if content_encoding == 'gzip':
            # Un-gzipstream it
            # NOTE: if data expected to get bigger than ~2.5Gb in size
            #       then use GzipStreamXL instead (it's slower though)
            fd = CompressedStream(fd)

        if content_type == 'text/xml':
            # XML-RPC error
            # Catch exceptions so we can properly close file descriptors
            try:
                ret = self.parse_response(fd)
            except:
                fd.close()
                connection.close()
                raise
            fd.close()
            connection.close()
            return ret

        # XXX application/octet-stream should go away
        if content_type in ('application/xml', 'application/octet-stream',
                            'application/x-rpm'):
            f = rpclib.transports.File(fd)
            # Explanation copied from the base class' method (rhn.transports):
            # Set the File's close method to the connection's
            # Note that calling the HTTPResponse's close() is not enough,
            # since the main socket would remain open, and this is
            # particularily bad with SSL
            f.close = connection.close
            return f

        connection.close()
        raise Exception("Unknown response type: " + content_type)


class SafeTransport(rpclib.transports.SafeTransport, Transport):
    _process_response = Transport._process_response


class ProxyTransport(rpclib.transports.ProxyTransport, Transport):
    _process_response = Transport._process_response


class SafeProxyTransport(rpclib.transports.SafeProxyTransport, Transport):
    _process_response = Transport._process_response


class _Server(rpclib.Server):
    _transport_class = Transport
    _transport_class_https = SafeTransport
    _transport_class_proxy = ProxyTransport
    _transport_class_https_proxy = SafeProxyTransport

    def use_CA_chain(self, ca_chain=None):
        pass


class StreamConnection(_Server):

    def __init__(self, uri, proxy=None, username=None, password=None,
                 refreshCallback=None, xml_dump_version=constants.PROTOCOL_VERSION,
                 timeout=None):
        _Server.__init__(self, uri, proxy=proxy, username=username,
                         password=password, refreshCallback=refreshCallback, timeout=timeout)
        self.add_header("X-RHN-Satellite-XML-Dump-Version", xml_dump_version)


class GETServer(rpclib.GETServer):

    """ class rpclib.GETServer with overriden default transports classes """
    _transport_class = Transport
    _transport_class_https = SafeTransport
    _transport_class_proxy = ProxyTransport
    _transport_class_https_proxy = SafeProxyTransport

    def __init__(self, uri, transport=None, proxy=None, username=None,
                 password=None, client_version=2, headers=None, refreshCallback=None,
                 progressCallback=None, xml_dump_version=constants.PROTOCOL_VERSION,
                 timeout=None):
        if headers is None:
            headers = {}
        rpclib.GETServer.__init__(self, uri,
                                  transport=transport,
                                  proxy=proxy,
                                  username=username,
                                  password=password,
                                  client_version=client_version,
                                  headers=headers,
                                  refreshCallback=refreshCallback,
                                  timeout=timeout)
        self.add_header("X-RHN-Satellite-XML-Dump-Version", xml_dump_version)

    def use_CA_chain(self, ca_chain=None):
        pass


class CompressedStream:

    """
    GzipStream will not close the connection by itself, so we have to keep the
    underlying stream around
    """

    def __init__(self, stream):
        def noop():
            pass
        self._real_stream = stream
        # gzipstream tries to flush stuff; add a noop function
        self._real_stream.flush = noop
        self.stream = self._real_stream
        if not isinstance(self._real_stream, gzip.GzipFile):
            self.stream = gzip.GzipFile(fileobj=self._real_stream, mode="r")

    def close(self):
        if self.stream:
            self.stream.close()
            self.stream = None
        if self._real_stream:
            self._real_stream.close()
            self._real_stream = None

    def __getattr__(self, name):
        return getattr(self.stream, name)

    def __repr__(self):
        return "<_CompressedStream at %s>" % id(self)

if __name__ == '__main__':
    pass
070701000000BF000081B40000000000000000000000015FBBE8EE00000616000000000000000000000000000000000000002F00000000spacewalk-backend/satellite_tools/constants.py    # Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

"""
Constant values (protocol versions, etc) for satellite sync/exporter.
"""

# XML dump version we export
PROTOCOL_VERSION = 3.7

ALLOWED_SYNC_PROTOCOL_VERSIONS = ['3.7', '3.6', '3.5', '3.4', '3.3', '3.2', '3.1', '3.0']

# Support for syncing orgs / org trusts / channel trusts
ORG_SUPPORTED_VERSION = 3.7

# Support for checksums other then md5
SHA256_SUPPORTED_VERSION = 3.5

# Support for redirects to CDN (Akamai)
REDIRECTS_SUPPORTED_VERSION = 3.4

# Support for supplying comps.xml files (package groups)
COMPS_SUPPORTED_VERSION = 3.3

# Support for update model details (rhn510+)
EUS_SUPPORTED_VERSION = 3.2

# Support for virt details (rhn500+)
VIRT_SUPPORTED_VERSION = 3.1

# Historical log
# * Version 2.2 2004-03-02
#    arch types introduced in all the arch dumps
# * Version 2.3 2004-09-13
#    added short package dumps per channel
# * Version 3.0 2005-01-13
#    required major version change for channel family merging (#136525)
  070701000000C0000081B40000000000000000000000015FBBE8EE0000491C000000000000000000000000000000000000003300000000spacewalk-backend/satellite_tools/contentRemove.py    # Copyright (c) 2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import os
import shutil
import sys
try:
    import xmlrpc.client as xmlrpclib
except ImportError:
    import xmlrpclib
import datetime
from spacewalk.common.rhnConfig import CFG
from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.satellite_tools.progress_bar import ProgressBar
from spacewalk.server.rhnPackage import unlink_package_file
from spacewalk.server import rhnSQL
from socket import getfqdn

class RemoteApi:

    """ Class for connecting to the XMLRPC spacewalk interface"""

    cache = {}

    def __init__(self, server_url, username, password):
        self.client = xmlrpclib.Server(server_url)
        self.auth_time = None
        self.auth_token = None
        try:
            self.username = username
            self.password = password
            self.__login()
        except xmlrpclib.Fault as e:
            raise UserError(e.faultString)


    def auth_check(self):
        """ makes sure that more than an hour hasn't passed since we
             logged in and will relogin if it has
        """
        if not self.auth_time or (datetime.datetime.now()
                                  - self.auth_time).seconds > 60 * 15:  # 15 minutes
            self.__login()


    def __login(self):
        self.auth_token = self.client.auth.login(self.username, self.password)
        self.auth_time = datetime.datetime.now()


    def list_channel_labels(self):
        self.auth_check()
        key = "chan_labels"
        if self.cache.has_key(key):
            return self.cache[key]

        chan_list = self.client.channel.listAllChannels(self.auth_token)
        to_ret = []
        for item in chan_list:
            to_ret.append(item["label"])
        self.cache[key] = to_ret
        return to_ret
    def apply_channel_state(self, server_ids):
        self.auth_check()
        self.client.channel.software.applyChannelState(self.auth_token, server_ids)


def __applyChannelState(server_ids, username, password):
    xmlrpc = RemoteApi("https://" + getfqdn() + "/rpc/api", username, password)
    return xmlrpc.apply_channel_state(server_ids)

def __getMinionsByChannel(labels):
    sql = """
        SELECT DISTINCT  mi.server_id
             FROM rhnChannel c 
             JOIN rhnServerChannel sc ON c.id = sc.channel_id 
             JOIN suseMinionInfo mi ON mi.server_id = sc.server_id 
        WHERE c.label IN (%s)
    """
    params, bind_params = _bind_many(labels)
    bind_params = ', '.join(bind_params)
    h = rhnSQL.prepare(sql % (bind_params))
    h.execute(**params)
    server_list = h.fetchall_dict()
    if not server_list:
        return []
    server_ids = [s['server_id'] for s in server_list]
    return server_ids;


def __serverCheck(labels, unsubscribe):
    sql = """
        select distinct S.org_id, S.id, S.name
        from rhnChannel c inner join
             rhnServerChannel sc on c.id = sc.channel_id inner join
             rhnServer s on s.id = sc.server_id
        where c.label in (%s)
    """
    params, bind_params = _bind_many(labels)
    bind_params = ', '.join(bind_params)
    h = rhnSQL.prepare(sql % (bind_params))
    h.execute(**params)
    server_list = h.fetchall_dict()
    if not server_list:
        return 0

    if unsubscribe:
        return __unsubscribeServers(labels)

    print("\nCurrently there are systems subscribed to one or more of the specified channels.")
    print("If you would like to automatically unsubscribe these systems, simply use the --unsubscribe flag.\n")
    print("The following systems were found to be subscribed:")

    print(("%-8s %-14s name" % ('org_id', 'id')))
    print(("-" * 32))
    for server in server_list:
        print(("%-8s %-14s %s" % (server['org_id'], server['id'], server['name'])))

    return len(server_list)


def __unsubscribeServers(labels):
    sql = """
        select distinct sc.server_id as server_id, C.id as channel_id, c.parent_channel, c.label
        from rhnChannel c inner join
             rhnServerChannel sc on c.id = sc.channel_id
        where c.label in (%s) order by C.parent_channel
    """
    params, bind_params = _bind_many(labels)
    bind_params = ', '.join(bind_params)
    h = rhnSQL.prepare(sql % (bind_params))
    h.execute(**params)
    server_channel_list = h.fetchall_dict()

    if server_channel_list is None:
        server_channel_list = {}

    channel_counts = {}
    for i in server_channel_list:
        if i['label'] in channel_counts:
            channel_counts[i['label']] = channel_counts[i['label']] + 1
        else:
            channel_counts[i['label']] = 1
    print("\nThe following channels will have their systems unsubscribed:")
    channel_list = list(channel_counts.keys())
    channel_list.sort()
    for i in channel_list:
        print(("%-40s %-8s" % (i, channel_counts[i])))

    pb = ProgressBar(prompt='Unsubscribing:    ', endTag=' - complete',
                     finalSize=len(server_channel_list), finalBarLength=40, stream=sys.stdout)
    pb.printAll(1)

    unsubscribe_server_proc = rhnSQL.Procedure("rhn_channel.unsubscribe_server")
    for i in server_channel_list:
        unsubscribe_server_proc(i['server_id'], i['channel_id'])
        pb.addTo(1)
        pb.printIncrement()
    pb.printComplete()
    rhnSQL.commit()


def __kickstartCheck(labels):
    sql = """
        select K.org_id, K.label
        from rhnKSData K inner join
             rhnKickstartDefaults KD on KD.kickstart_id = K.id inner join
             rhnKickstartableTree KT on KT.id = KD.kstree_id inner join
             rhnChannel c on c.id = KT.channel_id
        where c.label in (%s)
    """
    params, bind_params = _bind_many(labels)
    bind_params = ', '.join(bind_params)
    h = rhnSQL.prepare(sql % (bind_params))
    h.execute(**params)
    kickstart_list = h.fetchall_dict()

    if not kickstart_list:
        return 0

    print(("The following kickstarts are associated with one of the specified channels. " +
          "Please remove these or change their associated base channel.\n"))
    print(("%-8s label" % 'org_id'))
    print(("-" * 20))
    for kickstart in kickstart_list:
        print(("%-8s %s" % (kickstart['org_id'], kickstart['label'])))

    return len(kickstart_list)


def __listChannels():
    sql = """
        select c1.label, c2.label parent_channel
        from rhnChannel c1 left outer join rhnChannel c2 on c1.parent_channel = c2.id
        order by c2.label desc, c1.label asc
    """
    h = rhnSQL.prepare(sql)
    h.execute()
    labels = {}
    parents = {}
    while 1:
        row = h.fetchone_dict()
        if not row:
            break
        parent_channel = row['parent_channel']
        labels[row['label']] = parent_channel
        if not parent_channel:
            parents[row['label']] = []

        if parent_channel:
            parents[parent_channel].append(row['label'])

    return labels, parents


def __clonnedChannels(channelLabel):
    sql = """
        select c2.label
        from rhnChannel c1 inner join rhnChannelCloned clone on c1.id=clone.original_id
        inner join rhnChannel c2 on c2.id=clone.id
        where c1.label = :label
    """
    h = rhnSQL.prepare(sql)
    h.execute(label=channelLabel)
    labels = []
    while 1:
        row = h.fetchone_dict()
        if not row:
            break
        labels.append(row['label'])

    return labels

def delete_outside_channels(org):
    rpms_ids = list_packages_without_channels(org, sources=0)
    rpms_paths = _get_package_paths(rpms_ids, sources=0)
    srpms_ids = list_packages_without_channels(org, sources=1)
    srpms_paths = _get_package_paths(srpms_ids, sources=1)

    _delete_srpms(srpms_ids)
    _delete_rpms(rpms_ids)

    _delete_files(rpms_paths + srpms_paths)


def delete_channels(channelLabels, force=0, justdb=0, skip_packages=0, skip_channels=0,
                    skip_kickstart_trees=0, just_kickstart_trees=0):
    # Get the package ids
    if not channelLabels:
        return

    rpms_ids = list_packages(channelLabels, force=force, sources=0)
    rpms_paths = _get_package_paths(rpms_ids, sources=0)
    srpms_ids = list_packages(channelLabels, force=force, sources=1)
    srpms_paths = _get_package_paths(srpms_ids, sources=1)

    if not skip_packages and not just_kickstart_trees:
        _delete_srpms(srpms_ids)
        _delete_rpms(rpms_ids)

    if not skip_kickstart_trees and not justdb:
        _delete_ks_files(channelLabels)

    if not justdb and not skip_packages and not just_kickstart_trees:
        _delete_files(rpms_paths + srpms_paths)

    # Get the channel ids
    h = rhnSQL.prepare("""
        select id, parent_channel
        from rhnChannel
        where label = :label
        order by parent_channel""")
    channel_ids = []
    for label in channelLabels:
        h.execute(label=label)
        row = h.fetchone_dict()
        if not row:
            break
        channel_id = row['id']
        if row['parent_channel']:
            # Subchannel, we have to remove it first
            channel_ids.insert(0, channel_id)
        else:
            channel_ids.append(channel_id)

    if not channel_ids:
        return

    clp = rhnSQL.prepare("""
       select id
       from susecontentenvironmenttarget
       where channel_id = :cid
       """)

    for cid in channel_ids:
        clp.execute(cid=cid)
        row = clp.fetchone()
        if row:
            print("Channel belongs to a Content Lifecycle Project. Please use the web UI or API.")
            return

    indirect_tables = [
        ['rhnKickstartableTree', 'channel_id', 'rhnKSTreeFile', 'kstree_id'],
    ]
    query = """
        delete from %(table_2)s where %(link_field)s in (
            select id
              from %(table_1)s
             where %(channel_field)s = :channel_id
        )
    """
    for e in indirect_tables:
        args = {
            'table_1': e[0],
            'channel_field': e[1],
            'table_2': e[2],
            'link_field': e[3],
        }
        h = rhnSQL.prepare(query % args)
        h.executemany(channel_id=channel_ids)

    tables = [
        ['rhnErrataFileChannel', 'channel_id'],
        ['rhnErrataNotificationQueue', 'channel_id'],
        ['rhnChannelErrata', 'channel_id'],
        ['rhnChannelPackage', 'channel_id'],
        ['rhnRegTokenChannels', 'channel_id'],
        ['rhnServerProfile', 'base_channel'],
        ['rhnKickstartableTree', 'channel_id'],
    ]

    if not skip_channels:
        tables.extend([
            ['suseProductChannel', 'channel_id'],
            ['rhnChannelFamilyMembers', 'channel_id'],
            ['rhnDistChannelMap', 'channel_id'],
            ['rhnReleaseChannelMap', 'channel_id'],
            ['rhnChannel', 'id'],
        ])

    if just_kickstart_trees:
        tables = [['rhnKickstartableTree', 'channel_id']]

    query = "delete from %s where %s = :channel_id"
    for table, field in tables:
        log_debug(3, "Processing table %s" % table)
        h = rhnSQL.prepare(query % (table, field))
        h.executemany(channel_id=channel_ids)

    if not justdb and not just_kickstart_trees:
        __deleteRepoData(channelLabels)


def __deleteRepoData(labels):
    directory = '/var/cache/' + CFG.repomd_path_prefix
    for label in labels:
        if os.path.isdir(directory + '/' + label):
            shutil.rmtree(directory + '/' + label)


def list_packages_without_channels(org_id, sources=0):
    """List packages in given org outside any channel"""

    if sources:
        query = """
            select ps.id from rhnPackage p inner join
                              rhnPackageSource ps on p.source_rpm_id = ps.source_rpm_id left join
                              rhnChannelPackage cp on cp.package_id = p.id
            where cp.channel_id is null
        """
    else:
        query = """
            select p.id from rhnPackage p left join
                             rhnChannelPackage cp on cp.package_id = p.id
            where cp.channel_id is null
        """

    if org_id:
        query += """
            and p.org_id = :org_id
        """
        if sources:
            query += """
                and p.org_id = ps.org_id
            """
    else:
        query += """
            and p.org_id is null
        """
        if sources:
            query += """
                and ps.org_id is null
            """

    h = rhnSQL.prepare(query)
    h.execute(org_id=org_id)

    return [x['id'] for x in h.fetchall_dict() or []]


def list_packages(channelLabels, sources=0, force=0):
    "List the source ids for the channels"
    if sources:
        packages = "srpms"
    else:
        packages = "rpms"
    log_debug(3, "Listing %s" % packages)
    if not channelLabels:
        return []

    params, bind_params = _bind_many(channelLabels)
    bind_params = ', '.join(bind_params)

    if sources:
        templ = _templ_srpms()
    else:
        templ = _templ_rpms()

    if force:
        query = templ % ("", bind_params)
    else:
        minus_op = 'EXCEPT'  # ANSI syntax
        query = """
            %s
            %s
            %s
        """ % (
            templ % ("", bind_params),
            minus_op,
            templ % ("not", bind_params),
        )
    h = rhnSQL.prepare(query)
    h.execute(**params)
    return [x['id'] for x in h.fetchall_dict() or []]


def _templ_rpms():
    "Returns a template for querying rpms"
    log_debug(4, "Generating template for querying rpms")
    return """\
        select cp.package_id id
        from rhnChannel c, rhnChannelPackage cp
        where c.label %s in (%s)
        and cp.channel_id = c.id"""


def _templ_srpms():
    "Returns a template for querying srpms"
    log_debug(4, "Generating template for querying srpms")
    return """\
        select  ps.id id
        from    rhnPackage p,
                rhnPackageSource ps,
                rhnChannelPackage cp,
                rhnChannel c
        where   c.label %s in (%s)
            and c.id = cp.channel_id
            and cp.package_id = p.id
            and p.source_rpm_id = ps.source_rpm_id
            and ((p.org_id is null and ps.org_id is null) or
                p.org_id = ps.org_id)"""


def _delete_srpms(srcPackageIds):
    """Blow away rhnPackageSource and rhnFile entries.
    """
    if not srcPackageIds:
        return
    # nuke the rhnPackageSource entry
    h = rhnSQL.prepare("""
        delete
        from rhnPackageSource
        where id = :id
    """)
    h.executemany(id=srcPackageIds)


def _delete_rpms(packageIds):
    if not packageIds:
        return
    group = 300
    toDel = packageIds[:]
    print("Deleting package metadata (" + str(len(toDel)) + "):")
    pb = ProgressBar(prompt='Removing:         ', endTag=' - complete',
                     finalSize=len(packageIds), finalBarLength=40, stream=sys.stdout)
    pb.printAll(1)

    while toDel:
        _delete_rpm_group(toDel[:group])
        del toDel[:group]
        pb.addTo(group)
        pb.printIncrement()
    pb.printComplete()


def _delete_rpm_group(packageIds):

    references = [
        'rhnChannelPackage',
        'rhnErrataPackage',
        'rhnErrataPackageTMP',
        'rhnPackageChangelogRec',
        'rhnPackageConflicts',
        'rhnPackageFile',
        'rhnPackageObsoletes',
        'rhnPackageProvides',
        'rhnPackageRequires',
        'rhnPackageRecommends',
        'rhnPackageSuggests',
        'rhnPackageSupplements',
        'rhnPackageEnhances',
        'rhnPackageBreaks',
        'rhnPackagePredepends',
        'rhnServerNeededCache',
        'susePackageProductFile',
    ]
    deleteStatement = "delete from %s where package_id = :package_id"
    for table in references:
        h = rhnSQL.prepare(deleteStatement % table)
        h.executemany(package_id=packageIds)
    deleteStatement = "delete from rhnPackage where id = :package_id"
    h = rhnSQL.prepare(deleteStatement)
    h.executemany(package_id=packageIds)
    rhnSQL.commit()


def _delete_files(relpaths):
    for relpath in relpaths:
        path = os.path.join(CFG.MOUNT_POINT, relpath)
        if not os.path.exists(path):
            log_debug(1, "Not removing %s: no such file" % path)
            continue
        unlink_package_file(path)


def _bind_many(l):
    h = {}
    lr = []
    for i, item in enumerate(l):
        key = 'p_%s' % i
        h[key] = item
        lr.append(':' + key)
    return h, lr


def _get_package_paths(package_ids, sources=0):
    if sources:
        table = "rhnPackageSource"
    else:
        table = "rhnPackage"
    h = rhnSQL.prepare("select path from %s where id = :package_id" % table)
    pdict = {}
    for package_id in package_ids:
        h.execute(package_id=package_id)
        row = h.fetchone_dict()
        if not row:
            continue
        if not row['path']:
            continue
        pdict[row['path']] = None

    return list(pdict.keys())


def _delete_ks_files(channel_labels):
    sql = """
        select kt.base_path
          from rhnChannel c
          join rhnKickstartableTree kt on c.id = kt.channel_id
         where c.label in (%s) and not exists (
                select 1
                  from rhnKickstartableTree ktx
                  join rhnChannel cx on cx.id = ktx.channel_id
                 where replace(ktx.base_path, :mnt_point, '') =
                       replace(kt.base_path, :mnt_point, '')
                   and cx.label not in (%s))
    """

    params, bind_params = _bind_many(channel_labels)
    params['mnt_point'] = CFG.MOUNT_POINT + '/'
    bind_params = ', '.join(bind_params)
    h = rhnSQL.prepare(sql % (bind_params, bind_params))
    h.execute(**params)
    kickstart_list = h.fetchall_dict() or []

    for kickstart in kickstart_list:
        path = os.path.join(CFG.MOUNT_POINT, str(kickstart['base_path']))
        if not os.path.exists(path):
            log_debug(1, "Not removing %s: no such file" % path)
            continue
        shutil.rmtree(path)
class UserError(Exception):

    def __init__(self, msg):
        Exception.__init__(self)
        self.msg = msg

    def __str__(self):
        return self.msg
070701000000C1000081B40000000000000000000000015FBBE8EE00001E68000000000000000000000000000000000000003300000000spacewalk-backend/satellite_tools/diskImportLib.py    #
# Common dumper stuff
#
# Copyright (c) 2008--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

import os

from . import xmlSource
from uyuni.common.rhnLib import hash_object_id
from spacewalk.server.importlib.backendOracle import SQLBackend
from spacewalk.server.importlib.channelImport import ChannelImport, ChannelFamilyImport
from spacewalk.server.importlib.packageImport import PackageImport, SourcePackageImport
from spacewalk.server.importlib import archImport
from spacewalk.server.importlib import productNamesImport
from spacewalk.server.importlib import orgImport
from spacewalk.server.importlib import supportInformationImport, suseProductsImport


class Backend:
    __backend = None

    def __init__(self):
        pass

    def get_backend(self):
        if self.__backend:
            return self.__backend

        Backend.__backend = SQLBackend()
        return Backend.__backend

# get_backend() returns a shared instance of an Oracle backend


def get_backend():
    return Backend().get_backend()

# Functions for dumping packages


def rpmsPath(obj_id, mountPoint, sources=0):
    # returns the package path (for exporter/importer only)
    # not to be confused with where the package lands on the satellite itself.
    if not sources:
        template = "%s/rpms/%s/%s.rpm"
    else:
        template = "%s/srpms/%s/%s.rpm"
    return os.path.normpath(template % (mountPoint, hash_object_id(obj_id, 2), obj_id))


# pylint: disable=W0232
class diskImportLibContainer:

    """virtual class - redefines endContainerCallback"""
    # pylint: disable=E1101,E0203,W0201
    # this class has no __init__ for the purpose
    # it's used in multiple inheritance mode and inherited classes should
    # use __init__ from the other base class

    importer_class = object

    def endContainerCallback(self):
        importer = self.importer_class(self.batch, get_backend())
        importer.run()
        self.batch = []


class OrgContainer(xmlSource.OrgContainer):
    importer_class = orgImport.OrgImport
    master_label = None
    create_orgs = False

    def __init__(self):
        xmlSource.OrgContainer.__init__(self)

    def set_master_and_create_org_args(self, master, create_orgs):
        self.master_label = master
        self.create_orgs = create_orgs

    def endContainerCallback(self):
        importer = self.importer_class(self.batch, get_backend(),
                                       self.master_label, self.create_orgs)
        importer.run()
        self.batch = []


class ProductNamesContainer(diskImportLibContainer, xmlSource.ProductNamesContainer):
    importer_class = productNamesImport.ProductNamesImport

    def endContainerCallback(self):
        if not self.batch:
            return
        diskImportLibContainer.endContainerCallback(self)


class ChannelArchContainer(diskImportLibContainer, xmlSource.ChannelArchContainer):
    importer_class = archImport.ChannelArchImport


class PackageArchContainer(diskImportLibContainer, xmlSource.PackageArchContainer):
    importer_class = archImport.PackageArchImport


class ServerArchContainer(diskImportLibContainer, xmlSource.ServerArchContainer):
    importer_class = archImport.ServerArchImport


class CPUArchContainer(diskImportLibContainer, xmlSource.CPUArchContainer):
    importer_class = archImport.CPUArchImport


class ServerPackageArchCompatContainer(diskImportLibContainer, xmlSource.ServerPackageArchCompatContainer):
    importer_class = archImport.ServerPackageArchCompatImport


class ServerChannelArchCompatContainer(diskImportLibContainer, xmlSource.ServerChannelArchCompatContainer):
    importer_class = archImport.ServerChannelArchCompatImport


class ChannelPackageArchCompatContainer(diskImportLibContainer, xmlSource.ChannelPackageArchCompatContainer):
    importer_class = archImport.ChannelPackageArchCompatImport


class ServerGroupServerArchCompatContainer(diskImportLibContainer, xmlSource.ServerGroupServerArchCompatContainer):
    importer_class = archImport.ServerGroupServerArchCompatImport


class ChannelFamilyContainer(diskImportLibContainer, xmlSource.ChannelFamilyContainer):
    importer_class = ChannelFamilyImport


class ChannelContainer(diskImportLibContainer, xmlSource.ChannelContainer):
    importer_class = ChannelImport


class PackageContainer(diskImportLibContainer, xmlSource.PackageContainer):
    importer_class = PackageImport


class SourcePackageContainer(diskImportLibContainer, xmlSource.SourcePackageContainer):
    importer_class = SourcePackageImport

class SupportInformationContainer(diskImportLibContainer, xmlSource.SupportInformationContainer):
    importer_class = supportInformationImport.SupportInformationImport
    def endContainerCallback(self):
        if not self.batch:
            return
        diskImportLibContainer.endContainerCallback(self)

class SuseProductsContainer(diskImportLibContainer, xmlSource.SuseProductsContainer):
    importer_class = suseProductsImport.SuseProductsImport
    def endContainerCallback(self):
        if not self.batch:
            return
        diskImportLibContainer.endContainerCallback(self)

class SuseProductChannelsContainer(diskImportLibContainer, xmlSource.SuseProductChannelsContainer):
    importer_class = suseProductsImport.SuseProductChannelsImport
    def endContainerCallback(self):
        if not self.batch:
            return
        diskImportLibContainer.endContainerCallback(self)

class SuseUpgradePathsContainer(diskImportLibContainer, xmlSource.SuseUpgradePathsContainer):
    importer_class = suseProductsImport.SuseUpgradePathsImport
    def endContainerCallback(self):
        if not self.batch:
            return
        diskImportLibContainer.endContainerCallback(self)

class SuseProductExtensionsContainer(diskImportLibContainer, xmlSource.SuseProductExtensionsContainer):
    importer_class = suseProductsImport.SuseProductExtensionsImport
    def endContainerCallback(self):
        if not self.batch:
            return
        diskImportLibContainer.endContainerCallback(self)

class SuseProductRepositoriesContainer(diskImportLibContainer, xmlSource.SuseProductRepositoriesContainer):
    importer_class = suseProductsImport.SuseProductRepositoriesImport
    def endContainerCallback(self):
        if not self.batch:
            return
        diskImportLibContainer.endContainerCallback(self)

class SCCRepositoriesContainer(diskImportLibContainer, xmlSource.SCCRepositoriesContainer):
    importer_class = suseProductsImport.SCCRepositoriesImport
    def endContainerCallback(self):
        if not self.batch:
            return
        diskImportLibContainer.endContainerCallback(self)

class SuseSubscriptionsContainer(diskImportLibContainer, xmlSource.SuseSubscriptionsContainer):
    importer_class = suseProductsImport.SuseSubscriptionsImport
    def endContainerCallback(self):
        if not self.batch:
            return
        diskImportLibContainer.endContainerCallback(self)

class ClonedChannelsContainer(diskImportLibContainer, xmlSource.ClonedChannelsContainer):
    importer_class = suseProductsImport.ClonedChannelsImport
    def endContainerCallback(self):
        if not self.batch:
            return
        diskImportLibContainer.endContainerCallback(self)
070701000000C2000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002E00000000spacewalk-backend/satellite_tools/disk_dumper 070701000000C3000081B40000000000000000000000015FBBE8EE00000591000000000000000000000000000000000000003700000000spacewalk-backend/satellite_tools/disk_dumper/Makefile    # Makefile for spacewalk backend
#
#
# Copyright (c) 2008--2013 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
# 
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation. 
#
#

TOP	= ../..

# Specific stuff
SUBDIR	= satellite_tools/disk_dumper
SPACEWALK_FILES	= __init__ iss iss_isos iss_ui iss_actions dumper string_buffer
SCRIPTS = rhn-satellite-exporter
BINDIR	= /usr/bin
include $(TOP)/Makefile.defs

#Man page specific stuff
DOCBOOK = $(wildcard /usr/bin/docbook2man)

SGMLS	= $(wildcard *.sgml)
MANS	= $(patsubst %.sgml,%.8,$(SGMLS))

MANDIR	?= /usr/man

EXTRA_DIRS = $(MANDIR)/man8 $(BINDIR)

# install scripts
all :: $(SCRIPTS)
install :: $(SCRIPTS) $(PREFIX)/$(BINDIR)
	$(INSTALL_BIN) $(SCRIPTS) $(PREFIX)/$(BINDIR)

ifneq ($(DOCBOOK),)
# install man pages
all	:: $(MANS)
install :: $(MANS) $(PREFIX)/$(MANDIR)
	$(INSTALL_DATA) $(MANS) $(PREFIX)/$(MANDIR)/man8
endif


%.8 : %.sgml
	$(DOCBOOK) $<

clean ::
	@rm -fv $(MANS) manpage.* *.new
   070701000000C4000081B40000000000000000000000015FBBE8EE00000265000000000000000000000000000000000000003A00000000spacewalk-backend/satellite_tools/disk_dumper/__init__.py #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
   070701000000C5000081B40000000000000000000000015FBBE8EE000092EF000000000000000000000000000000000000003800000000spacewalk-backend/satellite_tools/disk_dumper/dumper.py   #
# Copyright (c) 2008--2018 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import time
import gzip
import sys
import tempfile
try:
    #  python 2
    from cStringIO import StringIO
except ImportError:
    #  python3
    from io import StringIO

from uyuni.common.usix import raise_with_tb, ListType
from uyuni.common import rhnLib
from spacewalk.common import rhnCache, rhnFlags
from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.common.rhnConfig import CFG
from spacewalk.common.rhnException import rhnFault
from spacewalk.server import rhnSQL
from spacewalk.satellite_tools import constants
from spacewalk.satellite_tools.exporter import exportLib, xmlWriter
from .string_buffer import StringBuffer


class XML_Dumper:

    def __init__(self):
        self.compress_level = 5
        self.llimit = None
        self.ulimit = None
        self._channel_family_query = """
             select cf.id channel_family_id, to_number(null, null) quantity
             from rhnChannelFamily cf
        """
        self.channel_ids = []
        self.channel_ids_for_families = []
        self.exportable_orgs = 'null'
        self._raw_stream = None

    def send(self, data):
        # to be overwritten in subclass
        pass

    def close(self):
        # to be overwritten in subclass
        pass

    def get_channel_families_statement(self):
        query = """
            select cf.*, scf.quantity max_members
              from rhnChannelFamily cf,
                   (%s
                   ) scf
             where scf.channel_family_id = cf.id
        """ % self._channel_family_query
        return rhnSQL.prepare(query)

    @staticmethod
    def get_orgs_statement(org_ids):
        query = """
            select wc.id, wc.name
              from web_customer wc
             where wc.id in (%s)
        """ % org_ids
        return rhnSQL.prepare(query)

    @staticmethod
    def get_channel_families_statement_new(cids):

        args = {
            'ch_ids': cids
        }

        query = """
            select distinct cf.*, to_number(null, null) max_members
              from rhnchannelfamily cf, rhnchannelfamilymembers cfm
              where cf.id = cfm.channel_family_id and cfm.channel_id in ( %(ch_ids)s )
        """
        return rhnSQL.prepare(query % args)

    @staticmethod
    def get_product_names_statement(cids):
        if cids:
            query = """
                select distinct pn.label, pn.name
                  from rhnchannel c, rhnproductname pn
                  where c.product_name_id = pn.id and c.id in ( %s )
            """ % cids
        else:
            query = """
                select label, name from rhnproductname
            """
        return rhnSQL.prepare(query)

    def get_channels_statement(self):
        query = """
            select c.id channel_id, c.label,
                   ct.label as checksum_type,
                   TO_CHAR(c.last_modified, 'YYYYMMDDHH24MISS') last_modified
              from rhnChannel c left outer join rhnChecksumType ct on c.checksum_type_id = ct.id,
                   rhnChannelFamilyMembers cfm,
                   (%s
                   ) scf
             where scf.channel_family_id = cfm.channel_family_id
               and cfm.channel_id = c.id
        """ % self._channel_family_query
        return rhnSQL.prepare(query)

    def get_packages_statement(self):
        query = """
            select p.id package_id,
                   TO_CHAR(p.last_modified, 'YYYYMMDDHH24MISS') last_modified
              from rhnChannelPackage cp, rhnPackage p,
                   rhnChannelFamilyMembers cfm,
                   (%s
                   ) scf
             where scf.channel_family_id = cfm.channel_family_id
               and cfm.channel_id = cp.channel_id
               and cp.package_id = :package_id
               and p.id = :package_id
        """ % self._channel_family_query
        return rhnSQL.prepare(query)

    def get_source_packages_statement(self):
        query = """
            select ps.id package_id,
                   TO_CHAR(ps.last_modified, 'YYYYMMDDHH24MISS') last_modified
              from rhnChannelPackage cp, rhnPackage p, rhnPackageSource ps,
                   rhnChannelFamilyMembers cfm,
                   (%s
                   ) scf
             where scf.channel_family_id = cfm.channel_family_id
               and cfm.channel_id = cp.channel_id
               and cp.package_id = p.id
               and p.source_rpm_id = ps.source_rpm_id
               and ((p.org_id is null and ps.org_id is null) or
                     p.org_id = ps.org_id)
               and ps.id = :package_id
        """ % self._channel_family_query
        return rhnSQL.prepare(query)

    def get_errata_statement(self):
        query = """
            select e.id errata_id,
                   TO_CHAR(e.last_modified, 'YYYYMMDDHH24MISS') last_modified
              from rhnChannelErrata ce, rhnErrata e,
                   rhnChannelFamilyMembers cfm,
                   (%s
                   ) scf
             where scf.channel_family_id = cfm.channel_family_id
               and cfm.channel_id = ce.channel_id
               and ce.errata_id = :errata_id
               and e.id = :errata_id
        """ % self._channel_family_query
        return rhnSQL.prepare(query)

    def _get_xml_writer(self):
        return xmlWriter.XMLWriter(stream=StringBuffer(self))

    def _write_dump(self, item_dumper_class, **kwargs):
        writer = self._get_xml_writer()
        dumper = SatelliteDumper(writer, item_dumper_class(writer, **kwargs))
        dumper.dump()
        writer.flush()
        log_debug(4, "OK")

    # Dumper functions here
    def dump_blacklist_obsoletes(self):
        log_debug(2)
        self._write_dump(exportLib.BlacklistObsoletesDumper)
        return 0

    def dump_arches(self, rpm_arch_type_only=0):
        log_debug(2)
        writer = self._get_xml_writer()
        dumper = SatelliteDumper(
            writer,
            exportLib.ChannelArchesDumper(writer, rpm_arch_type_only=rpm_arch_type_only),
            exportLib.PackageArchesDumper(writer, rpm_arch_type_only=rpm_arch_type_only),
            exportLib.ServerArchesDumper(writer, rpm_arch_type_only=rpm_arch_type_only),
            exportLib.CPUArchesDumper(writer),
            exportLib.ServerPackageArchCompatDumper(writer, rpm_arch_type_only=rpm_arch_type_only),
            exportLib.ServerChannelArchCompatDumper(writer, rpm_arch_type_only=rpm_arch_type_only),
            exportLib.ChannelPackageArchCompatDumper(writer, rpm_arch_type_only=rpm_arch_type_only))
        dumper.dump()
        writer.flush()
        log_debug(4, "OK")
        self.close()
        return 0

    def dump_product_names(self):
        log_debug(2)

        # Export only product names for relevant channels
        cids = ','.join([str(x['channel_id']) for x in self.channel_ids + self.channel_ids_for_families])
        h = self.get_product_names_statement(cids)
        h.execute()

        self._write_dump(exportLib.ProductNamesDumper, data_iterator=h)
        return 0

    def dump_server_group_type_server_arches(self, rpm_arch_type_only=0,
                                             virt_filter=0):
        log_debug(2)
        self._write_dump(exportLib.ServerGroupTypeServerArchCompatDumper,
                         rpm_arch_type_only=rpm_arch_type_only, virt_filter=virt_filter)
        return 0

    def dump_channel_families(self):
        log_debug(2)

        cids = ','.join([str(x['channel_id']) for x in self.channel_ids + self.channel_ids_for_families])

        h = self.get_channel_families_statement_new(cids)
        h.execute()

        self._write_dump(exportLib.ChannelFamiliesDumper,
                         data_iterator=h, null_max_members=0)
        return 0

    def set_exportable_orgs(self, org_list):
        if not org_list:
            self.exportable_orgs = 'null'
        elif isinstance(org_list, type('')):
            self.exportable_orgs = org_list
        else:
            self.exportable_orgs = ', '.join([str(x) for x in org_list])

    def dump_orgs(self):
        log_debug(2)

        h = self.get_orgs_statement(self.exportable_orgs)
        h.execute()

        self._write_dump(exportLib.OrgsDumper, data_iterator=h)
        return 0

    def dump_channels(self, channel_labels=None, start_date=None, end_date=None, use_rhn_date=True, whole_errata=False):
        log_debug(2)
        #channels = self._validate_channels(channel_labels=channel_labels)

        self._write_dump(ChannelsDumper,
                         channels=channel_labels, start_date=start_date, end_date=end_date, use_rhn_date=use_rhn_date,
                         whole_errata=whole_errata)
        return 0

    def _send_headers(self, error=0, init_compressed_stream=1):
        """to be overwritten in subclass"""
        pass

    def dump_channel_packages_short(self, channel_label, last_modified, filepath=None,
                                    validate_channels=False, send_headers=False,
                                    open_stream=True):
        log_debug(2, channel_label)
        if validate_channels:
            channels = self._validate_channels(channel_labels=[channel_label])
            channel_obj = channels[channel_label]
        else:
            channels = channel_label
            channel_obj = channels
        db_last_modified = int(rhnLib.timestamp(channel_obj['last_modified']))
        last_modified = int(rhnLib.timestamp(last_modified))
        log_debug(3, "last modified", last_modified, "db last modified",
                  db_last_modified)
        if last_modified != db_last_modified:
            raise rhnFault(3013, "The requested channel version does not match"
                           " the upstream version", explain=0)
        channel_id = channel_obj['channel_id']
        if filepath:
            key = filepath
        else:
            key = "xml-channel-packages/rhn-channel-%d.data" % channel_id
        # Try to get everything off of the cache
        val = rhnCache.get(key, compressed=0, raw=1, modified=last_modified)
        if val is None:
            # Not generated yet
            log_debug(4, "Cache MISS for %s (%s)" % (channel_label,
                                                     channel_id))
            stream = self._cache_channel_packages_short(channel_id, key,
                                                        last_modified)
        else:
            log_debug(4, "Cache HIT for %s (%s)" % (channel_label,
                                                    channel_id))
            temp_stream = tempfile.TemporaryFile()
            temp_stream.write(bytes(val, encoding="latin-1"))
            temp_stream.flush()
            stream = self._normalize_compressed_stream(temp_stream)

        # Copy the results to the output stream
        # They shold be already compressed if they were requested to be
        # compressed
        buffer_size = 16384
        # Send the HTTP headers - but don't init the compressed stream since
        # we send the data ourselves
        if send_headers:
            self._send_headers(init_compressed_stream=0)
        if open_stream:
            self._raw_stream = open(key, "w")
        while 1:
            buff = stream.read(buffer_size)
            if not buff:
                break
            try:
                self._raw_stream.write(buff)
            except IOError:
                log_error("Client disconnected prematurely")
                self.close()
                raise_with_tb(ClosedConnectionError, sys.exc_info()[2])
        # We're done
        if open_stream:
            self._raw_stream.close()
        return 0

    _query_get_channel_packages = rhnSQL.Statement("""
        select cp.package_id,
               TO_CHAR(p.last_modified, 'YYYYMMDDHH24MISS') last_modified
          from rhnChannelPackage cp,
               rhnPackage p
         where cp.channel_id = :channel_id
           and cp.package_id = p.id
    """)

    def _cache_channel_packages_short(self, channel_id, key, last_modified):
        """ Caches the short package entries for channel_id """
        # Create a temporary file
        temp_stream = tempfile.TemporaryFile()
        stream = StringIO()
        # Always compress the result
        compress_level = 5
        writer = xmlWriter.XMLWriter(stream=stream)

        # Fetch packages
        h = rhnSQL.prepare(self._query_get_channel_packages)
        h.execute(channel_id=channel_id)
        package_ids = h.fetchall_dict() or []
        # Sort packages
        package_ids.sort(key=lambda a: a['package_id'])

        dumper = SatelliteDumper(writer,
                                 ShortPackagesDumper(writer, package_ids))
        dumper.dump()
        writer.flush()
        stream.seek(0, 0)
        temp_stream.write(gzip.compress(data=stream.read().encode(), compresslevel=compress_level))
        # We're done with the stream object
        stream.close()
        del stream
        temp_stream.seek(0, 0)
        # Set the value in the cache. We don't recompress the result since
        # it's already compressed
        rhnCache.set(key, temp_stream.read(), modified=last_modified,
                     compressed=0, raw=1)
        return self._normalize_compressed_stream(temp_stream)

    def _normalize_compressed_stream(self, stream):
        """ Given a compressed stream, will either return the stream, or will
            decompress it and return it, depending on the compression level
            self.compress_level
        """
        stream.seek(0, 0)
        if self.compress_level:
            # Output should be compressed; nothing else to to
            return stream
        # Argh, have to decompress
        return gzip.GzipFile(None, "rb", 0, stream)

    def dump_packages(self, packages):
        log_debug(2)
        return self._packages(packages, prefix='rhn-package-',
                              dump_class=PackagesDumper)

    def dump_packages_short(self, packages):
        log_debug(2)
        return self._packages(packages, prefix='rhn-package-',
                              dump_class=ShortPackagesDumper)

    def dump_source_packages(self, packages):
        log_debug(2)
        return self._packages(packages, prefix='rhn-source-package-',
                              dump_class=SourcePackagesDumper, sources=1)

    @staticmethod
    def _get_item_id(prefix, name, errnum, errmsg):
        prefix_len = len(prefix)
        if name[:prefix_len] != prefix:
            raise rhnFault(errnum, errmsg % name)
        try:
            uuid = int(name[prefix_len:])
        except ValueError:
            raise_with_tb(rhnFault(errnum, errmsg % name), sys.exc_info()[2])
        return uuid

    def _packages(self, packages, prefix, dump_class, sources=0,
                  verify_packages=False):
        packages_hash = {}
        if verify_packages:
            if sources:
                h = self.get_source_packages_statement()
            else:
                h = self.get_packages_statement()

            for package in packages:
                package_id = self._get_item_id(prefix, str(package),
                                               3002, 'Invalid package name %s')
                if package_id in packages_hash:
                    # Already verified
                    continue
                h.execute(package_id=package_id)
                row = h.fetchone_dict()
                if not row:
                    # XXX Silently ignore it?
                    raise rhnFault(3003, "No such package %s" % package)
                # Saving the row, it's handy later when we create the iterator
                packages_hash[package_id] = row
        else:
            for package in packages:
                packages_hash[package['package_id']] = package

        self._write_dump(dump_class, params=list(packages_hash.values()))
        return 0

    def dump_errata(self, errata, verify_errata=False):
        log_debug(2)

        errata_hash = {}
        if verify_errata:
            h = self.get_errata_statement()
            for erratum in errata:
                errata_id = self._get_item_id('rhn-erratum-', str(erratum),
                                              3004, "Wrong erratum name %s")
                if errata_id in errata_hash:
                    # Already verified
                    continue
                h.execute(errata_id=errata_id)
                row = h.fetchone_dict()
                if not row:
                    # XXX Silently ignore it?
                    raise rhnFault(3005, "No such erratum %s" % erratum)
                # Saving the row, it's handy later when we create the iterator
                errata_hash[errata_id] = row
        else:
            for erratum in errata:
                errata_hash[erratum['errata_id']] = erratum

        self._write_dump(ErrataDumper, params=list(errata_hash.values()))
        return 0

    def dump_kickstartable_trees(self, kickstart_labels=None,
                                 validate_kickstarts=False):
        log_debug(2)
        if validate_kickstarts:
            kickstart_labels = self._validate_kickstarts(
                kickstart_labels=kickstart_labels)

        self._write_dump(KickstartableTreesDumper, params=kickstart_labels)
        return 0

    def _validate_channels(self, channel_labels=None):
        log_debug(4)
        # Sanity check
        if channel_labels:
            if not isinstance(channel_labels, ListType):
                raise rhnFault(3000,
                               "Expected list of channels, got %s" % type(channel_labels))

        h = self.get_channels_statement()
        h.execute()
        # Hash the list of all available channels based on the label
        all_channels_hash = {}
        while 1:
            row = h.fetchone_dict()
            if not row:
                break
            all_channels_hash[row['label']] = row

        # Intersect the list of channels they've sent to us
        iss_slave_sha256_capable = (float(rhnFlags.get('X-RHN-Satellite-XML-Dump-Version'))
                                    >= constants.SHA256_SUPPORTED_VERSION)

        if not channel_labels:
            channels = all_channels_hash
        else:
            channels = {}
            for label in channel_labels:
                if label not in all_channels_hash:
                    raise rhnFault(3001, "Could not retrieve channel %s" %
                                   label)
                if not (iss_slave_sha256_capable
                        or all_channels_hash[label]['checksum_type'] in [None, 'sha1']):
                    raise rhnFault(3001,
                                   ("Channel %s has incompatible rpm checksum (%s). Please contact\n"
                                    + "SUSE support for information about upgrade to newer version\n"
                                    + "of SUSE Manager Server which supports it.") %
                                   (label, all_channels_hash[label]['checksum_type']))
                channels[label] = all_channels_hash[label]

        return channels

    _query_validate_kickstarts = rhnSQL.Statement("""
        select kt.label kickstart_label,
               TO_CHAR(kt.modified, 'YYYYMMDDHH24MISS') last_modified
          from rhnKickstartableTree kt
         where kt.channel_id = :channel_id
           and kt.org_id is null
    """)

    def _validate_kickstarts(self, kickstart_labels):
        log_debug(4)
        # Saity check
        if kickstart_labels:
            if not isinstance(kickstart_labels, ListType):
                raise rhnFault(3000,
                               "Expected list of kickstart labels, got %s" %
                               type(kickstart_labels))

        all_ks_hash = {}

        h = self.get_channels_statement()
        h.execute()

        hk = rhnSQL.prepare(self._query_validate_kickstarts)
        while 1:
            channel = h.fetchone_dict()
            if not channel:
                break

            hk.execute(channel_id=channel['channel_id'])
            while 1:
                row = hk.fetchone_dict()
                if not row:
                    break
                all_ks_hash[row['kickstart_label']] = row

        if not kickstart_labels:
            return list(all_ks_hash.values())

        result = []
        for l in kickstart_labels:
            if l in all_ks_hash:
                result.append(all_ks_hash[l])

        return result

    def dump_support_information(self):
        log_debug(2)
        self._write_dump(exportLib.SupportInfoDumper)
        return 0

    def dump_suse_products(self):
        log_debug(2)
        self._write_dump(exportLib.SuseProductDumper)
        return 0

    def dump_suse_product_channels(self):
        log_debug(2)
        self._write_dump(exportLib.SuseProductChannelDumper)
        return 0

    def dump_suse_upgrade_paths(self):
        log_debug(2)
        self._write_dump(exportLib.SuseUpgradePathDumper)
        return 0

    def dump_suse_product_extensions(self):
        log_debug(2)
        self._write_dump(exportLib.SuseProductExtensionDumper)
        return 0

    def dump_suse_product_repositories(self):
        log_debug(2)
        self._write_dump(exportLib.SuseProductRepositoryDumper)
        return 0

    def dump_scc_repositories(self):
        log_debug(2)
        self._write_dump(exportLib.SCCRepositoryDumper)
        return 0

    def dump_suse_subscriptions(self):
        log_debug(2)
        self._write_dump(exportLib.SuseSubscriptionDumper)
        return 0

    def dump_cloned_channels(self):
        log_debug(2)
        self._write_dump(exportLib.ClonedChannelsDumper)
        return 0

class SatelliteDumper(exportLib.SatelliteDumper):

    def set_attributes(self):
        """ Overriding with our own version """
        attributes = exportLib.SatelliteDumper.set_attributes(self)
        attributes['version'] = constants.PROTOCOL_VERSION
        attributes['generation'] = CFG.SAT_CERT_GENERATION
        return attributes


class QueryIterator:

    """ A query iterator successively applies the list of params as execute() to the
        statement that was passed in, and presents the union of the result sets as a
        single result set.
        Params is a list of dictionaries that would fill the named bound variables
        from the statement.
    """

    def __init__(self, statement, params):
        self._statement = statement
        self._params = params
        # Position in the params list
        self._params_pos = -1
        self._result_set_exhausted = 1

    def fetchone_dict(self):
        log_debug(4)
        while 1:
            if self._result_set_exhausted:
                # Nothing to do here, move to the next set of params
                pos = self._params_pos
                pos = pos + 1
                self._params_pos = pos
                if pos == len(self._params):
                    # End of the list, we're done
                    return None
                # Execute the satement
                log_debug(5, "Using param", pos, self._params[pos])
                self._statement.execute(**self._params[pos])
                self._result_set_exhausted = 0
                # Go back into the loop
                continue

            # Result set not exhausted yet
            row = self._statement.fetchone_dict()
            if row:
                return row

            self._result_set_exhausted = 1


class CachedQueryIterator:

    """ This class will attempt to retrieve information, either from the database or
        from a local cache.

        Note that we expect at most one result set per database query - this can be
        easily fixed if we need more.
    """

    def __init__(self, statement, params, cache_get):
        self._statement = statement
        # XXX params has to be a list of hashes, containing at least a
        # last_modified - which is stripped before the execution of the
        # statement
        self._params = params
        self._params_pos = 0
        self._cache_get = cache_get

    def fetchone_dict(self):
        log_debug(4)
        while 1:
            if self._params_pos == len(self._params):
                log_debug(4, "End of iteration")
                self.close()
                return None
            log_debug(4, "Fetching set for param", self._params_pos)
            # Get the last modified attribute
            params = self._params[self._params_pos]
            self._params_pos = self._params_pos + 1

            # Look up the object in the cache
            val = self._cache_get(params)
            if val is not None:
                # Entry is cached
                log_debug(2, "Cache HIT for %s" % params)
                return val

            log_debug(4, "Cache MISS for %s" % params)
            start = time.time()
            self._execute(params)
            row = self._statement.fetchone_dict()

            if row:
                log_debug(5, "Timer: %.2f" % (time.time() - start))
                return (params, row)

        # Dummy return
        return None

    def _execute(self, params):
        log_debug(4, params)
        self._statement.execute(**params)

    def close(self):
        """ Make sure we remove references to these objects, or circular
            references can occur.
        """
        log_debug(3, "Closing the iterator")
        self._statement = None
        self._cache_get = None
        self._params = None


class CachedDumper(exportLib.BaseDumper):
    iterator_query = None
    item_id_key = 'id'
    hash_factor = 1
    key_template = 'dump/%s/dump-%s.xml'

    def __init__(self, writer, params):
        statement = rhnSQL.prepare(self.iterator_query)
        iterator = CachedQueryIterator(statement, params,
                                       cache_get=self.cache_get)
        exportLib.BaseDumper.__init__(self, writer, data_iterator=iterator)
        self.non_cached_class = self.__class__.__bases__[1]

    @staticmethod
    def _get_last_modified(params):
        """ To be overwritten. """
        return params['last_modified']

    def _get_key(self, params):
        item_id = str(params[self.item_id_key])
        hash_val = rhnLib.hash_object_id(item_id, self.hash_factor)
        return self.key_template % (hash_val, item_id)

    def cache_get(self, params):
        log_debug(4, params)
        key = self._get_key(params)
        last_modified = self._get_last_modified(params)
        return rhnCache.get(key, modified=last_modified, raw=1)

    def cache_set(self, params, value):
        log_debug(4, params)
        last_modified = self._get_last_modified(params)
        key = self._get_key(params)
        user = 'apache'
        group = 'apache'
        if rhnLib.isSUSE():
            user = 'wwwrun'
            group = 'www'
        return rhnCache.set(key, value, modified=last_modified,
                            raw=1, user=user, group=group, mode=int('0755', 8))

    def dump_subelement(self, data):
        log_debug(2)
        # CachedQueryIterator returns (params, row) as data
        params, row = data
        s = StringIO()
        # Back up the old writer and replace it with a StringIO-based one
        ow = self.get_writer()
        # Use into a tee stream (which writes to both streams at the same
        # time)
        tee_stream = TeeStream(s, ow.stream)
        self.set_writer(xmlWriter.XMLWriter(stream=tee_stream, skip_xml_decl=1))

        start = time.time()
        # call dump_subelement() from original (non-cached) class
        self.non_cached_class.dump_subelement(self, row)
        log_debug(5,
                  "Timer for _dump_subelement: %.2f" % (time.time() - start))

        # Restore the old writer
        self.set_writer(ow)

        self.cache_set(params, s.getvalue())


class ChannelsDumper(exportLib.ChannelsDumper):
    _query_list_channels = rhnSQL.Statement("""
        select c.id, c.org_id,
               c.label, ca.label channel_arch, c.basedir, c.name,
               c.summary, c.description, c.gpg_key_url, c.update_tag,
               c.installer_updates, ct.label checksum_type,
               TO_CHAR(c.last_modified, 'YYYYMMDDHH24MISS') last_modified,
               pc.label parent_channel, c.channel_access
          from rhnChannel c left outer join rhnChannel pc on c.parent_channel = pc.id
               left outer join rhnChecksumType ct on c.checksum_type_id = ct.id, rhnChannelArch ca
         where c.id = :channel_id
           and c.channel_arch_id = ca.id
    """)

    def __init__(self, writer, channels=(), start_date=None, end_date=None, use_rhn_date=True, whole_errata=False):
        exportLib.ChannelsDumper.__init__(self, writer, channels)
        self.start_date = start_date
        self.end_date = end_date
        self.use_rhn_date = use_rhn_date
        self.whole_errata = whole_errata

    def dump_subelement(self, data):
        log_debug(6, data)
        # return exportLib.ChannelsDumper.dump_subelement(self, data)
        # pylint: disable=W0212
        c = exportLib._ChannelDumper(self._writer, data, self.start_date, self.end_date,
                                     self.use_rhn_date, self.whole_errata)
        c.dump()

    def set_iterator(self):
        if not self._channels:
            # Nothing to do
            return

        h = rhnSQL.prepare(self._query_list_channels)
        return QueryIterator(statement=h, params=self._channels)


class ChannelsDumperEx(CachedDumper, exportLib.ChannelsDumper):
    iterator_query = rhnSQL.Statement("""
        select c.id, c.label, ca.label channel_arch, c.basedir, c.name,
               c.summary, c.description, c.gpg_key_url, c.installer_updates, c.update_tag, c.org_id,
               TO_CHAR(c.last_modified, 'YYYYMMDDHH24MISS') last_modified,
               c.channel_product_id,
               pc.label parent_channel,
               cp.product channel_product,
               cp.version channel_product_version,
               cp.beta channel_product_beta,
               c.receiving_updates,
               ct.label checksum_type,
               c.channel_access
          from rhnChannel c left outer join rhnChannel pc on c.parent_channel = pc.id
               left outer join rhnChannelProduct cp on c.channel_product_id = cp.id
               left outer join rhnChecksumType ct on c.checksum_type_id = ct.id,
               rhnChannelArch ca
         where c.id = :channel_id
           and c.channel_arch_id = ca.id
    """)

    def _get_key(self, params):
        channel_id = params['channel_id']
        return "xml-channels/rhn-channel-%d.xml" % channel_id


class ShortPackagesDumper(CachedDumper, exportLib.ShortPackagesDumper):
    iterator_query = rhnSQL.Statement("""
            select
                p.id,
                p.org_id,
                pn.name,
                (pe.evr).version as version,
                (pe.evr).release as release,
                (pe.evr).epoch as epoch,
                pa.label as package_arch,
                c.checksum_type,
                c.checksum,
                p.package_size,
                TO_CHAR(p.last_modified, 'YYYYMMDDHH24MISS') as last_modified
            from rhnPackage p, rhnPackageName pn, rhnPackageEVR pe,
                rhnPackageArch pa, rhnChecksumView c
            where p.id = :package_id
            and p.name_id = pn.id
            and p.evr_id = pe.id
            and p.package_arch_id = pa.id
            and p.checksum_id = c.id
        """)
    item_id_key = 'package_id'
    hash_factor = 2
    key_template = 'xml-short-packages/%s/rhn-package-short-%s.xml'


class PackagesDumper(CachedDumper, exportLib.PackagesDumper):
    iterator_query = rhnSQL.Statement("""
            select
                p.id,
                p.org_id,
                pn.name,
                (pe.evr).version as version,
                (pe.evr).release as release,
                (pe.evr).epoch as epoch,
                pa.label as package_arch,
                pg.name as package_group,
                p.rpm_version,
                p.description,
                p.summary,
                p.package_size,
                p.payload_size,
                p.installed_size,
                p.build_host,
                TO_CHAR(p.build_time, 'YYYYMMDDHH24MISS') as build_time,
                sr.name as source_rpm,
                c.checksum_type,
                c.checksum,
                p.vendor,
                p.payload_format,
                p.compat,
                p.header_sig,
                p.header_start,
                p.header_end,
                p.copyright,
                p.cookie,
                TO_CHAR(p.last_modified, 'YYYYMMDDHH24MISS') as last_modified
            from rhnPackage p, rhnPackageName pn, rhnPackageEVR pe,
                rhnPackageArch pa, rhnPackageGroup pg, rhnSourceRPM sr,
                rhnChecksumView c
            where p.id = :package_id
            and p.name_id = pn.id
            and p.evr_id = pe.id
            and p.package_arch_id = pa.id
            and p.package_group = pg.id
            and p.source_rpm_id = sr.id
            and p.checksum_id = c.id
        """)
    item_id_key = 'package_id'
    hash_factor = 2
    key_template = 'xml-packages/%s/rhn-package-%s.xml'


class SourcePackagesDumper(CachedDumper, exportLib.SourcePackagesDumper):
    iterator_query = rhnSQL.Statement("""
            select
                ps.id,
                sr.name source_rpm,
                pg.name package_group,
                ps.rpm_version,
                ps.payload_size,
                ps.build_host,
                TO_CHAR(ps.build_time, 'YYYYMMDDHH24MISS') build_time,
                sig.checksum sigchecksum,
                sig.checksum_type sigchecksum_type,
                ps.vendor,
                ps.cookie,
                ps.package_size,
                c.checksum_type,
                c.checksum,
                TO_CHAR(ps.last_modified, 'YYYYMMDDHH24MISS') last_modified
            from rhnPackageSource ps, rhnPackageGroup pg, rhnSourceRPM sr,
                 rhnChecksumView c, rhnChecksumView sig
            where ps.id = :package_id
            and ps.package_group = pg.id
            and ps.source_rpm_id = sr.id
            and ps.checksum_id = c.id
            and ps.sigchecksum_id = sig.id
        """)
    item_id_key = 'package_id'
    hash_factor = 2
    key_template = 'xml-packages/%s/rhn-source-package-%s.xml'


class ErrataDumper(exportLib.ErrataDumper):
    iterator_query = rhnSQL.Statement("""
            select
                e.id,
                e.org_id,
                e.advisory_name,
                e.advisory,
                e.advisory_type,
                e.advisory_rel,
                e.product,
                e.description,
                e.synopsis,
                e.topic,
                e.solution,
                TO_CHAR(e.issue_date, 'YYYYMMDDHH24MISS') issue_date,
                TO_CHAR(e.update_date, 'YYYYMMDDHH24MISS') update_date,
                TO_CHAR(e.last_modified, 'YYYYMMDDHH24MISS') last_modified,
                e.refers_to,
                e.notes,
                e.errata_from,
                e.severity_id
            from rhnErrata e
            where e.id = :errata_id
        """)

    def __init__(self, writer, params):
        statement = rhnSQL.prepare(self.iterator_query)
        iterator = QueryIterator(statement, params)
        exportLib.ErrataDumper.__init__(self, writer, iterator)


class KickstartableTreesDumper(CachedDumper, exportLib.KickstartableTreesDumper):
    iterator_query = rhnSQL.Statement("""
        select kt.id,
               c.label channel,
               kt.base_path "base-path",
               kt.label,
               kt.boot_image "boot-image",
               ktt.name "kstree-type-name",
               ktt.label "kstree-type-label",
               kit.name "install-type-name",
               kit.label "install-type-label",
               TO_CHAR(kt.last_modified, 'YYYYMMDDHH24MISS') "last-modified"
          from rhnKickstartableTree kt,
               rhnKSTreeType ktt,
               rhnKSInstallType kit,
               rhnChannel c
         where kt.channel_id = c.id
           and ktt.id = kt.kstree_type
           and kit.id = kt.install_type
           and kt.org_id is NULL
           and kt.label = :kickstart_label
    """)

    def _get_key(self, params):
        kickstart_label = params['kickstart_label']
        return "xml-kickstartable-tree/%s.xml" % kickstart_label


class ClosedConnectionError(Exception):
    pass


class TeeStream:

    """Writes to multiple streams at the same time"""

    def __init__(self, *streams):
        self.streams = streams

    def write(self, data):
        log_debug(6, "Writing %s bytes" % len(data))
        for stream in self.streams:
            stream.write(data)
 070701000000C6000081B40000000000000000000000015FBBE8EE00011803000000000000000000000000000000000000003500000000spacewalk-backend/satellite_tools/disk_dumper/iss.py  #
# Copyright (c) 2008--2018 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import os
import os.path
import sys
import time
import gzip
import shutil
import gettext
try:
    #  python 2
    import cStringIO
except ImportError:
    #  python3
    import io as cStringIO
from . import dumper
from uyuni.common.usix import raise_with_tb
from uyuni.common.checksum import getFileChecksum
from spacewalk.common import rhnMail
from spacewalk.common.rhnConfig import CFG, initCFG
from spacewalk.common.rhnTB import Traceback, exitWithTraceback
from spacewalk.server import rhnSQL
from spacewalk.server.rhnSQL import SQLError, SQLSchemaError, SQLConnectError
from spacewalk.satellite_tools.exporter import xmlWriter
from spacewalk.satellite_tools import xmlDiskSource, diskImportLib, progress_bar
from spacewalk.satellite_tools.syncLib import initEMAIL_LOG, dumpEMAIL_LOG, log2email, log2stderr, log2stdout
from .iss_ui import UI
from .iss_actions import ActionDeps
from . import iss_isos

t = gettext.translation('spacewalk-backend-server', fallback=True)
try:
    _ = t.ugettext
except AttributeError:
    _ = t.gettext

# bare-except and broad-except
# pylint: disable=W0702,W0703

class ISSError(Exception):

    def __init__(self, msg, tb):
        Exception.__init__(self)
        self.msg = msg
        self.tb = tb


# xmlDiskSource doesn't have a class for short channel packages, so I added one here.
# I named _getFile that way so it's similar to the stuff in xmlDiskSource.
# I grabbed the value of pathkey from dump_channel_packages_short in dumper.py.
class ISSChannelPackageShortDiskSource:

    def __init__(self, mount_point, channel_name=None):
        self.mp = mount_point
        self.channelid = channel_name
        self.pathkey = "xml-channel-packages/rhn-channel-%d.data"

    def setChannel(self, channel_id):
        self.channelid = channel_id

    def _getFile(self):
        return os.path.join(self.mp, self.pathkey % (self.channelid,))


class FileMapper:

    """ This class maps dumps to files. In other words, you give it
    the type of dump you're doing and it gives you the file to
    write it to.
    """

    def __init__(self, mount_point):
        self.mp = mount_point
        self.filemap = {
            'arches':   xmlDiskSource.ArchesDiskSource(self.mp),
            'arches-extra':   xmlDiskSource.ArchesExtraDiskSource(self.mp),
            'blacklists':   xmlDiskSource.BlacklistsDiskSource(self.mp),
            'channelfamilies':   xmlDiskSource.ChannelFamilyDiskSource(self.mp),
            'orgs':   xmlDiskSource.OrgsDiskSource(self.mp),
            'channels':   xmlDiskSource.ChannelDiskSource(self.mp),
            'channel-pkg-short':   ISSChannelPackageShortDiskSource(self.mp),
            'packages-short':   xmlDiskSource.ShortPackageDiskSource(self.mp),
            'packages':   xmlDiskSource.PackageDiskSource(self.mp),
            'sourcepackages':   xmlDiskSource.SourcePackageDiskSource(self.mp),
            'errata':   xmlDiskSource.ErrataDiskSource(self.mp),
            'kickstart_trees':   xmlDiskSource.KickstartDataDiskSource(self.mp),
            'kickstart_files':   xmlDiskSource.KickstartFileDiskSource(self.mp),
            'binary_rpms':   xmlDiskSource.BinaryRPMDiskSource(self.mp),
            'comps':   xmlDiskSource.ChannelCompsDiskSource(self.mp),
            'modules':   xmlDiskSource.ChannelModulesDiskSource(self.mp),
            'productnames': xmlDiskSource.ProductnamesDiskSource(self.mp),
            'supportinfo': xmlDiskSource.SupportInformationDiskSource(self.mp),
            'suse_products': xmlDiskSource.SuseProductsDiskSource(self.mp),
            'suse_product_channels': xmlDiskSource.SuseProductChannelsDiskSource(self.mp),
            'suse_upgrade_paths': xmlDiskSource.SuseUpgradePathsDiskSource(self.mp),
            'suse_product_extensions': xmlDiskSource.SuseProductExtensionsDiskSource(self.mp),
            'suse_product_repositories': xmlDiskSource.SuseProductRepositoriesDiskSource(self.mp),
            'scc_repositories': xmlDiskSource.SCCRepositoriesDiskSource(self.mp),
            'suse_subscriptions': xmlDiskSource.SuseSubscriptionsDiskSource(self.mp),
            'cloned_channels': xmlDiskSource.ClonedChannelsDiskSource(self.mp),
        }

    #This will make sure that all of the directories leading up to the
    #xml file actually exist.
    @staticmethod
    def setup_file(ofile):
        # Split the path. The filename is [1], and the directories are in [0].
        dirs_to_make = os.path.split(ofile)[0]

        # Make the directories if they don't already exist.
        if not os.path.exists(dirs_to_make):
            os.makedirs(dirs_to_make)

        return ofile

    # The get*File methods will return the full path to the xml file that the dumps are placed in.
    # pylint: disable=W0212
    def getArchesFile(self):
        return self.setup_file(self.filemap['arches']._getFile())

    def getArchesExtraFile(self):
        return self.setup_file(self.filemap['arches-extra']._getFile())

    def getBlacklistsFile(self):
        return self.setup_file(self.filemap['blacklists']._getFile())

    def getOrgsFile(self):
        return self.setup_file(self.filemap['orgs']._getFile())

    def getChannelFamiliesFile(self):
        return self.setup_file(self.filemap['channelfamilies']._getFile())

    def getBinaryRPMFile(self):
        return self.setup_file(self.filemap['binary_rpms']._getFile())

    def getChannelsFile(self, channelname):
        self.filemap['channels'].setChannel(channelname)
        return self.setup_file(self.filemap['channels']._getFile())

    def getChannelCompsFile(self, channelname):
        self.filemap['comps'].setChannel(channelname)
        return self.setup_file(self.filemap['comps']._getFile())

    def getChannelModulesFile(self, channelname):
        self.filemap['modules'].setChannel(channelname)
        return self.setup_file(self.filemap['modules']._getFile())

    def getChannelPackageShortFile(self, channel_id):
        self.filemap['channel-pkg-short'].setChannel(channel_id)
        return self.setup_file(self.filemap['channel-pkg-short']._getFile())

    def getPackagesFile(self, packageid):
        self.filemap['packages'].setID(packageid)
        return self.setup_file(self.filemap['packages']._getFile())

    def getShortPackagesFile(self, packageid):
        self.filemap['packages-short'].setID(packageid)
        return self.setup_file(self.filemap['packages-short']._getFile())

    def getSourcePackagesFile(self, sp_id):
        self.filemap['sourcepackages'].setID(sp_id)
        return self.setup_file(self.filemap['sourcepackages']._getFile())

    def getErrataFile(self, errataid):
        self.filemap['errata'].setID(errataid)
        return self.setup_file(self.filemap['errata']._getFile())

    def getKickstartTreeFile(self, ks_id):
        self.filemap['kickstart_trees'].setID(ks_id)
        return self.setup_file(self.filemap['kickstart_trees']._getFile())

    def getKickstartFileFile(self, ks_label, relative_path):
        self.filemap['kickstart_files'].setID(ks_label)
        self.filemap['kickstart_files'].set_relative_path(relative_path)
        return self.setup_file(self.filemap['kickstart_files']._getFile())

    def getProductNamesFile(self):
        return self.setup_file(self.filemap['productnames']._getFile())

    def getSupportInformationFile(self):
        return self.setup_file(self.filemap['supportinfo']._getFile())

    def getSuseProductsFile(self):
        return self.setup_file(self.filemap['suse_products']._getFile())

    def getSuseProductChannelsFile(self):
        return self.setup_file(self.filemap['suse_product_channels']._getFile())

    def getSuseUpgradePathsFile(self):
        return self.setup_file(self.filemap['suse_upgrade_paths']._getFile())

    def getSuseProductExtensionsFile(self):
        return self.setup_file(self.filemap['suse_product_extensions']._getFile())

    def getSuseProductRepositoriesFile(self):
        return self.setup_file(self.filemap['suse_product_repositories']._getFile())

    def getSCCRepositoriesFile(self):
        return self.setup_file(self.filemap['scc_repositories']._getFile())

    def getSuseSubscriptionsFile(self):
        return self.setup_file(self.filemap['suse_subscriptions']._getFile())

    def getClonedChannelsFile(self):
        return self.setup_file(self.filemap['cloned_channels']._getFile())

class Dumper(dumper.XML_Dumper):

    """ This class subclasses the XML_Dumper class. It overrides
     the _get_xml_writer method and adds a set_stream method,
     which will let it write to a file instead of over the wire.
    """

    def __init__(self, outputdir, channel_labels, org_ids, hardlinks,
                 start_date, end_date, use_rhn_date, whole_errata):
        dumper.XML_Dumper.__init__(self)
        self.fm = FileMapper(outputdir)
        self.mp = outputdir
        self.pb_label = "Exporting: "
        self.pb_length = 20  # progress bar length
        self.pb_complete = " - Done!"  # string that's printed when progress bar is done.
        self.pb_char = "#"  # the string used as each unit in the progress bar.
        self.hardlinks = hardlinks
        self.filename = None
        self.outstream = None

        self.start_date = start_date
        self.end_date = end_date
        self.use_rhn_date = use_rhn_date
        self.whole_errata = whole_errata

        if self.start_date:
            dates = {'start_date': self.start_date,
                     'end_date': self.end_date, }
        else:
            dates = {}

        # The queries here are a little weird. They grab just enough information
        # to satisfy the dumper objects, which will use the information to look up
        # any additional information that they need. That's why they don't seem to grab all
        # of the information that you'd think would be necessary to sync stuff.
        ####CHANNEL INFO###
        try:
            query = """
                 select ch.id channel_id, label,
                      TO_CHAR(last_modified, 'YYYYMMDDHH24MISS') last_modified
                   from rhnChannel ch
                  where ch.label = :label
                """
            self.channel_query = rhnSQL.Statement(query)
            ch_data = rhnSQL.prepare(self.channel_query)

            comps_query = """
                select relative_filename
                from rhnChannelComps
                where channel_id = :channel_id
                and comps_type_id = 1
                order by id desc
            """

            modules_query = """
                select relative_filename
                from rhnChannelComps
                where channel_id = :channel_id
                and comps_type_id = 2
                order by id desc
            """

            self.channel_comps_query = rhnSQL.Statement(comps_query)
            channel_comps_sth = rhnSQL.prepare(self.channel_comps_query)
            self.channel_modules_query = rhnSQL.Statement(modules_query)
            channel_modules_sth = rhnSQL.prepare(self.channel_modules_query)

            # self.channel_ids contains the list of dictionaries that hold the channel information
            # The keys are 'channel_id', 'label', and 'last_modified'.
            self.channel_comps = {}
            self.channel_modules = {}

            self.set_exportable_orgs(org_ids)

            # Channel_labels should be the list of channels passed into rhn-satellite-exporter by the user.
            log2stdout(1, "Gathering channel info...")
            for ids in channel_labels:
                ch_data.execute(label=ids)
                ch_info = ch_data.fetchall_dict()

                if not ch_info:
                    raise ISSError("Error: Channel %s not found." % ids, "")

                self.channel_ids = self.channel_ids + ch_info

                channel_comps_sth.execute(channel_id=ch_info[0]['channel_id'])
                comps_info = channel_comps_sth.fetchone_dict()
                channel_modules_sth.execute(channel_id=ch_info[0]['channel_id'])
                modules_info = channel_modules_sth.fetchone_dict()

                if comps_info is not None:
                    self.channel_comps[ch_info[0]['channel_id']] = comps_info['relative_filename']
                if modules_info is not None:
                    self.channel_modules[ch_info[0]['channel_id']] = modules_info['relative_filename']

            # For list of channel families, we want to also list those relevant for channels
            # that are already on disk, so that we do not lose those families with
            # "incremental" dumps. So we will gather list of channel ids for channels already
            # in dump.
            channel_labels_for_families = self.fm.filemap['channels'].list()
            print(("Appending channels %s" % (channel_labels_for_families)))
            for ids in channel_labels_for_families:
                ch_data.execute(label=ids)
                ch_info = ch_data.fetchall_dict()
                if ch_info:
                    self.channel_ids_for_families = self.channel_ids_for_families + ch_info

        except ISSError:
            # Don't want calls to sys.exit to show up as a "bad" error.
            raise
        except Exception:
            e = sys.exc_info()[1]
            tbout = cStringIO.StringIO()
            Traceback(mail=0, ostream=tbout, with_locals=1)
            raise_with_tb(ISSError("%s caught while getting channel info." %
                                   e.__class__.__name__, tbout.getvalue()), sys.exc_info()[2])

        ###BINARY RPM INFO###
        try:
            if self.whole_errata and self.start_date:
                query = """ select rcp.package_id id, rp.path path
                   from rhnChannelPackage rcp, rhnPackage rp
                        left join rhnErrataPackage rep on rp.id = rep.package_id
                        left join rhnErrata re on rep.errata_id = re.id
                  where rcp.package_id = rp.id
                    and rcp.channel_id = :channel_id
                """
            else:
                query = """
                         select rcp.package_id id, rp.path path
                           from rhnChannelPackage rcp, rhnPackage rp
                          where rcp.package_id = rp.id
                            and rcp.channel_id = :channel_id
                    """

            if self.start_date:
                if self.whole_errata:
                    if self.use_rhn_date:
                        query += """ and
                         ((re.last_modified >= TO_TIMESTAMP(:start_date, 'YYYYMMDDHH24MISS')
                             and re.last_modified <= TO_TIMESTAMP(:end_date, 'YYYYMMDDHH24MISS')
                         ) or (rep.package_id is NULL
                             and rp.last_modified >= TO_TIMESTAMP(:start_date, 'YYYYMMDDHH24MISS')
                             and rp.last_modified <= TO_TIMESTAMP(:end_date, 'YYYYMMDDHH24MISS'))
                         )
                        """
                    else:
                        query += """ and
                         ((re.modified >= TO_TIMESTAMP(:start_date, 'YYYYMMDDHH24MISS')
                         and re.modified <= TO_TIMESTAMP(:end_date, 'YYYYMMDDHH24MISS')
                         ) or (rep.package_id is NULL
                            and rcp.modified >= TO_TIMESTAMP(:start_date, 'YYYYMMDDHH24MISS')
                            and rcp.modified <= TO_TIMESTAMP(:end_date, 'YYYYMMDDHH24MISS'))
                         )
                        """
                elif self.use_rhn_date:
                    query += """
                        and rp.last_modified >= TO_TIMESTAMP(:start_date, 'YYYYMMDDHH24MISS')
                        and rp.last_modified <= TO_TIMESTAMP(:end_date, 'YYYYMMDDHH24MISS')
                        """
                else:
                    query += """
                        and rcp.modified >= TO_TIMESTAMP(:start_date, 'YYYYMMDDHH24MISS')
                        and rcp.modified <= TO_TIMESTAMP(:end_date, 'YYYYMMDDHH24MISS')
                        """
            self.brpm_query = rhnSQL.Statement(query)
            brpm_data = rhnSQL.prepare(self.brpm_query)

            # self.brpms is a list of binary rpm info. It is a list of dictionaries, where each dictionary
            # has 'id' and 'path' as the keys.
            self.brpms = []
            log2stdout(1, "Gathering binary RPM info...")
            for ch in self.channel_ids:
                brpm_data.execute(channel_id=ch['channel_id'], **dates)
                self.brpms = self.brpms + (brpm_data.fetchall_dict() or [])
        except Exception:
            e = sys.exc_info()[1]
            tbout = cStringIO.StringIO()
            Traceback(mail=0, ostream=tbout, with_locals=1)
            raise_with_tb(ISSError("%s caught while getting binary rpm info." %
                                   e.__class__.__name__, tbout.getvalue()), sys.exc_info()[2])

        ###PACKAGE INFO###
        # This will grab channel package information for a given channel.
        try:
            if self.whole_errata and self.start_date:
                query = """
                 select rp.id package_id,
                            TO_CHAR(rp.last_modified, 'YYYYMMDDHH24MISS') last_modified
                 from rhnChannelPackage rcp, rhnPackage rp
                    left join rhnErrataPackage rep on rp.id = rep.package_id
                        left join rhnErrata re on rep.errata_id = re.id
                         where rcp.channel_id = :channel_id
                            and rcp.package_id = rp.id
                    """
            else:
                query = """
                 select rp.id package_id,
                TO_CHAR(rp.last_modified, 'YYYYMMDDHH24MISS') last_modified
           from rhnPackage rp, rhnChannelPackage rcp
          where rcp.channel_id = :channel_id
            and rcp.package_id = rp.id
                """
            if self.start_date:
                if self.whole_errata:
                    if self.use_rhn_date:
                        query += """ and
                         ((re.last_modified >= TO_TIMESTAMP(:start_date, 'YYYYMMDDHH24MISS')
                         and re.last_modified <= TO_TIMESTAMP(:end_date, 'YYYYMMDDHH24MISS')
                         ) or (rep.package_id is NULL
                            and rp.last_modified >= TO_TIMESTAMP(:start_date, 'YYYYMMDDHH24MISS')
                            and rp.last_modified <= TO_TIMESTAMP(:end_date, 'YYYYMMDDHH24MISS'))
                         )
                        """
                    else:
                        query += """ and
                         ((re.modified >= TO_TIMESTAMP(:start_date, 'YYYYMMDDHH24MISS')
                         and re.modified <= TO_TIMESTAMP(:end_date, 'YYYYMMDDHH24MISS')
                         ) or (rep.package_id is NULL
                            and rcp.modified >= TO_TIMESTAMP(:start_date, 'YYYYMMDDHH24MISS')
                            and rcp.modified <= TO_TIMESTAMP(:end_date, 'YYYYMMDDHH24MISS'))
                         )
                        """
                elif self.use_rhn_date:
                    query += """
                    and rp.last_modified >= TO_TIMESTAMP(:start_date, 'YYYYMMDDHH24MISS')
                    and rp.last_modified <= TO_TIMESTAMP(:end_date, 'YYYYMMDDHH24MISS')
                    """
                else:
                    query += """
                    and (rcp.modified >= TO_TIMESTAMP(:start_date, 'YYYYMMDDHH24MISS')
                    and rcp.modified <= TO_TIMESTAMP(:end_date, 'YYYYMMDDHH24MISS'))
                    """
            self.package_query = rhnSQL.Statement(query)
            package_data = rhnSQL.prepare(self.package_query)

            # self.pkg_info will be a list of dictionaries containing channel package information.
            # The keys are 'package_id' and 'last_modified'.
            self.pkg_info = []

            # This fills in the pkg_info list with channel package information from the channels in
            # self.channel_ids.
            log2stdout(1, "Gathering package info...")
            for channel_id in self.channel_ids:
                package_data.execute(channel_id=channel_id['channel_id'], **dates)
                a_package = package_data.fetchall_dict() or []

                # Don't bother placing None into self.pkg_info.
                if a_package:
                    self.pkg_info = self.pkg_info + a_package

        except Exception:
            e = sys.exc_info()[1]
            tbout = cStringIO.StringIO()
            Traceback(mail=0, ostream=tbout, with_locals=1)
            raise_with_tb(ISSError("%s caught while getting package info." %
                                   e.__class__.__name__, tbout.getvalue()), sys.exc_info()[2])

        ###SOURCE PACKAGE INFO###
        try:
            query = """
                  select ps.id package_id,
                         TO_CHAR(ps.last_modified,'YYYYMMDDHH24MISS') last_modified,
                         ps.source_rpm_id source_rpm_id
                    from rhnPackageSource ps
                """
            if self.start_date:
                if self.whole_errata:
                    query += """
                        left join rhnErrataFilePackageSource refps on refps.package_id = ps.id
                        left join rhnErrataFile ref on refps.errata_file_id = ref.id
                        left join rhnErrata re on ref.errata_id = re.id
                    """
                    if self.use_rhn_date:
                        query += """ and
                         ((re.last_modified >= TO_TIMESTAMP(:start_date, 'YYYYMMDDHH24MISS')
                         and re.last_modified <= TO_TIMESTAMP(:end_date, 'YYYYMMDDHH24MISS')
                         ) or (refps.package_id is NULL
                            and ps.last_modified >= TO_TIMESTAMP(:start_date, 'YYYYMMDDHH24MISS')
                            and ps.last_modified <= TO_TIMESTAMP(:end_date, 'YYYYMMDDHH24MISS'))
                         )
                        """
                    else:
                        query += """ and
                         ((re.modified >= TO_TIMESTAMP(:start_date, 'YYYYMMDDHH24MISS')
                         and re.modified <= TO_TIMESTAMP(:end_date, 'YYYYMMDDHH24MISS')
                         ) or (refps.package_id is NULL
                            and ps.modified >= TO_TIMESTAMP(:start_date, 'YYYYMMDDHH24MISS')
                            and ps.modified <= TO_TIMESTAMP(:end_date, 'YYYYMMDDHH24MISS'))
                         )
                        """
                elif self.use_rhn_date:
                    query += """
                    where ps.last_modified >= TO_TIMESTAMP(:start_date, 'YYYYMMDDHH24MISS')
                     and ps.last_modified <= TO_TIMESTAMP(:end_date, 'YYYYMMDDHH24MISS')
                    """
                else:
                    query += """
                    where ps.modified >= TO_TIMESTAMP(:start_date, 'YYYYMMDDHH24MISS')
                     and ps.modified <= TO_TIMESTAMP(:end_date, 'YYYYMMDDHH24MISS')
                    """
            self.source_package_query = rhnSQL.Statement(query)
            source_package_data = rhnSQL.prepare(self.source_package_query)
            source_package_data.execute(**dates)

            # self.src_pkg_info is a list of dictionaries containing the source package information.
            # The keys for each dictionary are 'package_id', 'last_modified', and 'source_rpm_id'.
            self.src_pkg_info = source_package_data.fetchall_dict() or []

            # Again, don't bother placing None into the list.
            if not self.src_pkg_info:
                self.src_pkg_info = []

        except Exception:
            e = sys.exc_info()[1]
            tbout = cStringIO.StringIO()
            Traceback(mail=0, ostream=tbout, with_locals=1)
            raise_with_tb(ISSError("%s caught while getting source package info." %
                                   e.__class__.__name__, tbout.getvalue()), sys.exc_info()[2])

        ###ERRATA INFO###
        try:
            query = """
                   select e.id errata_id,
                          TO_CHAR(e.last_modified,'YYYYMMDDHH24MISS') last_modified,
                          e.advisory_name "advisory-name"
                     from rhnChannelErrata ce, rhnErrata e
                    where ce.channel_id = :channel_id
                      and ce.errata_id = e.id
                """
            if self.start_date:
                if self.use_rhn_date:
                    query += """
                      and e.last_modified >= TO_TIMESTAMP(:start_date, 'YYYYMMDDHH24MISS')
                      and e.last_modified <= TO_TIMESTAMP(:end_date, 'YYYYMMDDHH24MISS')
                      """
                else:
                    query += """
                      and ce.modified >= TO_TIMESTAMP(:start_date, 'YYYYMMDDHH24MISS')
                      and ce.modified <= TO_TIMESTAMP(:end_date, 'YYYYMMDDHH24MISS')
                      """
            self.errata_query = rhnSQL.Statement(query)
            errata_data = rhnSQL.prepare(self.errata_query)

            # self.errata_info will be a list of dictionaries containing errata info for the channels
            # that the user listed. The keys are 'errata_id' and 'last_modified'.
            self.errata_info = []
            log2stdout(1, "Gathering errata info...")
            for channel_id in self.channel_ids:
                errata_data.execute(channel_id=channel_id['channel_id'], **dates)
                an_errata = errata_data.fetchall_dict() or []
                if an_errata:
                    self.errata_info = self.errata_info + an_errata

        except Exception:
            e = sys.exc_info()[1]
            tbout = cStringIO.StringIO()
            Traceback(mail=0, ostream=tbout, with_locals=1)
            raise_with_tb(ISSError("%s caught while getting errata info." %
                                   e.__class__.__name__, tbout.getvalue()), sys.exc_info()[2])

        ###KICKSTART DATA/TREES INFO###
        try:
            query = """
                select  kt.id kstree_id, kt.label kickstart_label,
                        TO_CHAR(kt.last_modified, 'YYYYMMDDHH24MISS') last_modified
                  from  rhnKickstartableTree kt
                 where   kt.channel_id = :channel_id
                 """
            if self.start_date:
                if self.use_rhn_date:
                    query += """
                    and kt.last_modified >= TO_TIMESTAMP(:start_date, 'YYYYMMDDHH24MISS')
                    and kt.last_modified <= TO_TIMESTAMP(:end_date, 'YYYYMMDDHH24MISS')
                    and kt.org_id is Null
                    """
                else:
                    query += """
                    and kt.modified >= TO_TIMESTAMP(:start_date, 'YYYYMMDDHH24MISS')
                    and kt.modified <= TO_TIMESTAMP(:end_date, 'YYYYMMDDHH24MISS')
                    and kt.org_id is Null
                    """
            self.kickstart_trees_query = rhnSQL.Statement(query)
            kickstart_data = rhnSQL.prepare(self.kickstart_trees_query)
            self.kickstart_trees = []
            log2stdout(1, "Gathering kickstart data...")
            for channel_id in self.channel_ids:
                kickstart_data.execute(channel_id=channel_id['channel_id'],
                                       **dates)
                a_tree = kickstart_data.fetchall_dict() or []
                if a_tree:
                    self.kickstart_trees = self.kickstart_trees + a_tree

        except Exception:
            e = sys.exc_info()[1]
            tbout = cStringIO.StringIO()
            Traceback(mail=0, ostream=tbout, with_locals=1)
            raise_with_tb(ISSError("%s caught while getting kickstart data info." %
                                   e.__class__.__name__, tbout.getvalue()), sys.exc_info()[2])

        ###KICKSTART FILES INFO###
        try:
            query = """
                    select rktf.relative_filename "relative-path",
                           c.checksum_type "checksum-type", c.checksum,
                           rktf.file_size "file-size",
                           TO_CHAR(rktf.last_modified, 'YYYYMMDDHH24MISS') "last-modified",
                           rkt.base_path "base-path",
                           rkt.label "label",
                           TO_CHAR(rkt.modified, 'YYYYMMDDHH24MISS') "modified"
                      from rhnKSTreeFile rktf, rhnKickstartableTree rkt,
                           rhnChecksumView c
                     where rktf.kstree_id = :kstree_id
                       and rkt.id = rktf.kstree_id
                       and rktf.checksum_id = c.id
                """
            if self.start_date:
                if self.use_rhn_date:
                    query += """
                        and rkt.last_modified >= TO_TIMESTAMP(:start_date, 'YYYYMMDDHH24MISS')
                        and rkt.last_modified <= TO_TIMESTAMP(:end_date, 'YYYYMMDDHH24MISS')
                    """
                else:
                    query += """
                        and rkt.modified >= TO_TIMESTAMP(:start_date, 'YYYYMMDDHH24MISS')
                        and rkt.modified <= TO_TIMESTAMP(:end_date, 'YYYYMMDDHH24MISS')
                    """
            self.kickstart_files_query = rhnSQL.Statement(query)
            kickstart_files = rhnSQL.prepare(self.kickstart_files_query)
            self.kickstart_files = []
            log2stdout(1, "Gathering kickstart files info...")
            for kstree in self.kickstart_trees:
                kickstart_files.execute(kstree_id=kstree['kstree_id'], **dates)
                a_file = kickstart_files.fetchall_dict() or []
                if a_file:
                    self.kickstart_files = self.kickstart_files + a_file

        except Exception:
            e = sys.exc_info()[1]
            tbout = cStringIO.StringIO()
            Traceback(mail=0, ostream=tbout, with_locals=1)
            raise_with_tb(ISSError("%s caught while getting kickstart files info." %
                                   e.__class__.__name__, tbout.getvalue()), sys.exc_info()[2])

    # The close method overrides the parent classes close method. This implementation
    # closes the self.outstream, which is an addition defined in this subclass.
    # set_filename and _get_xml_writer for more info.
    def close(self):
        self.outstream.close()

    # This is an addition that allows the caller to set the filename for the output stream.
    def set_filename(self, filename):
        self.filename = filename

    # This method overrides the parent class's version of this method. This version allows the output stream to
    # be a file, which should have been set prior to this via the set_filename method.
    # TODO: Add error-checking. Either give self.outstream a sane default or have it throw an error if it hasn't
    #      been set yet.
    def _get_xml_writer(self):
        self.outstream = open(self.filename, "w")
        return xmlWriter.XMLWriter(stream=self.outstream)

    # The dump_* methods aren't really overrides because they don't preserve the method
    # signature, but they are meant as replacements for the methods defined in the base
    # class that have the same name. They will set up the file for the dump, collect info
    # necessary for the dumps to take place, and then call the base class version of the
    # method to do the actual dumping.
    def _dump_simple(self, filename, dump_func, startmsg, endmsg, exceptmsg):
        try:
            print("\n")
            log2stdout(1, startmsg)
            pb = progress_bar.ProgressBar(self.pb_label,
                                          self.pb_complete,
                                          1,
                                          self.pb_length,
                                          self.pb_char)
            pb.printAll(1)
            self.set_filename(filename)
            dump_func(self)

            pb.addTo(1)
            pb.printIncrement()
            pb.printComplete()
            log2stdout(4, endmsg % filename)

        except Exception:
            e = sys.exc_info()[1]
            tbout = cStringIO.StringIO()
            Traceback(mail=0, ostream=tbout, with_locals=1)
            raise_with_tb(ISSError(exceptmsg % e.__class__.__name__, tbout.getvalue()), sys.exc_info()[2])

    def dump_arches(self, rpm_arch_type_only=0):
        self._dump_simple(self.fm.getArchesFile(), dumper.XML_Dumper.dump_arches,
                          "Exporting arches...",
                          "Arches exported to %s",
                          "%s caught in dump_arches.")

    # This dumps arches_extra
    def dump_server_group_type_server_arches(self, rpm_arch_type_only=0, virt_filter=0):
        self._dump_simple(self.fm.getArchesExtraFile(),
                          dumper.XML_Dumper.dump_server_group_type_server_arches,
                          "Exporting arches extra...",
                          "Arches Extra exported to %s",
                          "%s caught in dump_server_group_type_server_arches.")

    def dump_blacklist_obsoletes(self):
        self._dump_simple(self.fm.getBlacklistsFile(),
                          dumper.XML_Dumper.dump_blacklist_obsoletes,
                          "Exporting blacklists...",
                          "Blacklists exported to %s",
                          "%s caught in dump_blacklist_obsoletes.")

    def dump_channel_families(self):
        self._dump_simple(self.fm.getChannelFamiliesFile(),
                          dumper.XML_Dumper.dump_channel_families,
                          "Exporting channel families...",
                          "Channel Families exported to %s",
                          "%s caught in dump_channel_families.")

    def dump_product_names(self):
        self._dump_simple(self.fm.getProductNamesFile(),
                          dumper.XML_Dumper.dump_product_names,
                          "Exporting product names...",
                          "Product names exported to %s",
                          "%s caught in dump_product_names.")

    def dump_orgs(self):
        self._dump_simple(self.fm.getOrgsFile(),
                          dumper.XML_Dumper.dump_orgs,
                          "Exporting orgs...",
                          "Orgs exported to %s",
                          "%s caught in dump_orgs.")

    def copy_repomd(self, repomds, channel, get_file_func):
        if channel['channel_id'] in repomds:
            full_filename = os.path.join(CFG.MOUNT_POINT, repomds[channel['channel_id']])
            target_filename = get_file_func(channel['label'])
            log2email(3, "Need to copy %s to %s" % (full_filename, target_filename))

            if self.hardlinks:
                os.link(full_filename, target_filename)
            else:
                shutil.copyfile(full_filename, target_filename)


    def dump_channels(self, channel_labels=None, start_date=None, end_date=None,
                      use_rhn_date=True, whole_errata=False):
        try:
            print("\n")
            log2stdout(1, "Exporting channel info...")
            pb = progress_bar.ProgressBar(self.pb_label,
                                          self.pb_complete,
                                          len(self.channel_ids),
                                          self.pb_length,
                                          self.pb_char)
            pb.printAll(1)
            for channel in self.channel_ids:
                self.set_filename(self.fm.getChannelsFile(channel['label']))
                dumper.XML_Dumper.dump_channels(self, [channel],
                                                self.start_date, self.end_date,
                                                self.use_rhn_date, self.whole_errata)

                log2email(4, "Channel: %s" % channel['label'])
                log2email(5, "Channel exported to %s" % self.fm.getChannelsFile(channel['label']))

                self.copy_repomd(self.channel_comps, channel, self.fm.getChannelCompsFile)
                self.copy_repomd(self.channel_modules, channel, self.fm.getChannelModulesFile)

                pb.addTo(1)
                pb.printIncrement()
            pb.printComplete()
            log2stderr(3, "Number of channels exported: %s" % str(len(self.channel_ids)))

        except Exception:
            e = sys.exc_info()[1]
            tbout = cStringIO.StringIO()
            Traceback(mail=0, ostream=tbout, with_locals=1)
            raise_with_tb(ISSError("%s caught in dump_channels." % e.__class__.__name__,
                                   tbout.getvalue()), sys.exc_info()[2])

    def dump_channel_packages_short(self, channel_label=None, last_modified=None, filepath=None,
                                    validate_channels=False, send_headers=False,
                                    open_stream=True):
        try:
            print("\n")
            for ch_id in self.channel_ids:
                filepath = self.fm.getChannelPackageShortFile(ch_id['channel_id'])
                self.set_filename(filepath)
                dumper.XML_Dumper.dump_channel_packages_short(self, ch_id, ch_id['last_modified'], filepath)

        except Exception:
            e = sys.exc_info()[1]
            tbout = cStringIO.StringIO()
            Traceback(mail=0, ostream=tbout, with_locals=1)
            raise_with_tb(ISSError("%s caught in dump_channel_packages_short." %
                                   e.__class__.__name__, tbout.getvalue()), sys.exc_info()[2])

    def dump_packages(self, packages=None):
        try:
            print("\n")
            log2stdout(1, "Exporting packages...")
            pb = progress_bar.ProgressBar(self.pb_label,
                                          self.pb_complete,
                                          len(self.pkg_info),
                                          self.pb_length,
                                          self.pb_char)
            pb.printAll(1)
            for pkg_info in self.pkg_info:
                package_name = "rhn-package-" + str(pkg_info['package_id'])
                self.set_filename(self.fm.getPackagesFile(package_name))
                dumper.XML_Dumper.dump_packages(self, [pkg_info])

                log2email(4, "Package: %s" % package_name)
                log2email(5, "Package exported to %s" % self.fm.getPackagesFile(package_name))

                pb.addTo(1)
                pb.printIncrement()
            pb.printComplete()
            log2stdout(3, "Number of packages exported: %s" % str(len(self.pkg_info)))

        except Exception:
            e = sys.exc_info()[1]
            tbout = cStringIO.StringIO()
            Traceback(mail=0, ostream=tbout, with_locals=1)
            raise_with_tb(ISSError("%s caught in dump_packages." % e.__class__.__name__,
                                   tbout.getvalue()), sys.exc_info()[2])

    def dump_packages_short(self, packages=None):
        try:
            print("\n")
            log2stdout(1, "Exporting short packages...")
            pb = progress_bar.ProgressBar(self.pb_label,
                                          self.pb_complete,
                                          len(self.pkg_info),
                                          self.pb_length,
                                          self.pb_char)
            pb.printAll(1)
            for pkg_info in self.pkg_info:
                package_name = "rhn-package-" + str(pkg_info['package_id'])
                self.set_filename(self.fm.getShortPackagesFile(package_name))
                dumper.XML_Dumper.dump_packages_short(self, [pkg_info])

                log2email(4, "Short Package: %s" % package_name)
                log2email(5, "Short Package exported to %s" % package_name)
                pb.addTo(1)
                pb.printIncrement()
            pb.printComplete()
            log2stdout(3, "Number of short packages exported: %s" % str(len(self.pkg_info)))

        except Exception:
            e = sys.exc_info()[1]
            tbout = cStringIO.StringIO()
            Traceback(mail=0, ostream=tbout, with_locals=1)
            raise_with_tb(ISSError("%s caught in dump_packages_short." %
                                   e.__class__.__name__, tbout.getvalue()), sys.exc_info()[2])

    def dump_source_packages(self, packages=None):
        try:
            print("\n")
            for pkg_info in self.src_pkg_info:
                self.set_filename(self.fm.getSourcePackagesFile("rhn-source-package-" + str(pkg_info['package_id'])))
                dumper.XML_Dumper.dump_source_packages(self, [pkg_info])

        except Exception:
            e = sys.exc_info()[1]
            tbout = cStringIO.StringIO()
            Traceback(mail=0, ostream=tbout, with_locals=1)
            raise_with_tb(ISSError("%s caught in dump_source_packages." %
                                   e.__class__.__name__, tbout.getvalue()), sys.exc_info()[2])

    def dump_errata(self, errata=None, verify_errata=False):
        try:
            print("\n")
            log2stdout(1, "Exporting errata...")
            pb = progress_bar.ProgressBar(self.pb_label,
                                          self.pb_complete,
                                          len(self.errata_info),
                                          self.pb_length,
                                          self.pb_char)
            pb.printAll(1)
            for errata_info in self.errata_info:
                erratum_name = "rhn-erratum-" + str(errata_info['errata_id'])
                self.set_filename(self.fm.getErrataFile(erratum_name))
                dumper.XML_Dumper.dump_errata(self, [errata_info])

                log2email(4, "Erratum: %s" % str(errata_info['advisory-name']))
                log2email(5, "Erratum exported to %s" % self.fm.getErrataFile(erratum_name))

                pb.addTo(1)
                pb.printIncrement()
            pb.printComplete()
            log2stdout(3, "Number of errata exported: %s" % str(len(self.errata_info)))

        except Exception:
            e = sys.exc_info()[1]
            tbout = cStringIO.StringIO()
            Traceback(mail=0, ostream=tbout, with_locals=1)
            raise_with_tb(ISSError("%s caught in dump_errata." % e.__class__.__name__,
                                   tbout.getvalue()), sys.exc_info()[2])

    def dump_kickstart_data(self):
        try:
            print("\n")
            log2stdout(1, "Exporting kickstart data...")
            pb = progress_bar.ProgressBar(self.pb_label,
                                          self.pb_complete,
                                          len(self.kickstart_trees),
                                          self.pb_length,
                                          self.pb_char)
            pb.printAll(1)
            for kickstart_tree in self.kickstart_trees:
                self.set_filename(self.fm.getKickstartTreeFile(kickstart_tree['kickstart_label']))  # , 'foo/bar'))
                dumper.XML_Dumper.dump_kickstartable_trees(self, [kickstart_tree])

                log2email(5, "KS Data: %s" % str(kickstart_tree['kickstart_label']))

                pb.addTo(1)
                pb.printIncrement()
            pb.printComplete()
            log2stdout(3, "Amount of kickstart data exported: %s" % str(len(self.kickstart_trees)))

        except Exception:
            e = sys.exc_info()[1]
            tbout = cStringIO.StringIO()
            Traceback(mail=0, ostream=tbout, with_locals=1)
            raise_with_tb(ISSError("%s caught in dump_kickstart_data." %
                                   e.__class__.__name__, tbout.getvalue()), sys.exc_info()[2])

    def dump_kickstart_files(self):
        try:
            print("\n")
            log2stdout(1, "Exporting kickstart files...")
            pb = progress_bar.ProgressBar(self.pb_label,
                                          self.pb_complete,
                                          len(self.kickstart_files),
                                          self.pb_length,
                                          self.pb_char)
            pb.printAll(1)
            for kickstart_file in self.kickstart_files:
                # get the path to the kickstart files under the satellite's mount point
                path_to_files = os.path.join(CFG.MOUNT_POINT,
                                             kickstart_file['base-path'],
                                             kickstart_file['relative-path'])

                # Make sure the path actually exists
                if not os.path.exists(path_to_files):
                    raise ISSError("Missing kickstart file under mount-point: %s" % (path_to_files,), "")

                # generate the path to the kickstart files under the export directory.
                path_to_export_file = self.fm.getKickstartFileFile(
                    kickstart_file['label'],
                    kickstart_file['relative-path'])
                #os.path.join(self.mp, kickstart_file['base-path'], kickstart_file['relative-path'])
                if os.path.exists(path_to_export_file):
                    # already exists, skip ks file
                    continue
                # Get the dirs to the file under the export directory.
                dirs_to_file = os.path.split(path_to_export_file)[0]

                # create the directory to the kickstart files under the export directory, if necessary.
                if not os.path.exists(dirs_to_file):
                    os.makedirs(dirs_to_file)
                try:
                    if self.hardlinks:
                        # Make hardlinks
                        try:
                            os.link(path_to_files, path_to_export_file)
                        except OSError:
                            pass
                    else:
                        # Copy file from satellite to export dir.
                        shutil.copyfile(path_to_files, path_to_export_file)
                except IOError:
                    e = sys.exc_info()[1]
                    tbout = cStringIO.StringIO()
                    Traceback(mail=0, ostream=tbout, with_locals=1)
                    raise_with_tb(ISSError("Error: Error copying file: %s: %s" %
                                           (path_to_files, e.__class__.__name__), tbout.getvalue()), sys.exc_info()[2])

                log2email(5, "Kickstart File: %s" %
                          os.path.join(kickstart_file['base-path'],
                                       kickstart_file['relative-path']))

                pb.addTo(1)
                pb.printIncrement()

            pb.printComplete()
            log2stdout(3, "Number of kickstart files exported: %s" % str(len(self.kickstart_files)))
        except ISSError:
            raise
        except Exception:
            e = sys.exc_info()[1]
            tbout = cStringIO.StringIO()
            Traceback(mail=0, ostream=tbout, with_locals=1)
            raise_with_tb(ISSError("%s caught in dump_kickstart_files." %
                                   e.__class__.__name__, tbout.getvalue()), sys.exc_info()[2])

    # RPM and SRPM dumping code
    def dump_rpms(self):
        try:
            print("\n")
            log2stdout(1, "Exporting binary RPMs...")
            pb = progress_bar.ProgressBar(self.pb_label,
                                          self.pb_complete,
                                          len(self.brpms),
                                          self.pb_length,
                                          self.pb_char)
            pb.printAll(1)
            for rpm in self.brpms:
                # generate path to the rpms under the mount point
                path_to_rpm = diskImportLib.rpmsPath("rhn-package-%s" % str(rpm['id']), self.mp)

                # get the dirs to the rpm
                dirs_to_rpm = os.path.split(path_to_rpm)[0]

                if (not rpm['path']):
                    raise ISSError("Error: Missing RPM under the satellite mount point. (Package id: %s)" %
                                   rpm['id'], "")
                # get the path to the rpm from under the satellite's mountpoint
                satellite_path = os.path.join(CFG.MOUNT_POINT, rpm['path'])

                if not os.path.exists(satellite_path):
                    raise ISSError("Error: Missing RPM under mount point: %s" % (satellite_path,), "")

                # create the directory for the rpm, if necessary.
                if not os.path.exists(dirs_to_rpm):
                    os.makedirs(dirs_to_rpm)

                # check if the path to rpm hardlink already exists
                if os.path.exists(path_to_rpm):
                    continue

                try:
                    # copy the file to the path under the mountpoint.
                    if self.hardlinks:
                        os.link(satellite_path, path_to_rpm)
                    else:
                        shutil.copyfile(satellite_path, path_to_rpm)
                except IOError:
                    e = sys.exc_info()[1]
                    tbout = cStringIO.StringIO()
                    Traceback(mail=0, ostream=tbout, with_locals=1)
                    raise_with_tb(ISSError("Error: Error copying file %s: %s" %
                                           (os.path.join(CFG.MOUNT_POINT, rpm['path']), e.__class__.__name__),
                                           tbout.getvalue()), sys.exc_info()[2])
                except OSError:
                    e = sys.exc_info()[1]
                    tbout = cStringIO.StringIO()
                    Traceback(mail=0, ostream=tbout, with_locals=1)
                    raise_with_tb(ISSError("Error: Could not make hard link %s: %s (different filesystems?)" %
                                           (os.path.join(CFG.MOUNT_POINT, rpm['path']), e.__class__.__name__),
                                           tbout.getvalue()), sys.exc_info()[2])

                log2email(5, "RPM: %s" % rpm['path'])

                pb.addTo(1)
                pb.printIncrement()
            pb.printComplete()
            log2stdout(3, "Number of RPMs exported: %s" % str(len(self.brpms)))
        except ISSError:
            raise

        except Exception:
            e = sys.exc_info()[1]
            tbout = cStringIO.StringIO()
            Traceback(mail=0, ostream=tbout, with_locals=1)
            raise_with_tb(ISSError("%s caught in dump_rpms." % e.__class__.__name__,
                                   tbout.getvalue()), sys.exc_info()[2])

    def dump_support_information(self):
        self._dump_simple(self.fm.getSupportInformationFile(),
                          dumper.XML_Dumper.dump_support_information,
                          "Exporting Support Information...",
                          "Support Information exported to %s",
                          "%s caught in dump_support_information.")

    def dump_suse_products(self):
        self._dump_simple(self.fm.getSuseProductsFile(),
                          dumper.XML_Dumper.dump_suse_products,
                          "Exporting SUSE Product Information...",
                          "SUSE Product Information exported to %s",
                          "%s caught in dump_suse_products.")

    def dump_suse_product_channels(self):
        self._dump_simple(self.fm.getSuseProductChannelsFile(),
                          dumper.XML_Dumper.dump_suse_product_channels,
                          "Exporting SUSE Product Channel Information...",
                          "SUSE Product Channel Information exported to %s",
                          "%s caught in dump_suse_product_channels.")

    def dump_suse_upgrade_paths(self):
        self._dump_simple(self.fm.getSuseUpgradePathsFile(),
                          dumper.XML_Dumper.dump_suse_upgrade_paths,
                          "Exporting Upgrade Path Information...",
                          "Upgrade Path Information exported to %s",
                          "%s caught in dump_suse_upgrade_paths.")

    def dump_suse_product_extensions(self):
        self._dump_simple(self.fm.getSuseProductExtensionsFile(),
                          dumper.XML_Dumper.dump_suse_product_extensions,
                          "Exporting SUSE Product Extension Information...",
                          "SUSE Product Extension Information exported to %s",
                          "%s caught in dump_suse_product_extensions.")

    def dump_suse_product_repositories(self):
        self._dump_simple(self.fm.getSuseProductRepositoriesFile(),
                          dumper.XML_Dumper.dump_suse_product_repositories,
                          "Exporting SUSE Product Repository Information...",
                          "SUSE Product Repository Information exported to %s",
                          "%s caught in dump_suse_product_repositories.")

    def dump_scc_repositories(self):
        self._dump_simple(self.fm.getSCCRepositoriesFile(),
                          dumper.XML_Dumper.dump_scc_repositories,
                          "Exporting Repository Information...",
                          "Repository Information exported to %s",
                          "%s caught in dump_scc_repositories.")

    def dump_suse_subscriptions(self):
        self._dump_simple(self.fm.getSuseSubscriptionsFile(),
                          dumper.XML_Dumper.dump_suse_subscriptions,
                          "Exporting Subscription Information...",
                          "Subscription Information exported to %s",
                          "%s caught in dump_suse_subscriptions.")

    def dump_cloned_channels(self):
        self._dump_simple(self.fm.getClonedChannelsFile(),
                          dumper.XML_Dumper.dump_cloned_channels,
                          "Exporting Channel Clone Information...",
                          "Channel clone information exported to %s",
                          "%s caught in dump_cloned_channels.")

def get_report():
    body = dumpEMAIL_LOG()
    return body


def print_report():
    print("")
    print("REPORT:")
    report_string = get_report()
    sys.stdout.write(str(report_string))


# Stolen and modified from satsync.py
def sendMail():
    # Send email summary
    body = dumpEMAIL_LOG()
    if body:
        print("+++ sending log as an email +++")
        headers = {
            'Subject' : 'SUSE Manager Export report from %s' % os.uname()[1],
        }
        #sndr = CFG.get('traceback_mail', 'rhn-satellite')
        sndr = 'suse-manager@%s' % os.uname()[1]
        rhnMail.send(headers, body, sender=sndr)
    else:
        print("+++ email requested, but there is nothing to send +++")


def handle_error(message, traceback):
    log2stderr(-1, "\n" + message)
    log2email(-1, traceback)


# This class is a mess.
class ExporterMain:

    def __init__(self):
        initCFG('server.iss')

        # pylint: disable=E1101
        self.options = UI()
        self.action_deps = ActionDeps(self.options)
        self.action_order, self.actions = self.action_deps.get_actions()
        if self.options.debug_level:
            debug_level = int(self.options.debug_level)
        else:
            debug_level = int(CFG.DEBUG)

        CFG.set("TRACEBACK_MAIL", self.options.traceback_mail or CFG.TRACEBACK_MAIL)
        CFG.set("DEBUG", debug_level)
        CFG.set("ISSEMAIL", self.options.email)

        initEMAIL_LOG()

        # This was taken straight from satsync.py.
        try:
            rhnSQL.initDB()
        except SQLConnectError:
            print('SQLERROR: There was an error connecting to the Database.')
            sys.exit(-1)
        except (SQLError, SQLSchemaError):
            e = sys.exc_info()[1]
            # An SQL error is fatal... crash and burn
            exitWithTraceback(e, 'SQL ERROR during xml processing', -1)

        # This was cribbed from satsync.py.
        if self.options.print_configuration:
            CFG.show()
            sys.exit(0)

        if self.options.list_channels:
            self.print_list_channels(self.list_channels())
            sys.exit(0)

        if self.options.list_orgs:
            self.print_orgs(self.list_orgs())
            sys.exit(0)

        # From this point on everything should assume a list of channels, so it needs to be a list
        # even if there's only one entry.
        if self.options.all_channels:
            channel_dict = self.list_channels()
            self.options.channel = []
            for pc in channel_dict:
                self.options.channel.append(pc)
                self.options.channel.extend(channel_dict[pc])
        elif self.options.channel:
            if not isinstance(self.options.channel, type([])):
                self.options.channel = [self.options.channel]
        else:
            sys.stdout.write("--channel not included!\n")
            sys.exit(0)

        # Same as above but for orgs
        if self.options.all_orgs:
            orgs = self.list_orgs()
            self.options.org = []
            for org in orgs:
                self.options.org.append(org['id'])
        elif self.options.org:
            if not type(self.options.org, type([])):
                self.options.org = [self.options.org]
            orgs = {}
            for org in self.list_orgs():
                orgs[org['name']] = str(org['id'])
            using_orgs = []
            for org in self.options.org:
                # User might have specified org name or org id, try both
                if org in list(orgs.values()):  # ids
                    using_orgs.append(org)
                elif org in list(orgs.keys()):  # names
                    using_orgs.append(orgs[org])
                else:
                    sys.stdout.write("Org not found: %s\n" % org)
                    exit(0)
            self.options.org = using_orgs
        else:
            self.options.org = []
        self.options.org = [str(x) for x in self.options.org]

        # Since everything gets dumped to a directory it wouldn't make
        # much sense if it wasn't required.
        if self.options.dir:
            self.isos_dir = os.path.join(self.options.dir, "satellite-isos")
            self.outputdir = self.options.dir
        else:
            sys.stdout.write("--dir not included!\n")
            sys.exit(0)

        if self.options.use_sync_date and self.options.use_rhn_date:
            sys.stderr.write("--use-rhn-date and --use-sync-date are mutually exclusive.\n")
            sys.exit(1)
        elif self.options.use_sync_date:
            self.options.use_rhn_date = False
        else:
            self.options.use_rhn_date = True

        if self.options.end_date and not self.options.start_date:
            sys.stderr.write("--end-date must be used with --start-date.\n")
            sys.exit(1)

        if self.options.end_date and len(self.options.end_date) < 8:
            sys.stdout.write(_("format of %s should be at least YYYYMMDD.\n") % '--end-date')
            sys.exit(1)

        if self.options.start_date and len(self.options.start_date) < 8:
            sys.stdout.write(_("format of %s should be at least YYYYMMDD.\n") % '--start-date')
            sys.exit(1)

        if self.options.start_date:
            if self.options.end_date is None:
                self.end_date = time.strftime("%Y%m%d%H%M%S")
            else:
                self.end_date = self.options.end_date.ljust(14, '0')

            self.start_date = self.options.start_date.ljust(14, '0')
            print(("start date limit: %s" % self.start_date))
            print(("end date limit: %s" % self.end_date))
        else:
            self.start_date = None
            self.end_date = None

        if self.start_date and self.options.whole_errata:
            self.whole_errata = self.options.whole_errata

        # verify mountpoint
        if os.access(self.outputdir, os.F_OK | os.R_OK | os.W_OK):
            if os.path.isdir(self.outputdir):
                self.dumper = Dumper(self.outputdir,
                                     self.options.channel,
                                     self.options.org,
                                     self.options.hard_links,
                                     start_date=self.start_date,
                                     end_date=self.end_date,
                                     use_rhn_date=self.options.use_rhn_date,
                                     whole_errata=self.options.whole_errata)
                self.actionmap = {
                    'arches':   {'dump': self.dumper.dump_arches},
                    'arches-extra':   {'dump': self.dumper.dump_server_group_type_server_arches},
                    'blacklists':   {'dump': self.dumper.dump_blacklist_obsoletes},
                    'channel-families':   {'dump': self.dumper.dump_channel_families},
                    'channels':   {'dump': self.dumper.dump_channels},
                    'packages':   {'dump': self.dumper.dump_packages},
                    'short':   {'dump': self.dumper.dump_packages_short},
                    #'channel-pkg-short' :   {'dump': self.dumper.dump_channel_packages_short},
                    #'source-packages'   :   {'dump': self.dumper.dump_source_packages},
                    'errata':   {'dump': self.dumper.dump_errata},
                    'kickstarts':   {'dump': [self.dumper.dump_kickstart_data,
                                              self.dumper.dump_kickstart_files]},
                    'rpms':   {'dump': self.dumper.dump_rpms},
                    'orgs':   {'dump': self.dumper.dump_orgs},
                    'productnames': {'dump': self.dumper.dump_product_names},
                    'supportinfo':   {'dump': self.dumper.dump_support_information},
                    'suse-products':   {'dump': self.dumper.dump_suse_products},
                    'suse-product-channels':   {'dump': self.dumper.dump_suse_product_channels},
                    'suse-upgrade-paths':   {'dump': self.dumper.dump_suse_upgrade_paths},
                    'suse-product-extensions':   {'dump': self.dumper.dump_suse_product_extensions},
                    'suse-product-repositories':   {'dump': self.dumper.dump_suse_product_repositories},
                    'scc-repositories':   {'dump': self.dumper.dump_scc_repositories},
                    'suse-subscriptions':   {'dump': self.dumper.dump_suse_subscriptions},
                    'cloned-channels':   {'dump': self.dumper.dump_cloned_channels},
                }
            else:
                print("The output directory is not a directory")
                sys.exit(-1)
        else:
            print("can't access output directory")
            sys.exit(-1)

    @staticmethod
    def list_channels():
        """ return all available channels

            the returned format is dictionary containing base_label as keys and value is list
            of labels of child channels
        """
        # The keys for channel_dict are the labels of the base channels.
        # The values associated with each key is a list of the labels of
        # the child channels whose parent channel is the key.
        channel_dict = {}

        # Grab some info on base channels. Base channels
        # have parent_channel set to null.
        base_channel_query = rhnSQL.Statement("""
            select  id, label
            from    rhnChannel
            where   parent_channel is null
        """)
        base_channel_data = rhnSQL.prepare(base_channel_query)
        base_channel_data.execute()
        base_channels = base_channel_data.fetchall_dict()

        # Grab some info on child channels.
        child_channel_query = rhnSQL.Statement("""
            select  id, label, parent_channel
            from    rhnChannel
            where   parent_channel = :id
        """)
        child_channel_data = rhnSQL.prepare(child_channel_query)

        if base_channels:
            for ch in base_channels:
                base_label = ch['label']
                base_id = ch['id']

                # If the base channel isn't in channel_dict yet, create
                # an empty list for it.
                if not base_label in channel_dict:
                    channel_dict[base_label] = []

                # grab the child channel information for this base channel.
                child_channel_data.execute(id=base_id)
                child_channels = child_channel_data.fetchall_dict()

                # If the base channel has some child channels, add them
                # to the list associated with the base channel in channel_dict.
                # Organizing the labels this way makes it a lot easier to print
                # out.
                if child_channels:
                    for child in child_channels:
                        child_label = child['label']
                        channel_dict[base_label].append(child_label)
        return channel_dict

    @staticmethod
    def print_list_channels(channel_dict):
        """ channel_dict is dictionary containing base_label as keys and value is list
            of labels of child channels
        """
        if channel_dict:
            # Print the legend.
            print("Channel List:")
            print("B = Base Channel")
            print("C = Child Channel")
            print("")

            base_template = "B %s"
            child_template = "C\t%s"

            # Print channel information.
            for pc in list(channel_dict.keys()):
                print((base_template % (pc,)))
                for cc in channel_dict[pc]:
                    print((child_template % (cc,)))
                print(" ")
        else:
            print("No Channels available for listing.")

    @staticmethod
    def list_orgs():
        """
        Return a list of all orgs.
        """
        org_query = rhnSQL.Statement("""
            select  id, name
            from    web_customer
        """)
        org_data = rhnSQL.prepare(org_query)
        org_data.execute()
        return org_data.fetchall_dict()

    @staticmethod
    def print_orgs(orgs):
        if orgs:
            print("Orgs available for export:")
            for org in orgs:
                print(("Id: %s, Name: \'%s\'" % (org['id'], org['name'])))
        else:
            print("No Orgs available for listing.")

    def main(self):
        # pylint: disable=E1101
        try:
            for action in self.action_order:
                if self.actions[action] != 1:
                    continue

                if not action in self.actionmap:
                    # If we get here there's a programming error. It means that self.action_order
                    # contains a action that isn't defined in self.actionmap.
                    sys.stderr.write("List of actions doesn't have %s.\n" % (action,))
                    continue

                if isinstance(self.actionmap[action]['dump'], type([])):
                    for dmp in self.actionmap[action]['dump']:
                        dmp()
                else:
                    self.actionmap[action]['dump']()

                # Now Compress the dump data
                if action == 'rpms':
                    continue
                elif action == 'arches-extra':
                    action = 'arches'
                elif action == 'short':
                    action = 'packages_short'
                elif action == 'channel-families':
                    action = 'channel_families'
                elif action == 'kickstarts':
                    action = 'kickstart_trees'
                elif action == 'productnames':
                    action = 'product_names'

                os_data_dir = os.path.join(self.outputdir, action)
                if not os.path.exists(os_data_dir):
                    continue

                for fpath, _dirs, files in os.walk(os_data_dir):
                    for f in files:
                        if f.endswith(".xml") or f.endswith(".yaml"):
                            filepath = os.path.join(fpath, f)
                            compress_file(filepath)

            if self.options.make_isos:
                #iso_output = os.path.join(self.isos_dir, self.dump_dir)
                iso_output = self.isos_dir
                if not os.path.exists(iso_output):
                    os.makedirs(iso_output)

                iss_isos.create_isos(self.outputdir, iso_output,
                                     "rhn-export", self.start_date, self.end_date,
                                     iso_type=self.options.make_isos)

                # Generate md5sum digest file for isos
                if os.path.exists(iso_output):
                    f = open(os.path.join(iso_output, 'MD5SUM'), 'w')
                    for iso_file in os.listdir(iso_output):
                        if self.options.make_isos != "dvds" and iso_file != "MD5SUM":
                            md5_val = getFileChecksum('md5', (os.path.join(iso_output, iso_file)))
                            md5str = "%s  %s\n" % (md5_val, iso_file)
                            f.write(md5str)
                    f.close()

            if self.options.email:
                sendMail()

            if self.options.print_report:
                print_report()

        except SystemExit:
            sys.exit(0)

        except ISSError:
            isserror = sys.exc_info()[1]
            # I have the tb get generated in the functions that the the error occurred in to minimize
            # the amount of extra crap that shows up in it.
            tb = isserror.tb
            msg = isserror.msg
            handle_error(msg, tb)

            if self.options.email:
                sendMail()
            if self.options.print_report:
                print_report()

            sys.exit(-1)

        except Exception:  # pylint: disable=E0012, W0703
            e = sys.exc_info()[1]
            # This should catch the vast majority of errors that aren't ISSErrors
            tbout = cStringIO.StringIO()
            Traceback(mail=0, ostream=tbout, with_locals=1)
            msg = "Error: %s caught!" % e.__class__.__name__
            handle_error(msg, tbout.getvalue())
            if self.options.email:
                sendMail()
            if self.options.print_report:
                print_report()
            sys.exit(-1)


def compress_file(f):
    """
    Gzip the given file and then remove the file.
    """
    datafile = open(f, 'rb')
    gzipper = gzip.GzipFile(f + '.gz', 'w', 9)
    gzipper.write(datafile.read())
    gzipper.flush()
    # close opened streams
    gzipper.close()
    datafile.close()
    # removed the old file
    os.unlink(f)

if __name__ == "__main__":
    em = ExporterMain()
    em.main()
 070701000000C7000081B40000000000000000000000015FBBE8EE00001595000000000000000000000000000000000000003D00000000spacewalk-backend/satellite_tools/disk_dumper/iss_actions.py  #
# Copyright (c) 2008--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import sys

from . import iss_ui


class ActionDeps:

    def __init__(self, options):
        # self.step_precedence contains the dependencies among the export steps.
        self.step_precedence = {
            'orgs': [''],
            'packages': [''],
            'source-packages': [''],
            'errata': [''],
            'kickstarts': [''],
            'rpms': [''],
            #            'srpms'                     : ['channels'],
            'channels': ['channel-families'],
            'channel-families': ['blacklists'],
            'blacklists': ['arches'],
            'short': ['channels'],
            'arches': ['arches-extra'],
            'arches-extra': [''],
            'productnames': [''],
            'supportinfo': [''],
            'suse-products': [''],
            'suse-product-channels': ['suse-products', 'channels'],
            'suse-upgrade-paths': ['suse-products'],
            'suse-product-extensions': ['suse-products'],
            'scc-repositories': [''],
            'suse-product-repositories': ['suse-products', 'scc-repositories'],
            'suse-subscriptions': ['channel-families'],
            'cloned-channels': ['channels'],
        }

        # self.step_hierarchy lists the export steps in the order they need to be run.
        self.step_hierarchy = [
            'orgs',
            'channel-families',
            'arches',
            'arches-extra',
            'productnames',
            'channels',
            'blacklists',
            'short',
            'cloned-channels',
            'rpms',
            'packages',
            'errata',
            'kickstarts',
            'supportinfo',
            'suse-products',
            'scc-repositories',
            'suse-product-channels',
            'suse-upgrade-paths',
            'suse-product-extensions',
            'suse-product-repositories',
            'suse-subscriptions',
        ]
        self.options = options
        self.action_dict = {'blacklists': 0}

    def list_steps(self):
        print("LIST OF STEPS:")
        for step in self.step_hierarchy:
            print(step)
        sys.exit(0)

    # Contains the logic for the --step option
    def handle_step_option(self):
        # If the user didn't use --step, set the last step to the end of self.step_hierarchy.
        if not self.options.step:
            self.options.step = self.step_hierarchy[-1]

        # Make sure that the step entered by the user is actually a step.
        if self.options.step not in self.step_hierarchy:
            sys.stderr.write("Error: '%s' is not a valid step.\n" % self.options.step)
            sys.exit(-1)

        # Turn on all of the steps up to the option set as self.options.step.
        for step in self.step_hierarchy:
            self.action_dict[step] = 1
            if step == self.options.step:
                break

        # This will set the rest of the steps to 0.
        for step in self.step_hierarchy:
            self.action_dict[step] = step in self.action_dict

    # Handles the logic for the --no-rpms, --no-packages, --no-errata, --no-kickstarts, and --list-channels.
    def handle_options(self):

        if self.options.list_steps:
            self.list_steps()

        if self.options.no_rpms:
            self.action_dict['rpms'] = 0

        if self.options.no_packages:
            self.action_dict['packages'] = 0

        if self.options.no_errata:
            self.action_dict['errata'] = 0

        if self.options.no_kickstarts:
            self.action_dict['kickstarts'] = 0

        if not self.options.all_orgs and not self.options.org:
            self.action_dict['orgs'] = 0

        if self.options.list_channels:
            self.action_dict['channels'] = 1
            self.action_dict['blacklists'] = 0
            self.action_dict['arches'] = 0
            self.action_dict['channel-families'] = 1

    # This method uses self.step_precendence to figure out if a step needs to be turned off.
    def turn_off_dep_steps(self, step):
        for dependent in self.step_precedence[step]:
            if dependent in self.action_dict:
                self.action_dict[dependent] = 0

    # This method will call turn_off_dep_steps if the step is off or not present in self.action_dict.
    def handle_step_dependents(self):
        for step in self.step_hierarchy:
            if step in self.action_dict:
                if self.action_dict[step] == 0:
                    self.turn_off_dep_steps(step)
            else:
                self.turn_off_dep_steps(step)

    # This will return the step_hierarchy and the action_dict.
    def get_actions(self):
        self.handle_step_option()
        self.handle_options()
        self.handle_step_dependents()
        return self.step_hierarchy, self.action_dict

if __name__ == "__main__":
    a = iss_ui.UI()
    b = ActionDeps(a)
    print((b.get_actions()))
   070701000000C8000081B40000000000000000000000015FBBE8EE00000473000000000000000000000000000000000000003A00000000spacewalk-backend/satellite_tools/disk_dumper/iss_isos.py #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

from spacewalk.satellite_tools import geniso


def create_isos(mountpoint, outdir, prefix, lower_limit=None, upper_limit=None, copy_iso_dir=None, iso_type=None):
    opts = ["--mountpoint=%s" % mountpoint,
            "--file-prefix=%s" % prefix,
            "--output=%s" % outdir,
            "--type=%s" % iso_type]

    if lower_limit is not None:
        opts.append("-v%s-%s" % (lower_limit, upper_limit))

    if copy_iso_dir is not None:
        opts.append("--copy-iso-dir=%s" % copy_iso_dir)

    geniso.main(opts)
 070701000000C9000081B40000000000000000000000015FBBE8EE0000159B000000000000000000000000000000000000003800000000spacewalk-backend/satellite_tools/disk_dumper/iss_ui.py   #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

from optparse import OptionParser, Option
from spacewalk.common.rhnConfig import PRODUCT_NAME

# Not strictly necessary, but makes them easier to type
option_parser = OptionParser
option = Option

# pylint: disable=R0903


class UI:

    def __init__(self):
        self.optiontable = [
            option("-d",    "--dir",                    action="store",
                   help="This is the directory that the information that you want to sync gets dumped in."),
            option("--hard-links",             action="store_true",        default=0,
                   help="Exported RPM and kickstart are hard linked to original files."),
            option("--list-channels",          action="store_true",    default=0,
                   help="List all of the channels that can be exported."),
            option("--list-steps",             action="store_true",    default=0,
                   help="List all of the steps that rhn-satellite-exporter takes while exporting data."
                   + " These can be used as values for --step"),
            option("-c",    "--channel",                action="append",
                   help="Include this channel in the export."),
            option("-a",    "--all-channels",            action="store_true",    default=0,
                   help="Export all channels."),
            option("--start-date",             action="store",
                   help="The start date limit that the last modified dates are compared against. "
                   + "Should be in the format 'YYYYMMDDHH24MISS'."),
            option("--end-date",                action="store",
                   help="The end date limit that the last modified dates are compared against. "
                   + "Should be in the format 'YYYYMMDDHH24MISS'."),
            option("--use-rhn-date",            action="store_true",
                   help="Limit exported packages according to the date when they appeared at Red Hat Network."),
            option("--use-sync-date",            action="store_true",
                   help="Limit exported packages according to the date they where pulled into %s." % PRODUCT_NAME),
            option("--whole-errata",            action="store_true",
                   help="Always include package if it belongs to errata which is withing start/end-date range."),
            option("--make-isos",               action="store",
                   help="Create channel dump isos a directory called satellite-isos. Usage: --make-isos=cd or dvd"),
            option("-p",    "--print-configuration",    action="store_true",    default=0,
                   help="Print the configuration and exit."),
            option("--print-report",           action="store_true",    default=0,
                   help="Print the report to the terminal when the export is complete."),
            option("--step",                   action="store",
                   help="Export only up to this step."),
            option("--no-rpms",                action="store_true",
                   help="Do not export RPMs."),
            option("--no-packages",            action="store_true",
                   help="Do not export package metadata."),
            option("--no-errata",              action="store_true",
                   help="Do not export errata data."),
            option("--no-kickstarts",          action="store_true",
                   help="Do not export kickstart data."),
            option("--debug-level",            action="store",
                   help="Set the debug level to this value. Overrides the value in rhn.conf."),
            option("-v",   "--verbose",                action="store_true",
                   help="Set debug level to 3. Overrides the value in rhn.conf.."),
            option("--email",                  action="store_true",
                   help="Email a report of what was exported."),
            option("--traceback-mail",        action="store",
                   help="Alternative email address for --email."),
            option("--all-orgs",        action="store_true",
                   help="Export all orgs."),
            option("-o",         "--org",        action="append",
                   help="Include the org with this id in the export."),
            option("--list-orgs",        action="store_true",
                   help="List all orgs that can be exported"),
        ]
        self.optionparser = option_parser(option_list=self.optiontable)
        self.options, self.args = self.optionparser.parse_args()
        if self.options.verbose and not self.options.debug_level:
            self.options.debug_level = 3

        for i in list(self.options.__dict__.keys()):
            if i not in self.__dict__:
                self.__dict__[i] = self.options.__dict__[i]

if __name__ == "__main__":
    # pylint: disable=E1101
    a = UI()
    print((str(a.no_errata)))
 070701000000CA000081FD0000000000000000000000015FBBE8EE00000A8E000000000000000000000000000000000000004500000000spacewalk-backend/satellite_tools/disk_dumper/rhn-satellite-exporter  #!/usr/bin/python
#
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

try:
    #  python 2
    import cStringIO
except ImportError:
    #  python3
    import io as cStringIO

import sys
import os

# quick check to see if you are a super-user.
if os.getuid() != 0:
    sys.stderr.write('ERROR: must be root to execute\n')
    sys.exit(8)

from spacewalk.satellite_tools.disk_dumper import iss
from spacewalk.satellite_tools.syncLib import log2stderr, log2email
from spacewalk.common.rhnTB import Traceback

if os.geteuid() != 0:
    print("This script must be run as root.")
    exit()

if __name__ == "__main__":
    try:
        main = iss.ExporterMain()
    except iss.ISSError as isserror:
        # I have the tb get generated in the function that the the error occurred in to minimize
        # the amount of extra crap that shows up in it.
        tb = isserror.tb
        msg = isserror.msg
        log2stderr(-1, isserror.msg)
        log2stderr(4, isserror.tb)
        sys.exit(-1)
    except SystemExit as se:
        sys.exit(se.code)
    except Exception as e:
        log2stderr(-1, "Unhandled Error: %s" % (e.__class__.__name__,))
        tbout = cStringIO.StringIO()
        Traceback(mail=0, ostream=tbout, with_locals=0)
        log2stderr(4, tbout.getvalue())
        sys.exit(-1)

    try:
        main.main()

    except SystemExit as se:
        sys.exit(se.code)

    except iss.ISSError as isserror:
        tb = isserror.tb
        msg = isserror.msg
        iss.handle_error(msg, tb)

        if main.options.email:
            iss.sendMail()

        if main.options.print_report:
            iss.print_report()

        sys.exit(-1)

    except Exception as e:
        log2stderr(-1, "Unhandled Error: %s" % (e.__class__.__name__,))
        # If we get here we want the traceback, even if it's got some useless junk added to it.
        tbout = cStringIO.StringIO()
        Traceback(mail=0, ostream=tbout, with_locals=0)
        log2email(-1, tbout.getvalue())

        if main.options.email:
            iss.sendMail()

        if main.options.print_report:
            iss.print_report()

        sys.exit(-1)
  070701000000CB000081B40000000000000000000000015FBBE8EE00002D1B000000000000000000000000000000000000004A00000000spacewalk-backend/satellite_tools/disk_dumper/rhn-satellite-exporter.sgml <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [
<!ENTITY RHNSATEXPORTER "SUSE Manager Exporter " >

]>
<refentry>

<RefMeta>
<RefEntryTitle>rhn-satellite-exporter</RefEntryTitle><manvolnum>8</manvolnum>
<RefMiscInfo>Version 1.0</RefMiscInfo>
</RefMeta>

<RefNameDiv>
<RefName><command>rhn-satellite-exporter</command></RefName>
<RefPurpose>
A tool that exports Red Hat Satellite content into a directory in an XML format. That content can then be imported using satellite-sync's -m option.
</RefPurpose>
</RefNameDiv>

<RefSynopsisDiv>
<Synopsis>
    <cmdsynopsis>
        <command>rhn-satellite-exporter</command>
        <arg>options <replaceable>...</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-v</arg>
        <arg>--verbose</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-d<replaceable>DIRECTORY</replaceable></arg>
        <arg>--dir=<replaceable>DIRECTORY</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-c<replaceable>CHANNEL_LABEL</replaceable></arg>
        <arg>--channel=<replaceable>CHANNEL_LABEL</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-a</arg>
        <arg>--all-channels</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--hard-links</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--start-date=<replaceable>START_DATE</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--end-date=<replaceable>END_DATE</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--use-rhn-date</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--use-sync-date</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--whole-errata</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-p</arg>
        <arg>--print-configuration</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--step</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--no-rpms</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--no-packages</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--no-errata</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--no-kickstarts</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--debug-level</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--email</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--traceback-mail</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--all-orgs</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-o<replaceable>ORG</replaceable></arg>
        <arg>--org=<replaceable>ORG</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--list-orgs</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--help</arg>
    </cmdsynopsis>
</Synopsis>
</RefSynopsisDiv>

<RefSect1><Title>Description</Title>

<para>
    The &RHNSATEXPORTER; (<emphasis>rhn-satellite-exporter</emphasis>) tool exports Red Hat Satellite content in an XML format that is understood by satellite-sync's -m option. The means of transporting the exported information to the Red Hat Satellite server is up to the user and beyond the scope of this document. The content is exported into a directory that is specified by the user with the -d option. rhn-satellite-exporter can export the following content: <emphasis>Channel Families, Arches, Channel Metadata, Blacklists, RPMS, RPM Metadata, Errata, Kickstarts</emphasis>.
</para>
<para>
    The amount of time it takes rhn-satellite-exporter to export data is dependent on the number and size of the channels being exported. Using the --no-packages, --no-kickstarts, --no-errata, and --no-rpms options will reduce the amount of time it takes for rhn-satellite-exporter to run, but they will also prevent potentially useful information from being exported. For that reason, they should only be used when you are certain that you will not need the content that they exclude. Additionally, you will need to use the matching options for satellite-sync when importing the data. For example, if you use --no-kickstarts with rhn-satellite-exporter you will have to use satellite-sync's --no-kickstarts option when importing the data.
</para>
<para>
    If you are exporting one of the base channels provided by RHN, you will also need to export the tools channel associated with that base channel in order to kickstart machines to the distribution in the base channel. For instance, if you export rhel-i386-as-4 you should also export the rhn-tools-rhel-4-as-i386 channel in order to kickstart machines to RHEL 4 AS. This is because the tools channels contain the auto-kickstart packages that install packages for kickstarting a machine through the Red Hat Satellite.
</para>
<para>
    The --email option is used to send a report to the administrator's email address when the export is complete. If an error occurs when the --email option is set, the error should be included in the report. The only time that --email will not work is if an error occurs while the program is starting up. Increasing the debug level by using --debug-level will increase the amount of information included in the report.
</para>
</RefSect1>

<RefSect1><Title>Options</Title>
<variablelist>
    <varlistentry>
        <term>-v, --verbose</term>
        <listitem>
            <para>Set debug level to 3. Overrides the value in rhn.conf.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-dDIR, --dir=DIR</term>
        <listitem>
            <para>Place the exported information into this directory.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--hard-links</term>
        <listitem>
        <para>Hard link exported packages and kickstarts to original files.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-c<replaceable>CHANNEL_LABEL</replaceable>, --channel=<replaceable>CHANNEL_LABEL</replaceable></term>
        <listitem>
            <para>Process data for this specific channel (specified by label)
            only.
            NOTE: the channel's *label* is NOT the same as the channel's
            *name*.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-a, --all-channels</term>
        <listitem>
            <para>Export all channels.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
		<term>--start-date=<replaceable>START_DATE</replaceable></term>
        <listitem>
            <para>The start date limit that the last modified dates are
                  compared against. Should be in the format 'YYYYMMDDHH24MISS'.
                  If you did not enter hour, minute and/or second, then zero is
                  assumed. I.e. date 20100101 is expanded to 20100101000000.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
		<term>--end-date=<replaceable>END_DATE</replaceable></term>
        <listitem>
            <para>The end date limit that the last modified dates are
                  compared against. Must be in the format 'YYYYMMDDHH24MISS'.
                  If you did not enter hour, minute and/or second, then zero is
                  assumed. I.e. date 20100101 is expanded to 20100101000000.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--use-rhn-date</term>
        <listitem>
            <para>Limit exported packages according to the date when
                  they appeared at Red Hat Network. This is default.
                  </para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--use-sync-date</term>
        <listitem>
            <para>Limit exported packages according to the date they
                  where pulled into Red Hat Satellite.
                  </para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--whole-errata</term>
        <listitem>
            <para>Always include package if it belongs to errata which
                  is withing start/end-date range.
                  </para>
        </listitem>
    </varlistentry>
    <varlistentry>
		<term>--make-isos=<replaceable>MAKE_ISOS</replaceable></term>
        <listitem>
            <para>Create channel dump isos directory called satellite-isos.
                  Usage: --make-isos=cd or dvd.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--list-channels</term>
        <listitem>
            <para>List the channels that can be exported.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--list-steps</term>
        <listitem>
            <para>List all of the steps that rhn-satellite-exporter takes while exporting data. These can be used as values for --step.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-p, --print-configuration</term>
        <listitem>
            <para>Print the configuration and exit.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--print-report</term>
        <listitem>
            <para>Print a report to the terminal when the export is complete.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--step</term>
        <listitem>
            <para>Export information only up to this step.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--no-rpms</term>
        <listitem>
            <para>Do not export RPMs.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--no-packages</term>
        <listitem>
            <para>Do not export RPM metadata.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--no-errata</term>
        <listitem>
            <para>Do not export errata.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--no-kickstarts</term>
        <listitem>
            <para>Do not export kickstart data.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--debug-level</term>
        <listitem>
            <para>Set the debug level to this value. Overrides the value in /etc/rhn/rhn.conf for this tool.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--email</term>
        <listitem>
            <para>Email a report of what was exported and what errors may have occurred.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--traceback-mail</term>
        <listitem>
            <para>Alternative email address for --email.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--all-orgs</term>
        <listitem>
            <para>Export all orgs.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-o<replaceable>ORG</replaceable>, --org=<replaceable>ORG</replaceable></term>
        <listitem>
            <para>Include the org with this id in the export.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--list-orgs</term>
        <listitem>
            <para>List all orgs that can be exported.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-h, --help</term>
        <listitem>
            <para>Show help message and exit.</para>
        </listitem>
    </varlistentry>
</variablelist>
</RefSect1>

<RefSect1><Title>See Also</Title>
<simplelist>
    <member>satellite-sync(8)</member>
</simplelist>
</RefSect1>

<RefSect1><Title>Authors</Title>
<simplelist>
    <member>John Wregglesworth <email>wregglej@redhat.com</email></member>
</simplelist>
</RefSect1>
</RefEntry>
 070701000000CC000081B40000000000000000000000015FBBE8EE000005CF000000000000000000000000000000000000003F00000000spacewalk-backend/satellite_tools/disk_dumper/string_buffer.py    #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Simple string buffer that wraps around streams to speed up writes
#

import sys
import time

class StringBuffer:

    def __init__(self, stream):
        self.stream = stream
        self.buffer_size = 65536
        self.buffer = ""

    def write(self, data):
        self.buffer = self.buffer + data
        if len(self.buffer) < self.buffer_size:
            return
        # The buffer is full, send it
        self.stream.write(self.buffer[:self.buffer_size])
        self.buffer = self.buffer[self.buffer_size:]

    def flush(self):
        if self.buffer:
            self.stream.write(self.buffer)
            self.buffer = ""

    def close(self):
        self.flush()

    def __del__(self):
        self.close()


if __name__ == '__main__':
    sb = StringBuffer(sys.stdout)
    sb.buffer_size = 10

    while 1:
        sb.write('a')
        time.sleep(.2)
 070701000000CD000081B40000000000000000000000015FBBE8EE000038D3000000000000000000000000000000000000002E00000000spacewalk-backend/satellite_tools/download.py #
# Copyright (c) 2018 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import os
import sys
import re
import time
from threading import Thread, Lock
try:
    #  python 2
    import urlparse
    from Queue import Queue, Empty
    from urllib import quote
except ImportError:
    #  python3
    import urllib.parse as urlparse # pylint: disable=F0401,E0611
    from queue import Queue, Empty
    from urllib.parse import quote
import pycurl
from urlgrabber.grabber import URLGrabberOptions, PyCurlFileObject, URLGrabError
from uyuni.common.checksum import getFileChecksum
from spacewalk.common.rhnConfig import CFG, initCFG
from spacewalk.satellite_tools.syncLib import log, log2


class ProgressBarLogger:
    def __init__(self, msg, total):
        self.msg = msg
        self.total = total
        self.status = 0
        self.last_log = time.time()
        self.lock = Lock()

    def log(self, *_):
        self.lock.acquire()
        self.status += 1
        self._print_progress_bar(self.status, self.total, prefix=self.msg, bar_length=50)
        if time.time() > int(self.last_log + 90):
            self.last_log = time.time()
            log(0, '%s %s' % (round(100.00 * (self.status / float(self.total)), 2), '%'))
        self.lock.release()

    # from here http://stackoverflow.com/questions/3173320/text-progress-bar-in-the-console
    # Print iterations progress
    @staticmethod
    def _print_progress_bar(iteration, total, prefix='', suffix='', decimals=2, bar_length=100):
        """
        Call in a loop to create terminal progress bar
        @params:
            iteration   - Required  : current iteration (Int)
            total       - Required  : total iterations (Int)
            prefix      - Optional  : prefix string (Str)
            suffix      - Optional  : suffix string (Str)
            decimals    - Optional  : number of decimals in percent complete (Int)
            bar_length   - Optional  : character length of bar (Int)
        """
        filled_length = int(round(bar_length * iteration / float(total)))
        percents = round(100.00 * (iteration / float(total)), decimals)
        bar_char = '#' * filled_length + '-' * (bar_length - filled_length)
        sys.stdout.write('\r%s |%s| %s%s %s' % (prefix, bar_char, percents, '%', suffix))
        sys.stdout.flush()
        if iteration == total:
            sys.stdout.write('\n')
            sys.stdout.flush()


class TextLogger:
    def __init__(self, _, total):
        self.total = total
        self.status = 0
        self.lock = Lock()

    def log(self, success, param):
        self.lock.acquire()
        self.status += 1
        if success:
            log(0, "    %d/%d : %s" % (self.status, self.total, str(param)))
        else:
            log2(0, 0, "    %d/%d : %s (failed)" % (self.status, self.total, str(param)), stream=sys.stderr)
        self.lock.release()


# Older versions of urlgrabber don't allow to set proxy parameters separately
# Simplified version from yumRepository class
def get_proxies(proxy, user, password):
    if not proxy:
        return {}
    proxy_string = proxy
    if user:
        auth = quote(user)
        if password:
            auth += ':' + quote(password)
        proto, rest = re.match(r'(\w+://)(.+)', proxy_string).groups()
        proxy_string = "%s%s@%s" % (proto, auth, rest)
    proxies = {'http': proxy_string, 'https': proxy_string, 'ftp': proxy_string}
    return proxies


class PyCurlFileObjectThread(PyCurlFileObject):
    def __init__(self, url, filename, opts, curl_cache, parent):
        self.curl_cache = curl_cache
        self.parent = parent
        (url, parts) = opts.urlparser.parse(url, opts)
        (scheme, host, path, parm, query, frag) = parts
        opts.find_proxy(url, scheme)
        PyCurlFileObject.__init__(self, str(url), filename, opts)

    def _do_open(self):
        self.curl_obj = self.curl_cache
        self.curl_obj.reset()
        self._set_opts()
        self._do_grab()
        return self.fo

    def _do_perform(self):
        # WORKAROUND - BZ #1439758 - ensure first item in queue is performed alone to properly setup NSS
        if not self.parent.first_in_queue_done:
            self.parent.first_in_queue_lock.acquire()
            # If some other thread was faster, no need to block anymore
            if self.parent.first_in_queue_done:
                self.parent.first_in_queue_lock.release()
        try:
            PyCurlFileObject._do_perform(self)
        finally:
            if not self.parent.first_in_queue_done:
                self.parent.first_in_queue_done = True
                self.parent.first_in_queue_lock.release()

    def _set_opts(self, opts=None):
        if not opts:
            opts = {}
        PyCurlFileObject._set_opts(self, opts=opts)
        self.curl_obj.setopt(pycurl.FORBID_REUSE, 0) # pylint: disable=E1101


class FailedDownloadError(Exception):
    pass


class DownloadThread(Thread):
    def __init__(self, parent, queue):
        Thread.__init__(self)
        self.parent = parent
        self.queue = queue
        # pylint: disable=E1101
        self.curl = pycurl.Curl()
        self.mirror = 0

    @staticmethod
    def __is_file_done(local_path=None, file_obj=None, checksum_type=None, checksum=None):
        if checksum_type and checksum:
            if local_path and os.path.isfile(local_path):
                return getFileChecksum(checksum_type, filename=local_path) == checksum
            elif file_obj:
                return getFileChecksum(checksum_type, file_obj=file_obj) == checksum
        if local_path and os.path.isfile(local_path):
            return True
        elif file_obj:
            return True
        return False

    def __can_retry(self, retry, mirrors, opts, url, e):
        retrycode = getattr(e, 'errno', None)
        code = getattr(e, 'code', None)
        if retry < (self.parent.retries - 1):
            # No codes at all or some specified codes
            # 58, 77 - Couple of curl error codes observed in multithreading on RHEL 7 - probably a bug
            if (retrycode is None and code is None) or (retrycode in opts.retrycodes or code in [58, 77]):
                log2(0, 2, "ERROR: Download failed: %s - %s. Retrying..." % (url, sys.exc_info()[1]),
                     stream=sys.stderr)
                return True

        # 14 - HTTP Error
        if retry < (mirrors - 1) and retrycode == 14:
            log2(0, 2, "ERROR: Download failed: %s - %s. Trying next mirror..." % (url, sys.exc_info()[1]),
                 stream=sys.stderr)
            return True

        log2(0, 1, "ERROR: Download failed: %s - %s." % (url, sys.exc_info()[1]),
             stream=sys.stderr)
        return False

    def __next_mirror(self, total):
        if self.mirror < (total - 1):
            self.mirror += 1
        else:
            self.mirror = 0

    def __fetch_url(self, params):
        # Skip existing file if exists and matches checksum
        if not self.parent.force:
            if self.__is_file_done(local_path=params['target_file'], checksum_type=params['checksum_type'],
                                   checksum=params['checksum']):
                return True

        opts = URLGrabberOptions(ssl_ca_cert=params['ssl_ca_cert'], ssl_cert=params['ssl_client_cert'],
                                 ssl_key=params['ssl_client_key'], range=params['bytes_range'],
                                 proxy=params['proxy'], username=params['proxy_username'],
                                 password=params['proxy_password'], proxies=params['proxies'],
                                 http_headers=tuple(params['http_headers'].items()))
        mirrors = len(params['urls'])
        for retry in range(max(self.parent.retries, mirrors)):
            fo = None
            url = urlparse.urljoin(params['urls'][self.mirror], params['relative_path'])
            ## BEWARE: This hack is introduced in order to support SUSE SCC channels
            ## This also needs a patched urlgrabber AFAIK
            if 'authtoken' in params and params['authtoken']:
                (scheme, netloc, path, query, _) = urlparse.urlsplit(params['urls'][self.mirror])
                url = urlparse.urlunsplit((
                    scheme,
                    netloc,
                    urlparse.urljoin(path, params['relative_path']),
                    query.rstrip('/'), ''))
            try:
                try:
                    fo = PyCurlFileObjectThread(url, params['target_file'], opts, self.curl, self.parent)
                    # Check target file
                    if not self.__is_file_done(file_obj=fo, checksum_type=params['checksum_type'],
                                               checksum=params['checksum']):
                        raise FailedDownloadError("Target file isn't valid. Checksum should be %s (%s)."
                                                  % (params['checksum'], params['checksum_type']))
                    break
                except (FailedDownloadError, URLGrabError):
                    e = sys.exc_info()[1]
                    # urlgrabber-3.10.1-9 trows URLGrabError for both
                    # 'HTTP Error 404 - Not Found' and 'No space left on device', so
                    # workaround for this is check error message:
                    if 'No space left on device' in str(e):
                        self.parent.fail_download(e)
                        return False

                    if not self.__can_retry(retry, mirrors, opts, url, e):
                        return False
                    self.__next_mirror(mirrors)
                # RHEL 6 urlgrabber raises KeyboardInterrupt for example when there is no space left
                # but handle also other fatal exceptions
                except (KeyboardInterrupt, Exception):  # pylint: disable=W0703
                    e = sys.exc_info()[1]
                    self.parent.fail_download(e)
                    return False
            finally:
                if fo:
                    fo.close()
                # Delete failed download file
                elif os.path.isfile(params['target_file']):
                    os.unlink(params['target_file'])

        return True

    def run(self):
        while not self.queue.empty() and self.parent.can_continue():
            try:
                params = self.queue.get(block=False)
            except Empty:
                break
            self.mirror = 0
            success = self.__fetch_url(params)
            if self.parent.log_obj:
                # log_obj must be thread-safe
                self.parent.log_obj.log(success, os.path.basename(params['relative_path']))
            self.queue.task_done()
        self.curl.close()


class ThreadedDownloader:
    def __init__(self, retries=3, log_obj=None, force=False):
        self.queues = {}
        comp = CFG.getComponent()
        initCFG('server.satellite')
        try:
            self.threads = int(CFG.REPOSYNC_DOWNLOAD_THREADS)
        except ValueError:
            initCFG(comp)
            raise ValueError("Number of threads expected, found: '%s'" % CFG.REPOSYNC_DOWNLOAD_THREADS)
        else:
            initCFG(comp)
        if self.threads < 1:
            raise ValueError("Invalid number of threads: %d" % self.threads)
        self.retries = retries
        self.log_obj = log_obj
        self.force = force
        self.lock = Lock()
        self.exception = None
        # WORKAROUND - BZ #1439758 - ensure first item in queue is performed alone to properly setup NSS
        self.first_in_queue_done = False
        self.first_in_queue_lock = Lock()

    def set_log_obj(self, log_obj):
        self.log_obj = log_obj

    def set_force(self, force):
        self.force = force

    @staticmethod
    def _validate(ssl_set):
        ssl_ca_cert, ssl_cert, ssl_key = ssl_set
        for certificate_file in (ssl_ca_cert, ssl_cert, ssl_key):
            if certificate_file and not os.path.isfile(certificate_file):
                log2(0, 0, "ERROR: Certificate file not found: %s" % certificate_file, stream=sys.stderr)
                return False
        return True

    def add(self, params):
        ssl_set = (params['ssl_ca_cert'], params['ssl_client_cert'], params['ssl_client_key'])
        if self._validate(ssl_set):
            if ssl_set not in self.queues:
                self.queues[ssl_set] = Queue()
            queue = self.queues[ssl_set]
            queue.put(params)

    def run(self):
        size = 0
        for queue in list(self.queues.values()):
            size += queue.qsize()
        if size <= 0:
            return
        log(1, "Downloading total %d files from %d queues." % (size, len(self.queues)))

        for index, queue in enumerate(self.queues.values()):
            log(2, "Downloading %d files from queue #%d." % (queue.qsize(), index))
            self.first_in_queue_done = False
            started_threads = []
            for _ in range(self.threads):
                thread = DownloadThread(self, queue)
                thread.setDaemon(True)
                thread.start()
                started_threads.append(thread)

            # wait to finish
            try:
                while any(t.isAlive() for t in started_threads):
                    time.sleep(1)
            except KeyboardInterrupt:
                e = sys.exc_info()[1]
                self.fail_download(e)
                while any(t.isAlive() for t in started_threads):
                    time.sleep(1)
                break

        # raise first detected exception if any
        if self.exception:
            raise self.exception  # pylint: disable=E0702

    def can_continue(self):
        self.lock.acquire()
        status = self.exception is None
        self.lock.release()
        return status

    def fail_download(self, exception):
        self.lock.acquire()
        if not self.exception:
            self.exception = exception
        self.lock.release()
 070701000000CE000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002B00000000spacewalk-backend/satellite_tools/exporter    070701000000CF000081B40000000000000000000000015FBBE8EE000000B1000000000000000000000000000000000000003400000000spacewalk-backend/satellite_tools/exporter/Makefile   # Makefile for spacewalk backend
#

TOP	= ../..

# Specific stuff
SUBDIR	= satellite_tools/exporter
SPACEWALK_FILES	= __init__ exportLib xmlWriter

include $(TOP)/Makefile.defs
   070701000000D0000081B40000000000000000000000015FBBE8EE00000265000000000000000000000000000000000000003700000000spacewalk-backend/satellite_tools/exporter/__init__.py    #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
   070701000000D1000081B40000000000000000000000015FBBE8EE00010888000000000000000000000000000000000000003800000000spacewalk-backend/satellite_tools/exporter/exportLib.py   #
# Copyright (c) 2008--2018 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import time
from uyuni.common.usix import StringType

from uyuni.common import rhnLib
from spacewalk.common.rhnLog import log_debug
from spacewalk.server import rhnSQL


class ArrayIterator:

    def __init__(self, arr):
        self._arr = arr
        if self._arr:
            self._pos = 0
        else:
            # Nothing to iterate over
            self._pos = None

    def get_array(self):
        return self._arr

    def fetchone_dict(self):
        if self._pos is None:
            return None
        i = self._pos
        self._pos = self._pos + 1
        if self._pos == len(self._arr):
            self._pos = None
        return self._arr[i]


class BaseDumper:
    # tag_name has to be set in subclasses

    def __init__(self, writer, data_iterator=None):
        self._writer = writer
        self._attributes = {}
        self._iterator = data_iterator

    # Generic timing function
    @staticmethod
    def timer(debug_level, message, function, *args, **kwargs):
        start = time.time()
        result = function(*args, **kwargs)
        log_debug(debug_level, message, "timing: %.3f" % (time.time() - start))
        return result

    def set_attributes(self):
        return self._attributes

    def set_iterator(self):
        return self._iterator

    def dump(self):
        if not hasattr(self, "tag_name"):
            raise Exception("Programmer error: subclass did not set tag_name")
        tag_name = getattr(self, "tag_name")
        self._attributes = self.set_attributes() or {}
        self._iterator = self.timer(5, "set_iterator", self.set_iterator)

        if not self._iterator:
            self._writer.empty_tag(tag_name, attributes=self._attributes)
            return

        data_found = 0
        while 1:
            data = self.timer(6, "fetchone_dict", self._iterator.fetchone_dict)
            if not data:
                break
            if not data_found:
                data_found = 1
                self._writer.open_tag(tag_name, attributes=self._attributes)

            if isinstance(data, StringType):
                # The iterator produced some XML dump, just write it
                self._writer.stream.write(data)
            else:
                self.timer(6, "dump_subelement", self.dump_subelement, data)

        if data_found:
            self._writer.close_tag(tag_name)
        else:
            self._writer.empty_tag(tag_name, attributes=self._attributes)

    def dump_subelement(self, data):
        # pylint: disable=R0201
        if isinstance(data, BaseDumper):
            data.dump()

    def get_writer(self):
        return self._writer

    def set_writer(self, writer):
        self._writer = writer


class EmptyDumper(BaseDumper):

    def __init__(self, writer, tag_name, attributes=None):
        self.tag_name = tag_name
        self.attributes = attributes or {}
        BaseDumper.__init__(self, writer)

    def dump(self):
        self._writer.empty_tag(self.tag_name, attributes=self.attributes)


class SimpleDumper(BaseDumper):

    def __init__(self, writer, tag_name, value, max_value_bytes=None):
        self.tag_name = tag_name
        self._value = value

        # max number of bytes satellite can handle in the matching db row
        self._max_value_bytes = max_value_bytes
        BaseDumper.__init__(self, writer)

    def dump(self):
        self._writer.open_tag(self.tag_name)
        if self._value is None:
            self._writer.empty_tag('rhn-null')
        else:
            self._writer.data(self._value)
        self._writer.close_tag(self.tag_name)


class BaseRowDumper(BaseDumper):

    def __init__(self, writer, row):
        BaseDumper.__init__(self, writer)
        self._row = row


class BaseChecksumRowDumper(BaseRowDumper):

    def set_iterator(self):
        # checksums
        checksum_arr = [{'type':  self._row['checksum_type'],
                         'value': self._row['checksum']}]
        arr = [_ChecksumDumper(self._writer, data_iterator=ArrayIterator(checksum_arr))]
        return ArrayIterator(arr)


class BaseQueryDumper(BaseDumper):
    iterator_query = None

    def set_iterator(self):
        if self._iterator:
            return self._iterator
        h = rhnSQL.prepare(self.iterator_query)
        h.execute()
        return h


class BaseSubelementDumper(BaseDumper):
    # pylint: disable=E1101
    subelement_dumper_class = object

    def dump_subelement(self, data):
        d = self.subelement_dumper_class(self._writer, data)
        d.dump()

####


class ExportTypeDumper(BaseDumper):

    def __init__(self, writer, start_date=None, end_date=None):
        if start_date:
            self.type = 'incremental'
        else:
            self.type = 'full'
        self.start_date = start_date
        if end_date:
            self.end_date = end_date
        else:
            self.end_date = time.strftime("%Y%m%d%H%M%S")
        BaseDumper.__init__(self, writer)

    def dump(self):
        self._writer.open_tag('export-type')
        self._writer.stream.write(self.type)
        self._writer.close_tag('export-type')
        if self.start_date:
            self._writer.open_tag('export-start-date')
            self._writer.stream.write(self.start_date)
            self._writer.close_tag('export-start-date')
        if self.end_date:
            self._writer.open_tag('export-end-date')
            self._writer.stream.write(self.end_date)
            self._writer.close_tag('export-end-date')


class SatelliteDumper(BaseDumper):
    tag_name = 'rhn-satellite'

    def __init__(self, writer, *dumpers):
        BaseDumper.__init__(self, writer)
        self._dumpers = dumpers

    def set_attributes(self):
        return {
            'version': 'x.y',
        }

    def set_iterator(self):
        return ArrayIterator(self._dumpers)


class _OrgTrustDumper(BaseDumper):
    tag_name = 'rhn-org-trusts'

    def dump_subelement(self, data):
        c = EmptyDumper(self._writer, 'rhn-org-trust', attributes={
            'org-id': data['org_trust_id'],
        })
        c.dump()


class _OrgDumper(BaseDumper):
    tag_name = 'rhn-org'

    def __init__(self, writer, org):
        self.org = org
        BaseDumper.__init__(self, writer)

    _query_org_trusts = """
        select rto.org_trust_id
          from rhnTrustedOrgs rto
         where rto.org_id = :org_id
    """

    def set_iterator(self):
        # trusts
        h = rhnSQL.prepare(self._query_org_trusts)
        h.execute(org_id=self.org['id'])
        return ArrayIterator([_OrgTrustDumper(self._writer, data_iterator=h)])

    def set_attributes(self):
        attributes = {
            'id': self.org['id'],
            'name': self.org['name'],
        }
        return attributes


class OrgsDumper(BaseDumper):
    tag_name = 'rhn-orgs'

    def __init__(self, writer, data_iterator=None):
        BaseDumper.__init__(self, writer, data_iterator)

    def dump_subelement(self, data):
        org = _OrgDumper(self._writer, data)
        org.dump()


class ChannelTrustedOrgsDumper(BaseDumper):
    tag_name = 'rhn-channel-trusted-orgs'

    def dump_subelement(self, data):
        d = EmptyDumper(self._writer, 'rhn-channel-trusted-org',
                        attributes={'org-id': data['org_trust_id']})
        d.dump()


class _ChannelDumper(BaseRowDumper):
    tag_name = 'rhn-channel'

    def __init__(self, writer, row, start_date=None, end_date=None, use_rhn_date=True, whole_errata=False):
        BaseRowDumper.__init__(self, writer, row)
        self.start_date = start_date
        self.end_date = end_date
        self.use_rhn_date = use_rhn_date
        self.whole_errata = whole_errata

    def set_attributes(self):
        channel_id = self._row['id']

        packages = ["rhn-package-%s" % x for x in self._get_package_ids()]
        # XXX channel-errata is deprecated and should go away in dump version
        # 3 or higher - we now dump that information in its own subelement
        # rhn-channel-errata
        errata = ["rhn-erratum-%s" % x for x in self._get_errata_ids()]
        ks_trees = self._get_kickstartable_trees()

        return {
            'channel-id': 'rhn-channel-%s' % channel_id,
            'label': self._row['label'],
            'org_id': self._row['org_id'] or "",
            'channel-arch': self._row['channel_arch'],
            'packages': ' '.join(packages),
            'channel-errata': ' '.join(errata),
            'kickstartable-trees': ' '.join(ks_trees),
            'sharing': self._row['channel_access'],
        }

    _query_channel_families = rhnSQL.Statement("""
        select cf.id, cf.label
          from rhnChannelFamily cf, rhnChannelFamilyMembers cfm
         where cfm.channel_family_id = cf.id
           and cfm.channel_id = :channel_id
    """)
    _query_dist_channel_map = rhnSQL.Statement("""
        select dcm.os, dcm.release, ca.label channel_arch
          from rhnDistChannelMap dcm, rhnChannelArch ca
         where dcm.channel_id = :channel_id
           and dcm.channel_arch_id = ca.id
           and dcm.org_id is null
    """)

    _query_get_channel_trusts = rhnSQL.Statement("""
        select org_trust_id
          from rhnChannelTrust
         where channel_id = :channel_id
    """)

    def set_iterator(self):
        channel_id = self._row['id']
        arr = []
        mappings = [
            ('rhn-channel-parent-channel', 'parent_channel'),
            ('rhn-channel-basedir', 'basedir'),
            ('rhn-channel-name', 'name'),
            ('rhn-channel-summary', 'summary'),
            ('rhn-channel-description', 'description'),
            ('rhn-channel-gpg-key-url', 'gpg_key_url'),
            ('rhn-channel-checksum-type', 'checksum_type'),
            ('rhn-channel-update-tag', 'update_tag'),
            ('rhn-channel-installer-updates', 'installer_updates'),
        ]
        for k, v in mappings:
            arr.append(SimpleDumper(self._writer, k, self._row.get(v)))

        arr.append(SimpleDumper(self._writer, 'rhn-channel-last-modified',
                                _dbtime2timestamp(self._row['last_modified'])))
        channel_product_details = self._get_channel_product_details()
        arr.append(SimpleDumper(self._writer, 'rhn-channel-product-name',
                                channel_product_details[0]))
        arr.append(SimpleDumper(self._writer, 'rhn-channel-product-version',
                                channel_product_details[1]))
        arr.append(SimpleDumper(self._writer, 'rhn-channel-product-beta',
                                channel_product_details[2]))

        comp_last_modified = self._channel_comps_last_modified()
        modules_last_modified = self._channel_modules_last_modified()
        if comp_last_modified is not None:
            arr.append(SimpleDumper(self._writer, 'rhn-channel-comps-last-modified',
                                    _dbtime2timestamp(comp_last_modified[0])))
        if modules_last_modified is not None:
            arr.append(SimpleDumper(self._writer, 'rhn-channel-modules-last-modified',
                                    _dbtime2timestamp(modules_last_modified[0])))

        h = rhnSQL.prepare(self._query_get_channel_trusts)
        h.execute(channel_id=channel_id)
        arr.append(ChannelTrustedOrgsDumper(self._writer, data_iterator=h))

        h = rhnSQL.prepare(self._query_channel_families)
        h.execute(channel_id=channel_id)
        arr.append(ChannelFamiliesDumper(self._writer, data_iterator=h,
                                         ignore_subelements=1))

        h = rhnSQL.prepare(self._query_dist_channel_map)
        h.execute(channel_id=channel_id)
        arr.append(DistsDumper(self._writer, h))

        # Source package information (with timestamps)
        h = self._get_cursor_source_packages()
        arr.append(ChannelSourcePackagesDumper(self._writer, h))
        # Errata information (with timestamps)
        query_args = {'channel_id': channel_id}
        if self.start_date:
            if self.use_rhn_date:
                query = self._query__get_errata_ids_by_rhnlimits
            else:
                query = self._query__get_errata_ids_by_limits
            query_args.update({'lower_limit': self.start_date,
                               'upper_limit': self.end_date})
        else:
            query = self._query__get_errata_ids

        h = rhnSQL.prepare(query)
        h.execute(**query_args)
        arr.append(ChannelErrataDumper(self._writer, h))
        arr.append(ExportTypeDumper(self._writer, self.start_date, self.end_date))

        return ArrayIterator(arr)

    _query_get_package_ids = rhnSQL.Statement("""
        select package_id as id
          from rhnChannelPackage
         where channel_id = :channel_id
    """)

    _query_get_package_ids_by_date_limits = rhnSQL.Statement("""
        select package_id as id
          from rhnChannelPackage rcp
         where rcp.channel_id = :channel_id
           and rcp.modified >= TO_TIMESTAMP(:lower_limit, 'YYYYMMDDHH24MISS')
           and rcp.modified <= TO_TIMESTAMP(:upper_limit, 'YYYYMMDDHH24MISS')
     """)

    _query_get_package_ids_by_rhndate_limits = rhnSQL.Statement("""
        select package_id as id
          from rhnPackage rp, rhnChannelPackage rcp
         where rcp.channel_id = :channel_id
           and rcp.package_id = rp.id
           and rp.last_modified >= TO_TIMESTAMP(:lower_limit, 'YYYYMMDDHH24MISS')
           and rp.last_modified <= TO_TIMESTAMP(:upper_limit, 'YYYYMMDDHH24MISS')
     """)

    _query_pkgids_by_date_whole_errata = rhnSQL.Statement("""
        select rcp.package_id as id
          from rhnChannelPackage rcp, rhnPackage rp
            left join rhnErrataPackage rep on rp.id = rep.package_id
            left join rhnErrata re on rep.errata_id = re.id
         where rcp.channel_id = :channel_id
           and rcp.package_id = rp.id
           and ((re.modified >= TO_TIMESTAMP(:lower_limit, 'YYYYMMDDHH24MISS')
               and re.modified <= TO_TIMESTAMP(:upper_limit, 'YYYYMMDDHH24MISS')
            ) or (rep.package_id is NULL
               and rcp.modified >= TO_TIMESTAMP(:lower_limit, 'YYYYMMDDHH24MISS')
               and rcp.modified <= TO_TIMESTAMP(:upper_limit, 'YYYYMMDDHH24MISS'))
            )
     """)

    _query_get_pkgids_by_rhndate_whole_errata = rhnSQL.Statement("""
        select rcp.package_id as id
          from rhnChannelPackage rcp, rhnPackage rp
            left join rhnErrataPackage rep on rp.id = rep.package_id
            left join rhnErrata re on rep.errata_id = re.id
         where rcp.channel_id = :channel_id
           and rcp.package_id = rp.id
           and ((re.last_modified >= TO_TIMESTAMP(:lower_limit, 'YYYYMMDDHH24MISS')
               and re.last_modified <= TO_TIMESTAMP(:upper_limit, 'YYYYMMDDHH24MISS')
            ) or (rep.package_id is NULL
               and rp.last_modified >= TO_TIMESTAMP(:lower_limit, 'YYYYMMDDHH24MISS')
               and rp.last_modified <= TO_TIMESTAMP(:upper_limit, 'YYYYMMDDHH24MISS'))
            )
     """)

    # Things that can be overwriten in subclasses
    def _get_package_ids(self):
        if self.start_date and self.whole_errata:
            return self._get_ids(self._query_pkgids_by_date_whole_errata,
                                 self._query_get_pkgids_by_rhndate_whole_errata,
                                 self._query_get_package_ids)
        else:
            return self._get_ids(self._query_get_package_ids_by_date_limits,
                                 self._query_get_package_ids_by_rhndate_limits,
                                 self._query_get_package_ids)

    def _get_ids(self, query_with_limit, query_with_rhnlimit, query_no_limits):
        query_args = {'channel_id': self._row['id']}
        if self.start_date:
            if self.use_rhn_date:
                query = query_with_rhnlimit
            else:
                query = query_with_limit
            query_args.update({'lower_limit': self.start_date,
                               'upper_limit': self.end_date})
        else:
            query = query_no_limits
        h = rhnSQL.prepare(query)
        h.execute(**query_args)
        return [x['id'] for x in h.fetchall_dict() or []]

    _query_get_source_package_ids = rhnSQL.Statement("""
        select distinct ps.id, sr.name source_rpm,
               TO_CHAR(ps.last_modified, 'YYYYMMDDHH24MISS') last_modified
          from rhnChannelPackage cp, rhnPackage p, rhnPackageSource ps,
               rhnSourceRPM sr
         where cp.channel_id = :channel_id
           and cp.package_id = p.id
           and p.source_rpm_id = ps.source_rpm_id
           and ((p.org_id is null and ps.org_id is null) or
               p.org_id = ps.org_id)
           and ps.source_rpm_id = sr.id
    """)

    def _get_cursor_source_packages(self):
        channel_id = self._row['id']

        h = rhnSQL.prepare(self._query_get_source_package_ids)
        h.execute(channel_id=channel_id)
        return h

    _query__get_errata_ids = rhnSQL.Statement("""
        select ce.errata_id as id, e.advisory_name,
              TO_CHAR(e.last_modified, 'YYYYMMDDHH24MISS') last_modified
          from rhnChannelErrata ce, rhnErrata e
         where ce.channel_id = :channel_id
           and ce.errata_id = e.id
    """)

    _query__get_errata_ids_by_limits = rhnSQL.Statement("""
         %s
           and ce.modified >= TO_TIMESTAMP(:lower_limit, 'YYYYMMDDHH24MISS')
           and ce.modified <= TO_TIMESTAMP(:upper_limit, 'YYYYMMDDHH24MISS')
    """ % _query__get_errata_ids)

    _query__get_errata_ids_by_rhnlimits = rhnSQL.Statement("""
         %s
           and e.last_modified >= TO_TIMESTAMP(:lower_limit, 'YYYYMMDDHH24MISS')
           and e.last_modified <= TO_TIMESTAMP(:upper_limit, 'YYYYMMDDHH24MISS')
    """ % _query__get_errata_ids)

    def _get_errata_ids(self):
        return self._get_ids(self._query__get_errata_ids_by_limits,
                             self._query__get_errata_ids_by_rhnlimits,
                             self._query__get_errata_ids)

    _query_get_kickstartable_trees = rhnSQL.Statement("""
        select kt.label as id
          from rhnKickstartableTree kt
         where kt.channel_id = :channel_id
           and kt.org_id is null
    """)

    _query_get_kickstartable_trees_by_rhnlimits = rhnSQL.Statement("""
         %s
           and kt.last_modified >= TO_TIMESTAMP(:lower_limit, 'YYYYMMDDHH24MISS')
           and kt.last_modified <= TO_TIMESTAMP(:upper_limit, 'YYYYMMDDHH24MISS')
    """ % _query_get_kickstartable_trees)

    _query_get_kickstartable_trees_by_limits = rhnSQL.Statement("""
         %s
           and kt.modified >= TO_TIMESTAMP(:lower_limit, 'YYYYMMDDHH24MISS')
           and kt.modified <= TO_TIMESTAMP(:upper_limit, 'YYYYMMDDHH24MISS')
    """ % _query_get_kickstartable_trees)

    def _get_kickstartable_trees(self):
        ks_trees = self._get_ids(self._query_get_kickstartable_trees_by_limits,
                                 self._query_get_kickstartable_trees_by_rhnlimits,
                                 self._query_get_kickstartable_trees)
        ks_trees.sort()
        return ks_trees

    _query_get_channel_product_details = rhnSQL.Statement("""
        select cp.product as name,
               cp.version as version,
               cp.beta
        from rhnChannel c,
             rhnChannelProduct cp
        where c.id = :channel_id
          and c.channel_product_id = cp.id
    """)

    def _get_channel_product_details(self):
        """
        Export rhnChannelProduct table content through ChannelDumper

        return a tuple containing (product name, product version, beta status)
        or (None, None, None) if the information is missing
        """

        channel_id = self._row['id']

        h = rhnSQL.prepare(self._query_get_channel_product_details)
        h.execute(channel_id=channel_id)
        row = h.fetchone_dict()
        if not row:
            return (None, None, None)
        else:
            return (row['name'], row['version'], row['beta'])

    _query_channel_comps_last_modified = rhnSQL.Statement("""
        select to_char(last_modified, 'YYYYMMDDHH24MISS') as comps_last_modified
        from rhnChannelComps
        where channel_id = :channel_id
        and comps_type_id = 1
        order by id desc
    """)

    def _channel_comps_last_modified(self):
        channel_id = self._row['id']
        h = rhnSQL.prepare(self._query_channel_comps_last_modified)
        h.execute(channel_id=channel_id)
        return h.fetchone()

    _query_channel_modules_last_modified = rhnSQL.Statement("""
        select to_char(last_modified, 'YYYYMMDDHH24MISS') as modules_last_modified
        from rhnChannelComps
        where channel_id = :channel_id
        and comps_type_id = 2
        order by id desc
    """)

    def _channel_modules_last_modified(self):
        channel_id = self._row['id']
        h = rhnSQL.prepare(self._query_channel_modules_last_modified)
        h.execute(channel_id=channel_id)
        return h.fetchone()


class ChannelsDumper(BaseSubelementDumper):
    tag_name = 'rhn-channels'
    subelement_dumper_class = _ChannelDumper

    def __init__(self, writer, channels=()):
        super(BaseSubelementDumper, self).__init__(writer)
        self._channels = channels



class ChannelDumper(_ChannelDumper):

    # pylint: disable=W0231,W0233
    def __init__(self, writer, row):
        BaseRowDumper.__init__(self, writer, row)

    #_query_release_channel_map = rhnSQL.Statement("""
    #    select dcm.os product, dcm.release version,
    #           dcm.eus_release release, ca.label channel_arch,
    #           dcm.is_default is_default
    #      from rhnDistChannelMap dcm, rhnChannelArch ca
    #     where dcm.channel_id = :channel_id
    #       and dcm.channel_arch_id = ca.id
    #       and dcm.is_eus = 'Y'
    #""")

    def set_iterator(self):
        arrayiterator = _ChannelDumper.set_iterator()
        arr = arrayiterator.get_array()
        mappings = [
            ('rhn-channel-receiving-updates', 'receiving_updates'),
        ]
        for k, v in mappings:
            arr.append(SimpleDumper(self._writer, k, self._row.get(v)))

        #channel_id = self._row['id']
        # Add EUS info
        #h = rhnSQL.prepare(self._query_release_channel_map)
        # h.execute(channel_id=channel_id)
        #arr.append(ReleaseDumper(self._writer, h))
        return arrayiterator

# class ReleaseDumper(BaseDumper):
#    tag_name = 'rhn-release'
#
#    def dump_subelement(self, data):
#        d = _ReleaseDumper(self._writer, data)
#        d.dump()
#
# class _ReleaseDumper(BaseRowDumper):
#    tag_name = 'rhn-release'
#
#    def set_attributes(self):
#        return {
#            'product'       : self._row['product'],
#            'version'       : self._row['version'],
#            'release'       : self._row['release'],
#            'channel-arch'  : self._row['channel_arch'],
#            'is-default'  : self._row['is_default'],
#        }


class _ChannelSourcePackageDumper(BaseRowDumper):
    tag_name = 'source-package'

    def set_attributes(self):
        return {
            'id': 'rhn-source-package-%s' % self._row['id'],
            'source-rpm': self._row['source_rpm'],
            'last-modified': _dbtime2timestamp(self._row['last_modified']),
        }


class ChannelSourcePackagesDumper(BaseSubelementDumper):
    # Dumps the erratum id and the last modified for an erratum in this
    # channel
    tag_name = 'source-packages'
    subelement_dumper_class = _ChannelSourcePackageDumper


class _ChannelErratumDumper(BaseRowDumper):
    tag_name = 'erratum'

    def set_attributes(self):
        return {
            'id': 'rhn-erratum-%s' % self._row['id'],
            'advisory-name': self._row['advisory_name'],
            'last-modified': _dbtime2timestamp(self._row['last_modified']),
        }


class ChannelErrataDumper(BaseSubelementDumper):
    # Dumps the erratum id and the last modified for an erratum in this
    # channel
    tag_name = 'rhn-channel-errata'
    subelement_dumper_class = _ChannelErratumDumper


class _DistDumper(BaseRowDumper):
    tag_name = 'rhn-dist'

    def set_attributes(self):
        return {
            'os': self._row['os'],
            'release': self._row['release'],
            'channel-arch': self._row['channel_arch'],
        }


class DistsDumper(BaseSubelementDumper):
    tag_name = 'rhn-dists'
    subelement_dumper_class = _DistDumper


class _SupportInfoDumper(BaseRowDumper):
    tag_name = 'suse-keyword'

    def set_attributes(self):
        return {
            'channel' : self._row['channel_label'],
            'pkgid'   : "rhn-package-%s" % self._row['package_id'],
            'keyword' : self._row['keyword'],
        }

class SupportInfoDumper(BaseQueryDumper):
    tag_name = 'suse-data'
    iterator_query = """
        select c.label channel_label,
               p.id    package_id,
               k.label keyword
          from rhnChannel c
          join suseMdData d on c.id = d.channel_id
          join rhnPackage p on d.package_id = p.id
          join suseMdKeyword k on d.keyword_id = k.id
    """

    def __init__(self, writer, data_iterator=None):
        BaseDumper.__init__(self, writer, data_iterator=data_iterator)

    def dump_subelement(self, data):
        cf = _SupportInfoDumper(self._writer, data)
        cf.dump()

class _SuseProductDumper(BaseRowDumper):
    tag_name = 'suse-product'

    def set_attributes(self):
        return {
            'name'          : self._row['name'],
            'version'       : self._row['version'],
            'friendly-name' : self._row['friendly_name'],
            'arch'          : self._row['arch'],
            'release'       : self._row['release'],
            'product-id'    : self._row['product_id'],
            'free'          : self._row['free'],
            'base'          : self._row['base'],
            'release-stage' : self._row['release_stage'],
            'channel-family-label': self._row['channel_family_label']
        }

class SuseProductDumper(BaseQueryDumper):
    tag_name = 'suse-products'
    iterator_query = """
    SELECT p.name, p.version, p.friendly_name,
           pa.label AS arch, p.release, p.product_id,
           p.free, p.base, p.release_stage, cf.label AS channel_family_label
      FROM suseProducts p
 LEFT JOIN rhnPackageArch pa ON p.arch_type_id = pa.id
 LEFT JOIN rhnChannelFamily cf ON p.channel_family_id = cf.id
    """

    def __init__(self, writer, data_iterator=None):
        BaseDumper.__init__(self, writer, data_iterator=data_iterator)

    def dump_subelement(self, data):
        cf = _SuseProductDumper(self._writer, data)
        cf.dump()

class _SuseProductChannelDumper(BaseRowDumper):
    tag_name = 'suse-product-channel'

    def set_attributes(self):
        return {
            'product-id'           : self._row['pdid'],
            'channel-label'        : self._row['clabel'],
            'parent-channel-label' : self._row['pclabel'],
            }

class SuseProductChannelDumper(BaseQueryDumper):
    tag_name = 'suse-product-channels'
    iterator_query = """
    SELECT p.product_id AS pdid,
           pr.channel_label as clabel,
           pr.parent_channel_label AS pclabel
      FROM suseProductSCCRepository pr
      JOIN suseProducts p ON pr.product_id = p.id
     WHERE EXISTS (select 1
                     FROM suseProductChannel pc
                     JOIN rhnChannel c ON c.id = pc.channel_id
                    WHERE p.id = pc.product_id
                      AND pc.mandatory = 'Y'
                      AND c.label = pr.channel_label)
    """

    def __init__(self, writer, data_iterator=None):
        BaseDumper.__init__(self, writer, data_iterator=data_iterator)

    def dump_subelement(self, data):
        cf = _SuseProductChannelDumper(self._writer, data)
        cf.dump()

class _SuseUpgradePathDumper(BaseRowDumper):
    tag_name = 'suse-upgrade-path'

    def set_attributes(self):
        return {
            'from-product-id' : self._row['fromid'],
            'to-product-id'   : self._row['toid'],
            }

class SuseUpgradePathDumper(BaseQueryDumper):
    tag_name = 'suse-upgrade-paths'
    iterator_query = """
    SELECT p1.product_id AS fromid,
           p2.product_id AS toid
      FROM suseUpgradePath up
      JOIN suseProducts p1 ON up.from_pdid = p1.id
      JOIN suseProducts p2 ON up.to_pdid = p2.id
    """

    def __init__(self, writer, data_iterator=None):
        BaseDumper.__init__(self, writer, data_iterator=data_iterator)

    def dump_subelement(self, data):
        cf = _SuseUpgradePathDumper(self._writer, data)
        cf.dump()

class _SuseProductExtensionDumper(BaseRowDumper):
    tag_name = 'suse-product-extension'

    def set_attributes(self):
        return {
            'root-product-id' : self._row['rootid'],
            'product-id' : self._row['pdid'],
            'ext-product-id' : self._row['extid'],
            'recommended': self._row['recommended']
            }

class SuseProductExtensionDumper(BaseQueryDumper):
    tag_name = 'suse-product-extensions'
    iterator_query = """
    SELECT p1.product_id AS pdid,
           p2.product_id AS rootid,
           p3.product_id AS extid,
           e.recommended AS recommended
      FROM suseProductExtension e
      JOIN suseProducts p1 ON e.base_pdid = p1.id
      JOIN suseProducts p2 ON e.root_pdid = p2.id
      JOIN suseProducts p3 ON e.ext_pdid = p3.id
    """

    def __init__(self, writer, data_iterator=None):
        BaseDumper.__init__(self, writer, data_iterator=data_iterator)

    def dump_subelement(self, data):
        cf = _SuseProductExtensionDumper(self._writer, data)
        cf.dump()

class _SuseProductRepositoryDumper(BaseRowDumper):
    tag_name = 'suse-product-repository'

    def set_attributes(self):
        return {
            'root-product-id' : self._row['rootid'],
            'product-id' : self._row['pdid'],
            'repository-id' : self._row['repo_id'],
            'channel-label': self._row['channel_label'],
            'parent-channel-label': self._row['parent_channel_label'],
            'channel-name': self._row['channel_name'],
            'mandatory': self._row['mandatory'],
            'update-tag': self._row['update_tag']
            }

class SuseProductRepositoryDumper(BaseQueryDumper):
    tag_name = 'suse-product-repositories'
    iterator_query = """
    SELECT p1.product_id AS pdid,
           p2.product_id AS rootid,
           r.scc_id AS repo_id,
           pr.channel_label,
           pr.parent_channel_label,
           pr.channel_name,
           pr.mandatory,
           pr.update_tag
      FROM suseProductSCCRepository pr
      JOIN suseProducts p1 ON pr.product_id = p1.id
      JOIN suseProducts p2 ON pr.root_product_id = p2.id
      JOIN suseSCCRepository r ON pr.repo_id = r.id
    """

    def __init__(self, writer, data_iterator=None):
        BaseDumper.__init__(self, writer, data_iterator=data_iterator)

    def dump_subelement(self, data):
        cf = _SuseProductRepositoryDumper(self._writer, data)
        cf.dump()

class _SCCRepositoryDumper(BaseRowDumper):
    tag_name = 'scc-repository'

    def set_attributes(self):
        return {
            'scc-id' : self._row['sccid'],
            'autorefresh' : self._row['autorefresh'],
            'name' : self._row['name'],
            'distro-target': self._row['distro_target'],
            'description': self._row['description'],
            'url': self._row['url'],
            'signed': self._row['signed'],
            'installer_updates': self._row['installer_updates']
            }

class SCCRepositoryDumper(BaseQueryDumper):
    tag_name = 'scc-repositories'
    iterator_query = """
    SELECT scc_id AS sccid,
           autorefresh, name, distro_target,
           description, url, signed, installer_updates
      FROM suseSCCRepository
    """

    def __init__(self, writer, data_iterator=None):
        BaseDumper.__init__(self, writer, data_iterator=data_iterator)

    def dump_subelement(self, data):
        cf = _SCCRepositoryDumper(self._writer, data)
        cf.dump()

class _SuseSubscriptionDumper(BaseRowDumper):
    tag_name = 'suse-subscription'

    def set_attributes(self):
        return {
            'sub-label'       : self._row['label'],
            'sub-max-members' : self._row['max_members'],
            'sub-system-ent'  : self._row['system_entitlement'],
            }

class SuseSubscriptionDumper(BaseQueryDumper):
    tag_name = 'suse-subscriptions'
    iterator_query = """
        SELECT cf.label, 0 AS max_members, 0 AS system_entitlement
          FROM rhnPrivateChannelFamily pcf
          JOIN rhnChannelFamily cf ON pcf.channel_family_id = cf.id
         WHERE pcf.org_id = 1
         UNION
        SELECT sgt.label, 10 AS max_members, 1 AS system_entitlement
          FROM rhnServerGroup sg
          JOIN rhnServerGroupType sgt ON sg.group_type = sgt.id
         WHERE org_id = 1
    """

    def __init__(self, writer, data_iterator=None):
        BaseDumper.__init__(self, writer, data_iterator=data_iterator)

    def dump_subelement(self, data):
        cf = _SuseSubscriptionDumper(self._writer, data)
        cf.dump()

class _ClonedChannelsDumper(BaseRowDumper):
    tag_name = 'cloned-channel'

    def set_attributes(self):
        return {
            'orig'  : self._row['orig'],
            'clone' : self._row['clone'],
            }

class ClonedChannelsDumper(BaseQueryDumper):
    tag_name = 'cloned-channels'
    iterator_query = """
        SELECT c1.label orig,
               c2.label clone
          FROM rhnChannelCloned cc
          JOIN rhnChannel c1 ON c1.id = cc.original_id
          JOIN rhnChannel c2 ON c2.id = cc.id
    """

    def __init__(self, writer, data_iterator=None):
        BaseDumper.__init__(self, writer, data_iterator=data_iterator)

    def dump_subelement(self, data):
        cf = _ClonedChannelsDumper(self._writer, data)
        cf.dump()

class ChannelFamiliesDumper(BaseQueryDumper):
    tag_name = 'rhn-channel-families'
    iterator_query = 'select cf.* from rhnChannelFamily'

    def __init__(self, writer, data_iterator=None, ignore_subelements=0,
                 null_max_members=1):
        BaseQueryDumper.__init__(self, writer, data_iterator=data_iterator)
        self._ignore_subelements = ignore_subelements
        self._null_max_members = null_max_members

    def dump_subelement(self, data):
        cf = _ChannelFamilyDumper(self._writer, data,
                                  ignore_subelements=self._ignore_subelements,
                                  null_max_members=self._null_max_members)
        cf.dump()


class _ChannelFamilyDumper(BaseRowDumper):
    tag_name = 'rhn-channel-family'

    def __init__(self, writer, row, ignore_subelements=0, null_max_members=1):
        BaseRowDumper.__init__(self, writer, row)
        self._ignore_subelements = ignore_subelements
        self._null_max_members = null_max_members

    def set_iterator(self):
        if self._ignore_subelements:
            return None

        arr = []

        mappings = [
            ('rhn-channel-family-name', 'name'),
            ('rhn-channel-family-product-url', 'product_url'),
        ]
        for k, v in mappings:
            arr.append(SimpleDumper(self._writer, k, self._row.get(v)))

        return ArrayIterator(arr)

    _query_get_channel_family_channels = rhnSQL.Statement("""
        select c.label
          from rhnChannelFamilyMembers cfm, rhnChannel c
         where cfm.channel_family_id = :channel_family_id
           and cfm.channel_id = c.id
    """)

    def set_attributes(self):
        # Get all channels that are part of this channel family
        h = rhnSQL.prepare(self._query_get_channel_family_channels)
        channel_family_id = self._row['id']
        h.execute(channel_family_id=channel_family_id)
        channels = [x['label'] for x in h.fetchall_dict() or []]

        attributes = {
            'id': "rhn-channel-family-%s" % channel_family_id,
            'label': self._row['label'],
            'channel-labels': ' '.join(channels),
        }

        if self._ignore_subelements:
            return attributes
        if self._row['label'] != 'rh-public':
            if self._null_max_members:
                attributes['max-members'] = 0
            elif ('max_members' in self._row) and self._row['max_members']:
                attributes['max-members'] = self._row['max_members']
        return attributes

##


class _PackageDumper(BaseRowDumper):
    tag_name = 'rhn-package'

    def set_attributes(self):
        attrs = ["name", "version", "release", "package_arch",
                 "package_group", "rpm_version", "package_size", "payload_size",
                 "installed_size", "build_host", "source_rpm", "payload_format",
                 "compat"]
        attr_dict = {
            'id': "rhn-package-%s" % self._row['id'],
            'org_id': self._row['org_id'] or "",
            'epoch': self._row['epoch'] or "",
            'cookie': self._row['cookie'] or "",
            'build-time': _dbtime2timestamp(self._row['build_time']),
            'last-modified': _dbtime2timestamp(self._row['last_modified']),
        }
        for attr in attrs:
            attr_dict[attr.replace('_', '-')] = self._row[attr]
        if self._row['checksum_type'] == 'md5':
            # compatibility with older satellite
            attr_dict['md5sum'] = self._row['checksum']
        return attr_dict

    def set_iterator(self):
        arr = []

        mappings = [
            ('rhn-package-summary', 'summary'),
            ('rhn-package-description', 'description'),
            ('rhn-package-vendor', 'vendor'),
            ('rhn-package-copyright', 'copyright'),
            ('rhn-package-header-sig', 'header_sig'),
            ('rhn-package-header-start', 'header_start'),
            ('rhn-package-header-end', 'header_end')
        ]
        for k, v in mappings:
            arr.append(SimpleDumper(self._writer, k, self._row.get(v)))

        # checksums
        checksum_arr = [{'type':  self._row['checksum_type'],
                         'value': self._row['checksum']}]
        arr.append(_ChecksumDumper(self._writer,
                                   data_iterator=ArrayIterator(checksum_arr)))

        h = rhnSQL.prepare("""
            select
                name, text,
                TO_CHAR(time, 'YYYYMMDDHH24MISS') as time
            from rhnPackageChangeLog
            where package_id = :package_id
        """)
        h.execute(package_id=self._row['id'])
        arr.append(_ChangelogDumper(self._writer, data_iterator=h))

        # Dependency information
        mappings = [
            ['rhnPackageRequires',    'rhn-package-requires',    'rhn-package-requires-entry'],
            ['rhnPackageProvides',    'rhn-package-provides',    'rhn-package-provides-entry'],
            ['rhnPackageConflicts',   'rhn-package-conflicts',   'rhn-package-conflicts-entry'],
            ['rhnPackageObsoletes',   'rhn-package-obsoletes',   'rhn-package-obsoletes-entry'],
            ['rhnPackageRecommends',  'rhn-package-recommends',  'rhn-package-recommends-entry'],
            ['rhnPackageSuggests',    'rhn-package-suggests',    'rhn-package-suggests-entry'],
            ['rhnPackageSupplements', 'rhn-package-supplements', 'rhn-package-supplements-entry'],
            ['rhnPackageEnhances',    'rhn-package-enhances',    'rhn-package-enhances-entry'],
            ['rhnPackageBreaks',      'rhn-package-breaks',      'rhn-package-breaks-entry'],
            ['rhnPackagePredepends',  'rhn-package-predepends',  'rhn-package-predepends-entry'],
        ]
        for table_name, container_name, entry_name in mappings:
            h = rhnSQL.prepare("""
                select pc.name, pc.version, pd.sense
                from %s pd, rhnPackageCapability pc
                where pd.capability_id = pc.id
                and pd.package_id = :package_id
            """ % table_name)
            h.execute(package_id=self._row['id'])
            arr.append(_DependencyDumper(self._writer, data_iterator=h,
                                         container_name=container_name,
                                         entry_name=entry_name))

        # Files
        h = rhnSQL.prepare("""
            select
                pc.name, pf.device, pf.inode, pf.file_mode, pf.username,
                pf.groupname, pf.rdev, pf.file_size,
                TO_CHAR(mtime, 'YYYYMMDDHH24MISS') mtime,
                c.checksum_type as "checksum-type",
                c.checksum, pf.linkto, pf.flags, pf.verifyflags, pf.lang
            from rhnPackageFile pf
            left join rhnChecksumView c
              on pf.checksum_id = c.id,
                rhnPackageCapability pc
            where pf.capability_id = pc.id
            and pf.package_id = :package_id
        """)
        h.execute(package_id=self._row['id'])
        arr.append(_PackageFilesDumper(self._writer, data_iterator=h))

        # SUSE Product Files
        h = rhnSQL.prepare("""
            SELECT spf.name, rpe.epoch, rpe.version, rpe.release,
                   rpa.label as arch, spf.vendor, spf.summary,
                   spf.description
              FROM susePackageProductFile sppf
              JOIN suseProductFile spf ON spf.id = sppf.prodfile_id
              JOIN rhnPackageEvr rpe ON rpe.id = spf.evr_id
              JOIN rhnPackageArch rpa ON rpa.id = spf.package_arch_id
             WHERE sppf.package_id = :package_id
        """)
        h.execute(package_id=self._row['id'])
        arr.append(_SuseProductFilesDumper(self._writer, data_iterator=h))

        # SUSE EULAs
        h = rhnSQL.prepare("""
            SELECT se.text, se.checksum
              FROM suseEula se
              JOIN susePackageEula spe ON se.id = spe.eula_id
             WHERE spe.package_id = :package_id
        """)
        h.execute(package_id=self._row['id'])
        arr.append(_SuseEulasDumper(self._writer, data_iterator=h))

        # Debian Extra Tags
        h = rhnSQL.prepare("""
            SELECT k.name, e.value
              FROM rhnPackageExtraTag e
              JOIN rhnPackageExtraTagKey k ON e.key_id = k.id
             WHERE e.package_id = :package_id
        """)
        h.execute(package_id=self._row['id'])
        arr.append(_PkgExtraTagDumper(self._writer, data_iterator=h))

        return ArrayIterator(arr)


class PackagesDumper(BaseSubelementDumper, BaseQueryDumper):
    tag_name = 'rhn-packages'
    subelement_dumper_class = _PackageDumper

    def set_iterator(self):
        return BaseQueryDumper.set_iterator(self)

##


class ShortPackageEntryDumper(BaseChecksumRowDumper):
    tag_name = 'rhn-package-short'

    def set_attributes(self):
        attr = {
            'id': "rhn-package-%s" % self._row['id'],
            'name': self._row['name'],
            'version': self._row['version'],
            'release': self._row['release'],
            'epoch': self._row['epoch'] or "",
            'package-arch': self._row['package_arch'],
            'package-size': self._row['package_size'],
            'last-modified': _dbtime2timestamp(self._row['last_modified']),
            'org-id': self._row['org_id'] or "",
        }
        if self._row['checksum_type'] == 'md5':
            # compatibility with older satellite
            attr['md5sum'] = self._row['checksum']
        return attr


class ShortPackagesDumper(BaseSubelementDumper, BaseQueryDumper):
    tag_name = 'rhn-packages-short'
    subelement_dumper_class = ShortPackageEntryDumper

    def set_iterator(self):
        return BaseQueryDumper.set_iterator(self)

##


class SourcePackagesDumper(BaseQueryDumper):
    tag_name = 'rhn-source-packages'

    def dump_subelement(self, data):
        attributes = {}
        attrs = [
            "id", "source_rpm", "package_group", "rpm_version",
            "payload_size", "build_host", "sigchecksum_type", "sigchecksum", "vendor",
            "cookie", "package_size", "checksum_type", "checksum"
        ]
        for attr in attrs:
            attributes[attr.replace('_', '-')] = data[attr]
        attributes['id'] = "rhn-source-package-%s" % data['id']
        attributes['build-time'] = _dbtime2timestamp(data['build_time'])
        attributes['last-modified'] = _dbtime2timestamp(data['last_modified'])
        d = EmptyDumper(self._writer, 'rhn-source-package',
                        attributes=attributes)
        d.dump()

##


class _ChecksumDumper(BaseDumper):
    tag_name = 'checksums'

    def dump_subelement(self, data):
        c = EmptyDumper(self._writer, 'checksum', attributes={
            'type': data['type'],
            'value': data['value'],
        })
        c.dump()

##


class _ChangelogEntryDumper(BaseRowDumper):
    tag_name = 'rhn-package-changelog-entry'

    def set_iterator(self):
        arr = []
        mappings = [
            ('rhn-package-changelog-entry-name', 'name'),
            ('rhn-package-changelog-entry-text', 'text'),
        ]
        for k, v in mappings:
            arr.append(SimpleDumper(self._writer, k, self._row.get(v)))

        arr.append(SimpleDumper(self._writer, 'rhn-package-changelog-entry-time',
                                _dbtime2timestamp(self._row['time'])))

        return ArrayIterator(arr)


class _ChangelogDumper(BaseSubelementDumper):
    tag_name = 'rhn-package-changelog'
    subelement_dumper_class = _ChangelogEntryDumper

##
class _SuseProductEntryDumper(BaseRowDumper):
    tag_name = 'suse-product-file-entry'

    def set_iterator(self):
        arr = []
        mappings = [
            ('suse-product-file-entry-name', 'name'),
            ('suse-product-file-entry-epoch', 'epoch'),
            ('suse-product-file-entry-version', 'version'),
            ('suse-product-file-entry-release', 'release'),
            ('suse-product-file-entry-arch', 'arch'),
            ('suse-product-file-entry-vendor', 'vendor'),
            ('suse-product-file-entry-summary', 'summary'),
            ('suse-product-file-entry-description', 'description'),
        ]
        for k, v in mappings:
            arr.append(SimpleDumper(self._writer, k, self._row.get(v)))
        return ArrayIterator(arr)

class _SuseProductFilesDumper(BaseSubelementDumper):
    tag_name = 'suse-product-file'
    subelement_dumper_class = _SuseProductEntryDumper

##
class _SuseEulasEntryDumper(BaseRowDumper):
    tag_name = 'suse-eula-entry'

    def set_iterator(self):
        arr = []
        mappings = [
            ('suse-eula-entry-text', 'text'),
            ('suse-eula-entry-checksum', 'checksum'),
        ]
        for k, v in mappings:
            arr.append(SimpleDumper(self._writer, k, self._row.get(v)))
        return ArrayIterator(arr)

class _SuseEulasDumper(BaseSubelementDumper):
    tag_name = 'suse-eula'
    subelement_dumper_class = _SuseEulasEntryDumper

##
class _PkgExtraTagEntryDumper(BaseRowDumper):
    tag_name = 'pkg-extratag-entry'

    def set_iterator(self):
        arr = []
        mappings = [
            ('pkg-extratag-entry-name', 'name'),
            ('pkg-extratag-entry-value', 'value'),
        ]
        for k, v in mappings:
            arr.append(SimpleDumper(self._writer, k, self._row.get(v)))
        return ArrayIterator(arr)

class _PkgExtraTagDumper(BaseSubelementDumper):
    tag_name = 'pkg-extratag'
    subelement_dumper_class = _PkgExtraTagEntryDumper


##
class _DependencyDumper(BaseDumper):

    def __init__(self, writer, data_iterator, container_name, entry_name):
        self.tag_name = container_name
        self.entry_name = entry_name
        BaseDumper.__init__(self, writer, data_iterator=data_iterator)

    def dump_subelement(self, data):
        d = EmptyDumper(self._writer, self.entry_name, attributes={
            'name': data['name'],
            'version': data['version'] or "",
            'sense': data['sense'],
        })
        d.dump()

# Files


class _PackageFilesDumper(BaseDumper):
    tag_name = 'rhn-package-files'

    def dump_subelement(self, data):
        data['mtime'] = _dbtime2timestamp(data['mtime'])
        data['checksum-type'] = data['checksum-type'] or ""
        data['checksum'] = data['checksum'] or ""
        if data['checksum-type'] in ('md5', ''):
            # generate md5="..." attribute
            # for compatibility with older satellites
            data['md5'] = data['checksum']
        data['linkto'] = data['linkto'] or ""
        data['lang'] = data['lang'] or ""
        d = EmptyDumper(self._writer, 'rhn-package-file',
                        attributes=data)
        d.dump()

# Errata


class _ErratumDumper(BaseRowDumper):
    tag_name = 'rhn-erratum'

    def set_attributes(self):
        h = rhnSQL.prepare("""
            select c.label
            from rhnChannelErrata ec, rhnChannel c
            where ec.channel_id = c.id
            and ec.errata_id = :errata_id
        """)
        h.execute(errata_id=self._row['id'])
        channels = [x['label'] for x in h.fetchall_dict() or []]

        h = rhnSQL.prepare("""
            select ep.package_id
            from rhnErrataPackage ep
            where ep.errata_id = :errata_id
        """)
        h.execute(errata_id=self._row['id'])
        packages = ["rhn-package-%s" % x['package_id'] for x in
                    h.fetchall_dict() or []]

        h = rhnSQL.prepare("""
            select c.name cve
            from rhnErrataCVE ec, rhnCVE c
            where ec.errata_id = :errata_id
            and ec.cve_id = c.id
        """)
        h.execute(errata_id=self._row['id'])
        cves = [x['cve'] for x in h.fetchall_dict() or []]

        return {
            'id': 'rhn-erratum-%s' % self._row['id'],
            'org_id': self._row['org_id'] or "",
            'advisory': self._row['advisory'],
            'channels': ' '.join(channels),
            'packages': ' '.join(packages),
            'cve-names': ' '.join(cves),
        }

    type_id_column = ""

    def set_iterator(self):
        arr = []

        mappings = [
            ('rhn-erratum-advisory-name', 'advisory_name', 100),
            ('rhn-erratum-advisory-rel', 'advisory_rel', 32),
            ('rhn-erratum-advisory-type', 'advisory_type', 32),
            ('rhn-erratum-product', 'product', 64),
            ('rhn-erratum-description', 'description', 4000),
            ('rhn-erratum-synopsis', 'synopsis', 4000),
            ('rhn-erratum-topic', 'topic', 4000),
            ('rhn-erratum-solution', 'solution', 4000),
            ('rhn-erratum-refers-to', 'refers_to', 4000),
            ('rhn-erratum-notes', 'notes', 4000),
            ('rhn-erratum-errata-from', 'errata_from', 127),
            ('rhn-erratum-severity', 'severity_id', 127)
        ]
        for k, v, b in mappings:
            value = self._row.get(v) if self._row.get(v) is not None else ""
            arr.append(SimpleDumper(self._writer, k, value, b))
        arr.append(SimpleDumper(self._writer, 'rhn-erratum-issue-date',
                                _dbtime2timestamp(self._row['issue_date'])))
        arr.append(SimpleDumper(self._writer, 'rhn-erratum-update-date',
                                _dbtime2timestamp(self._row['update_date'])))
        arr.append(SimpleDumper(self._writer, 'rhn-erratum-last-modified',
                                _dbtime2timestamp(self._row['last_modified'])))


        h = rhnSQL.prepare("""
            select label
            from rhnErrataSeverity
            where id = :severity_id
        """)
        h.execute(severity_id=self._row['severity_id'])
        sev = h.fetchone_dict() or None
        if sev:
            arr.append(SimpleDumper(self._writer, 'rhn-erratum-severity',
                sev['label']))
        else:
            arr.append(SimpleDumper(self._writer, 'rhn-erratum-severity', ''))

        h = rhnSQL.prepare("""
            select keyword
            from rhnErrataKeyword
            where errata_id = :errata_id
        """)
        h.execute(errata_id=self._row['id'])
        arr.append(_ErratumKeywordDumper(self._writer, data_iterator=h))

        h = rhnSQL.prepare("""
            select bug_id, summary, href
            from rhnErrataBuglist
            where errata_id = :errata_id
        """)
        h.execute(errata_id=self._row['id'])
        arr.append(_ErratumBuglistDumper(self._writer, data_iterator=h))
        _query_errata_file_info = """
             select ef.id errata_file_id, c.checksum_type, c.checksum,
                    ef.filename, eft.label as type,
                    efp.package_id, efps.package_id as source_package_id
               from rhnErrataFile ef left outer join rhnErrataFilePackage efp on ef.id = efp.errata_file_id
                    left outer join rhnErrataFilePackageSource efps on ef.id = efps.errata_file_id,
                    rhnErrataFileType eft, rhnChecksumView c
              where ef.errata_id = :errata_id
                and ef.type = eft.id
                and ef.checksum_id = c.id
                %s
        """
        h = rhnSQL.prepare(_query_errata_file_info % self.type_id_column)
        h.execute(errata_id=self._row['id'])
        arr.append(_ErratumFilesDumper(self._writer, data_iterator=h))

        return ArrayIterator(arr)


class ErrataDumper(BaseSubelementDumper):
    tag_name = 'rhn-errata'
    subelement_dumper_class = _ErratumDumper

    def set_iterator(self):
        if self._iterator:
            return self._iterator
        raise NotImplementedError("To be overridden in a child class")


class _ErratumKeywordDumper(BaseDumper):
    tag_name = 'rhn-erratum-keywords'

    def dump_subelement(self, data):
        d = SimpleDumper(self._writer, 'rhn-erratum-keyword', data['keyword'])
        d.dump()


class _ErratumBugDumper(BaseRowDumper):
    tag_name = 'rhn-erratum-bug'

    def set_iterator(self):
        arr = [
            SimpleDumper(self._writer, 'rhn-erratum-bug-id', self._row['bug_id']),
            SimpleDumper(self._writer, 'rhn-erratum-bug-summary',
                         self._row['summary'] or ""),
            SimpleDumper(self._writer, 'rhn-erratum-bug-href', self._row['href']),
        ]
        return ArrayIterator(arr)


class _ErratumBuglistDumper(BaseSubelementDumper):
    tag_name = 'rhn-erratum-bugs'
    subelement_dumper_class = _ErratumBugDumper


class _ErratumFileEntryDumper(BaseChecksumRowDumper):
    tag_name = 'rhn-erratum-file'

    def set_attributes(self):
        attributes = {
            'filename': self._row['filename'][:4000],
            'type': self._row['type'],
        }
        if self._row['checksum_type'] == 'md5':
            attributes['md5sum'] = self._row['checksum']

        # Compute the channels for this file
        h = rhnSQL.prepare("""
            select c.label
            from rhnErrataFileChannel efc, rhnChannel c
            where efc.errata_file_id = :errata_file_id
            and efc.channel_id = c.id
        """)
        h.execute(errata_file_id=self._row['errata_file_id'])
        channels = ' '.join(
            [x['label'] for x in h.fetchall_dict() or []])
        if channels:
            attributes['channels'] = channels

        # Get the package id or source_package_id
        if self._row['type'] == 'RPM':
            package_id = self._row['package_id']
            if package_id is not None:
                attributes['package'] = 'rhn-package-%s' % package_id
        elif self._row['type'] == 'SRPM':
            package_id = self._row['source_package_id']
            if package_id is not None:
                attributes['source-package'] = 'rhn-package-source-%s' % package_id
        return attributes


class _ErratumFilesDumper(BaseSubelementDumper):
    tag_name = 'rhn-erratum-files'
    subelement_dumper_class = _ErratumFileEntryDumper

# Arches


class BaseArchesDumper(BaseDumper):
    table_name = 'foo'
    subelement_tag = 'foo'

    def set_iterator(self):
        h = rhnSQL.prepare("""
            select id, label, name
            from %s
        """ % self.table_name)
        h.execute()
        return h

    def dump_subelement(self, data):
        attributes = {
            'id': "%s-id-%s" % (self.subelement_tag, data['id']),
            'label': data['label'],
            'name': data['name'],
        }
        EmptyDumper(self._writer, self.subelement_tag, attributes).dump()


class RestrictedArchesDumper(BaseArchesDumper):

    def __init__(self, writer, data_iterator=None, rpm_arch_type_only=0):
        BaseArchesDumper.__init__(self, writer=writer,
                                  data_iterator=data_iterator)
        self.rpm_arch_type_only = rpm_arch_type_only

    def set_iterator(self):
        query_templ = """
            select aa.id, aa.label, aa.name,
                   at.label arch_type_label, at.name arch_type_name
              from %s aa,
                   rhnArchType at
             where aa.arch_type_id = at.id
               %s
        """
        if self.rpm_arch_type_only:
            h = rhnSQL.prepare(query_templ % (self.table_name, "and at.label = 'rpm'"))
        else:
            h = rhnSQL.prepare(query_templ % (self.table_name, ""))
        h.execute()
        return h

    def dump_subelement(self, data):
        attributes = {
            'id': "%s-id-%s" % (self.subelement_tag, data['id']),
            'label': data['label'],
            'name': data['name'],
            'arch-type-label': data['arch_type_label'],
            'arch-type-name': data['arch_type_name'],
        }
        EmptyDumper(self._writer, self.subelement_tag, attributes).dump()


class ChannelArchesDumper(RestrictedArchesDumper):
    tag_name = 'rhn-channel-arches'
    subelement_tag = 'rhn-channel-arch'
    table_name = 'rhnChannelArch'


class PackageArchesDumper(RestrictedArchesDumper):
    tag_name = 'rhn-package-arches'
    subelement_tag = 'rhn-package-arch'
    table_name = 'rhnPackageArch'


class ServerArchesDumper(RestrictedArchesDumper):
    tag_name = 'rhn-server-arches'
    subelement_tag = 'rhn-server-arch'
    table_name = 'rhnServerArch'


class CPUArchesDumper(BaseArchesDumper):
    tag_name = 'rhn-cpu-arches'
    subelement_tag = 'rhn-cpu-arch'
    table_name = 'rhnCPUArch'


class RestrictedArchCompatDumper(BaseArchesDumper):
    _query_rpm_arch_type_only = ""
    _query_arch_type_all = ""
    _subelement_tag = ""

    def __init__(self, writer, data_iterator=None, rpm_arch_type_only=0, virt_filter=0):
        BaseArchesDumper.__init__(self, writer=writer,
                                  data_iterator=data_iterator)
        self.rpm_arch_type_only = rpm_arch_type_only
        self.virt_filter = virt_filter

    def set_iterator(self):
        _virt_filter_sql = ""
        if self.virt_filter:
            _virt_filter_sql = """and sgt.label not like 'virt%'"""

        if self._subelement_tag == 'rhn-server-group-server-arch-compat':
            if self.rpm_arch_type_only:
                h = rhnSQL.prepare(self._query_rpm_arch_type_only % _virt_filter_sql)
            else:
                h = rhnSQL.prepare(self._query_arch_type_all % _virt_filter_sql)
        else:
            if self.rpm_arch_type_only:
                h = rhnSQL.prepare(self._query_rpm_arch_type_only)
            else:
                h = rhnSQL.prepare(self._query_arch_type_all)

        h.execute()
        return h

    def dump_subelement(self, data):
        EmptyDumper(self._writer, self._subelement_tag, data).dump()


class ServerPackageArchCompatDumper(RestrictedArchCompatDumper):
    tag_name = 'rhn-server-package-arch-compatibility-map'
    _subelement_tag = 'rhn-server-package-arch-compat'

    _query_rpm_arch_type_only = rhnSQL.Statement("""
        select sa.label "server-arch",
            pa.label "package-arch",
            spac.preference
        from rhnServerPackageArchCompat spac,
            rhnServerArch sa,
            rhnPackageArch pa,
            rhnArchType aas,
            rhnArchType aap
        where spac.server_arch_id = sa.id
        and spac.package_arch_id = pa.id
        and sa.arch_type_id = aas.id
        and aas.label = 'rpm'
        and pa.arch_type_id = aap.id
        and aap.label = 'rpm'
    """)

    _query_arch_type_all = rhnSQL.Statement("""
        select sa.label "server-arch",
            pa.label "package-arch",
            spac.preference
        from rhnServerPackageArchCompat spac,
            rhnServerArch sa,
            rhnPackageArch pa
        where spac.server_arch_id = sa.id
        and spac.package_arch_id = pa.id
    """)


class ServerChannelArchCompatDumper(RestrictedArchCompatDumper):
    tag_name = 'rhn-server-channel-arch-compatibility-map'
    _subelement_tag = 'rhn-server-channel-arch-compat'

    _query_rpm_arch_type_only = rhnSQL.Statement("""
        select sa.label "server-arch",
               ca.label "channel-arch"
          from rhnServerChannelArchCompat scac,
               rhnServerArch sa,
               rhnChannelArch ca,
               rhnArchType aas,
               rhnArchType aac
         where scac.server_arch_id = sa.id
           and scac.channel_arch_id = ca.id
           and sa.arch_type_id = aas.id
           and aas.label = 'rpm'
           and ca.arch_type_id = aac.id
           and aac.label = 'rpm'
    """)

    _query_arch_type_all = rhnSQL.Statement("""
        select sa.label "server-arch",
               ca.label "channel-arch"
          from rhnServerChannelArchCompat scac,
               rhnServerArch sa,
               rhnChannelArch ca
         where scac.server_arch_id = sa.id
           and scac.channel_arch_id = ca.id
    """)


class ChannelPackageArchCompatDumper(RestrictedArchCompatDumper):
    tag_name = 'rhn-channel-package-arch-compatibility-map'
    _subelement_tag = 'rhn-channel-package-arch-compat'

    _query_rpm_arch_type_only = rhnSQL.Statement("""
        select ca.label "channel-arch",
               pa.label "package-arch"
          from rhnChannelPackageArchCompat cpac,
               rhnChannelArch ca,
               rhnPackageArch pa,
               rhnArchType aac,
               rhnArchType aap
         where cpac.channel_arch_id = ca.id
           and cpac.package_arch_id = pa.id
           and ca.arch_type_id = aac.id
           and aac.label = 'rpm'
           and pa.arch_type_id = aap.id
           and aap.label = 'rpm'
    """)

    _query_arch_type_all = rhnSQL.Statement("""
        select ca.label "channel-arch",
               pa.label "package-arch"
          from rhnChannelPackageArchCompat cpac,
               rhnChannelArch ca,
               rhnPackageArch pa
         where cpac.channel_arch_id = ca.id
           and cpac.package_arch_id = pa.id
    """)


class ServerGroupTypeServerArchCompatDumper(RestrictedArchCompatDumper):
    tag_name = 'rhn-server-group-server-arch-compatibility-map'
    _subelement_tag = 'rhn-server-group-server-arch-compat'

    _query_rpm_arch_type_only = """
        select sgt.label "server-group-type",
               sa.label "server-arch"
          from rhnServerGroupType sgt,
               rhnServerArch sa,
               rhnArchType aas,
               rhnServerServerGroupArchCompat ssgac
         where ssgac.server_arch_id = sa.id
           and sa.arch_type_id = aas.id
           and aas.label = 'rpm'
           and ssgac.server_group_type = sgt.id
           %s
    """

    #_query_arch_type_all = rhnSQL.Statement("""
    _query_arch_type_all = """
        select sgt.label "server-group-type",
               sa.label "server-arch"
          from rhnServerGroupType sgt,
               rhnServerArch sa,
               rhnServerServerGroupArchCompat ssgac
         where ssgac.server_arch_id = sa.id
           and ssgac.server_group_type = sgt.id
           %s
    """


class BlacklistObsoletesDumper(BaseDumper):
    tag_name = 'rhn-blacklist-obsoletes'

    def dump(self):
        note = """\n<!-- This file is intentionally left empty.
     Older Satellites and Spacewalks require this file to exist in the dump. -->\n"""
        self._writer.stream.write(note)
        self._writer.empty_tag(self.tag_name)


class _KickstartableTreeDumper(BaseRowDumper):
    tag_name = 'rhn-kickstartable-tree'

    def set_attributes(self):
        row_dict = self._row.copy()
        del row_dict['id']
        last_modified = row_dict['last-modified']
        row_dict['last-modified'] = _dbtime2timestamp(last_modified)
        return row_dict

    def set_iterator(self):
        kstree_id = self._row['id']
        h = rhnSQL.prepare("""
            select relative_filename,
                   c.checksum_type,
                   c.checksum,
                   file_size,
                    TO_CHAR(last_modified, 'YYYYMMDDHH24MISS') "last-modified"
              from rhnKSTreeFile, rhnChecksumView c
             where kstree_id = :kstree_id
               and checksum_id = c.id
        """)
        h.execute(kstree_id=kstree_id)
        return ArrayIterator([_KickstartFilesDumper(self._writer, h)])


class KickstartableTreesDumper(BaseSubelementDumper, BaseQueryDumper):
    tag_name = 'rhn-kickstartable-trees'
    subelement_dumper_class = _KickstartableTreeDumper
    iterator_query = """
            select kt.id,
                   c.label channel,
                   kt.base_path "base-path",
                   kt.label,
                   kt.boot_image "boot-image",
                   ktt.name "kstree-type-name",
                   ktt.label "kstree-type-label",
                   kit.name "install-type-name",
                   kit.label "install-type-label",
                   TO_CHAR(kt.last_modified, 'YYYYMMDDHH24MISS') "last-modified"
              from rhnKickstartableTree kt,
                   rhnKSTreeType ktt,
                   rhnKSInstallType kit,
                   rhnChannel c
             where kt.channel_id = c.id
               and ktt.id = kt.kstree_type
               and kit.id = kt.install_type
               and kt.org_id is NULL
        """

    def set_iterator(self):
        return BaseQueryDumper.set_iterator(self)


class _KickstartFileEntryDumper(BaseChecksumRowDumper):
    tag_name = 'rhn-kickstart-file'

    def set_attributes(self):
        attr = {
            'relative-path': self._row['relative_filename'],
            'file-size': self._row['file_size'],
            'last-modified': _dbtime2timestamp(self._row['last-modified']),
        }
        if self._row['checksum_type'] == 'md5':
            attr['md5sum'] = self._row['checksum']
        return attr


class _KickstartFilesDumper(BaseSubelementDumper):
    tag_name = 'rhn-kickstart-files'
    subelement_dumper_class = _KickstartFileEntryDumper


def _dbtime2timestamp(val):
    return int(rhnLib.timestamp(val))


class ProductNamesDumper(BaseDumper):
    tag_name = "rhn-product-names"

    def dump_subelement(self, data):
        EmptyDumper(self._writer, 'rhn-product-name', data).dump()
070701000000D2000081B40000000000000000000000015FBBE8EE0000122D000000000000000000000000000000000000003800000000spacewalk-backend/satellite_tools/exporter/xmlWriter.py   # -*- coding: ISO-8859-1 -*-
#
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# UTF-8 aware XML writer
#

import re
import sys


class XMLWriter:

    """
    XML writer, UTF-8 aware
    """

    # We escape &<>'" and chars UTF-8 does not properly escape (everything
    # other than tab (\x09), newline and carriage return (\x0a and \x0d),
    # stuff above ASCII 32 and UTF-8 alphanumeric chars in any language)
    _re = re.compile("(&|<|>|'|\"|[^\x09\x0a\x0d\x20-\xFF\w])")
    _escaped_chars = {
        '&': '&amp;',
        '<': '&lt;',
        '>': '&gt;',
        '"': '&quot;',
        "'": '&apos;',
    }

    def __init__(self, stream=sys.stdout, skip_xml_decl=0):
        self.tag_stack = []
        self.stream = stream
        if not skip_xml_decl:
            self.stream.write('<?xml version="1.0" encoding="UTF-8"?>')

    def open_tag(self, name, attributes=None, namespace=None):
        "Opens a tag with the specified attributes"
        return self._open_tag(None, name, attributes=attributes,
                              namespace=namespace)

    def empty_tag(self, name, attributes=None, namespace=None):
        "Writes an empty tag with the specified attributes"
        return self._open_tag(1, name, attributes=attributes,
                              namespace=namespace)

    # Now the function that does most of the work for open_tag and empty_tag
    def _open_tag(self, empty, name, attributes=None, namespace=None):
        if namespace:
            name = "%s:%s" % (namespace, name)
        self.stream.write("<")
        self.data(name)
        # Dump the attributes, if any
        if attributes:
            for k, v in list(attributes.items()):
                self.stream.write(" ")
                self.data(k)
                self.stream.write('="')
                self.data(str(v))
                self.stream.write('"')
        if empty:
            self.stream.write("/")
        self.stream.write(">")

        if not empty:
            self.tag_stack.append(name)

    def close_tag(self, name, namespace=None):
        """
        Closes a previously open tag.
        This function raises an exception if the tag was not opened before, or
        if it's been closed already.
        """
        if not self.tag_stack:
            raise Exception("Could not close tag %s: empty tag stack" % name)
        if namespace:
            name = "%s:%s" % (namespace, name)

        if self.tag_stack[-1] != name:
            raise Exception("Could not close tag %s if not opened before" \
                % name)
        self.tag_stack.pop()

        self.stream.write("</")
        self.data(name)
        self.stream.write(">")

    def data(self, data_string):
        """
        Writes the data, performing the necessary UTF-8 conversions
        max_bytes is the satellite schema dependent maximum value (in bytes)
        which can fit in the matching table row. Yeah, this is very gross.
        """
        if data_string is None:
            data_string = ""
        else:
            data_string = str(data_string)

        data_string = self._re.sub(self._sub_function, data_string)
        self.stream.write(data_string)

    # Helper functions

    # Substitution function for re
    def _sub_function(self, match_object):
        c = match_object.group()
        if c in self._escaped_chars:
            return self._escaped_chars[c]
        # return "&#%d;" % ord(c)
        return '?'

    def flush(self):
        self.stream.flush()

if __name__ == '__main__':
    weirdtag = chr(248) + 'gootag'
    writer = XMLWriter()
    writer.open_tag(weirdtag)
    writer.open_tag("message")
    writer.open_tag("text", attributes={'from': 'Trond Eivind Glomsrød', 'to': "Bernhard Rosenkr)Bänzer"})
    writer.data("String with \"quotes\", 'apostroph', Trond Eivind Glomsrød\n  and Bernhard Rosenkr)Bänzer")
    r = re.compile("(&|<|>|'|\"|[^\x09\x0a\x0d\x20-\xFF])")
    writer.close_tag("text")
    writer.close_tag("message")
    writer.empty_tag("yahoo", attributes={'abc': 1})
    writer.close_tag(weirdtag)
    print("")
   070701000000D3000081B40000000000000000000000015FBBE8EE00001E39000000000000000000000000000000000000002C00000000spacewalk-backend/satellite_tools/geniso.py   #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

import os
import sys
import tempfile
import time
from stat import ST_SIZE
from optparse import Option, OptionParser
from spacewalk.common.rhnConfig import PRODUCT_NAME

MOUNT_POINT = '/tmp'
IMAGE_SIZE = "630M"
DVD_IMAGE_SIZE = "4380M"


def main(arglist):
    optionsTable = [
        Option('-m', '--mountpoint',    action='store',
               help="mount point"),
        Option('-s', '--size',          action='store',
               help="image size (eg. 630M)"),
        Option('-p', '--file-prefix',   action='store',
               help='Filename prefix'),
        Option('-o', '--output',        action='store',
               help='output directory'),
        Option('-v', '--version',       action='store',
               help='version string'),
        Option('-r', '--release',       action='store',
               help='release string'),
        Option('--copy-iso-dir',        action='store',
               help='directory to copy the isos to after they have been generated.'),
        Option('-t', '--type',          action='store',
               help='the type of iso being generated.\
                  this flag is optional, but can be set to spanning, non-spanning, or base.'),
    ]
    parser = OptionParser(option_list=optionsTable)
    options, _args = parser.parse_args(arglist)

    # Check to see if mkisofs is installed
    if not os.path.exists('/usr/bin/mkisofs'):
        print(("ERROR:: mkisofs is not Installed. Cannot Proceed iso build. " \
              + "Please install mkisofs and rerun this command."))
        return

    mountPoint = options.mountpoint or MOUNT_POINT
    if options.type == "dvd":
        print("Building  DVD Iso ...")
        sizeStr = options.size or DVD_IMAGE_SIZE
    else:
        sizeStr = options.size or IMAGE_SIZE
    imageSize = sizeStrToInt(sizeStr)
    if imageSize == 0:
        print(("Unknown size %s" % sizeStr))
        return

    if options.version is None:
        options.version = time.strftime("%Y%m%d", time.gmtime(time.time()))

    if options.release is None:
        options.release = '0'

    if options.output is None:
        options.output = "/tmp/satellite-isos"

    file_prefix = options.file_prefix or "rhn-satellite"
    if not os.path.isdir(options.output):
        os.makedirs(options.output)

    # Get rid of the extra files in that directory
    for f in os.listdir(options.output):
        os.unlink(os.path.join(options.output, f))

    # Normalize the directory name
    mountPoint = os.path.normpath(mountPoint)

    # Generate the listings for each CD
    files = findFiles(mountPoint)
    cds = []
    while files:
        cd = []
        sz = 0
        while files:
            filePath, fileSize = files[0]
            if sz + fileSize > imageSize:
                # Overflow
                break

            cd.append(filePath)
            sz = sz + fileSize
            # Advance to the next record
            del files[0]
        cds.append(cd)

    # We now have the CD contents available; generate the ISOs
    cdcount = len(cds)

    # Create an empty temp file
    fd, empty_file_path = tempfile.mkstemp(dir='/tmp', prefix='empty.file-')
    os.close(fd)

    # command-line template
    mkisofsTemplate = "mkisofs -r -J -D -file-mode 0444 -new-dir-mode 0555 -dir-mode 0555 " \
        + "-graft-points %s -o %s /DISK_%s_OF_%s=%s"
    for i in range(cdcount):
        print(("---------- %s/%s" % (i + 1, cdcount)))

        # if options.type is None:
        filename = "%s/%s-%s.%s-%02d.iso" % (options.output, file_prefix,
                                             options.version, options.release, i + 1)
        # else:
        #    filename = "%s/%s-%s-%s.%s-%02d.iso" % (options.output, file_prefix,
        #        options.type, options.version, options.release, i+1)

        # Create a temp file to store the path specs
        pathfiles_fd, pathfiles = tempfile.mkstemp(dir='/tmp', prefix='geniso-')

        # Command-line options; the keys are supposed to start with a dash
        opts = {
            'preparer': PRODUCT_NAME,
            'publisher': PRODUCT_NAME,
            'volid': "SM_%s/%s" % (i + 1, cdcount),
            'path-list': pathfiles,
        }
        opts = ['-%s "%s"' % x for x in list(opts.items())]

        # Generate the file list that will go into the CD
        # See the man page for mkisofs to better understand how graft points
        # work (although the man page is not great)
        grafts = []
        for f in cds[i]:
            # Compute the relative path
            relpath = os.path.relpath(f, mountPoint)
            # Append to the graft list: relative=real
            relpath = os.path.dirname(relpath)
            grafts.append("%s/=%s" % (relpath, f))

        # Generate the command line
        cmd = mkisofsTemplate % (' '.join(opts), filename, i + 1, cdcount,
                                 empty_file_path)

        # Write the path specs in pathfiles
        for graft in grafts:
            os.write(pathfiles_fd, graft)
            os.write(pathfiles_fd, "\n")
        os.close(pathfiles_fd)

        print(("Creating %s" % filename))
        # And run it
        fd = os.popen(cmd, "r")
        print((fd.read()))

        if options.copy_iso_dir is not None:
            copy_iso_path = os.path.join(options.copy_iso_dir, os.path.basename(os.path.dirname(filename)))
            if not os.path.exists(copy_iso_path):
                os.mkdir(copy_iso_path)
            fd = os.popen("mv %s %s" % (filename, copy_iso_path), "r")
            print((fd.read()))
            fd = os.popen("rm %s" % filename)
            print((fd.read()))

        # Remove the temp file
        os.unlink(pathfiles)

    # Remove the file we used to label the CDs
    os.unlink(empty_file_path)


def sizeStrToInt(s):
    # Converts s to an int
    if s is None or s == "":
        # Don't know how to interpret it
        return 0

    s = str(s)
    # Strip the dashes in front - we don't want the number to be negative
    while s and s[0] == '-':
        s = s[1:]

    try:
        return int(s)
    except ValueError:
        # not an int
        pass

    if s[-1] in ('k', 'K', 'm', 'M'):
        # Specified a multiplier
        if s[-1].lower() == 'k':
            mult = 1024
        else:
            mult = 1024 * 1024

        try:
            return mult * int(s[:-1])
        except ValueError:
            pass

    # Don't know how to interpret it
    return 0

# The visitfunc argument for os.path.walk


def __visitfunc(arg, dirname, names):
    for f in names:
        filename = os.path.normpath("%s/%s" % (dirname, f))
        if os.path.isdir(filename):
            # walk will process it later
            continue
        # Get the size
        sz = os.stat(filename)[ST_SIZE]
        # Append the filename and size to the list
        arg.append((filename, sz))

# Given a directory name, returns the paths of all the files from that
# directory, together with the file size


def findFiles(start):
    a = []
    os.path.walk(start, __visitfunc, a)
    return a


if __name__ == '__main__':
    main(sys.argv)
   070701000000D4000081B40000000000000000000000015FBBE8EE00000DA1000000000000000000000000000000000000002E00000000spacewalk-backend/satellite_tools/messages.py #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
""" Spacewalk Synchronization Tool Messages

    Copyright (c) 2002--2015 Red Hat, Inc.
    All rights reserved.
"""

import gettext
t = gettext.translation('spacewalk-backend-server', fallback=True)
_ = t.gettext

failed_step = _("""
ERROR: executing step %s. Error is:
%s
""")

file_dir_error = _("""
ERROR: there was a problem accessing the channel data from your temporary
       repository. Did you migrate all of the data from the channel ISOs
       do this directory? If so, please recheck the channels ISOs, ensure
       that you have them all, and then iteratively remount and repopulate
       the temporary repository (%s).
""")

syncer_error = _("""
ERROR: there was a problem synchronizing the information.
       Error message: %s
""")

sw_iss_not_available = _("""
ERROR: There was a problem communicating with the ISS Master.
       Depending on the specific error details, please review your configuration,
       basic network connectivity, and/or name resolution, and try again.
       Error message: %s
""")

parent_channel_error = _("""
ERROR: a child-channel cannot be synced without its parent being synced as
       well. A parent needs to be either (a) previously synced or (b) synced
       in tandem with the desired child-channel. Missing parents for this
       transaction:
       %s
""")

invalid_channel_family_error = _("""
ERROR: you are not entitled to sync a channel in this set of channels.
Please contact your SUSE Manager contact
%s""")

not_enough_diskspace = _("  ERROR: not enough free space (%s KB) on device.")

package_fetch_successful = _("    %3d/%s Fetch successful: %s (%s bytes)")
package_fetch_extinct = _("    Extinct package:  %s")
package_fetch_total_size = _("   Total size: %s")
package_fetch_remain_size_time = _("      Downloaded %s of %s. Estimated remaining time: %s")
package_fetch_failed = _("    Fetch unsuccessful: %s")
package_fetch_summary = _("   RPM fetch summary: %s")
package_fetch_summary_success = _("       success: %d")
package_fetch_summary_failed = _("       failed:  %d")
package_fetch_summary_extinct = _("       extinct: %d")

package_parsing = _("   Retrieving / parsing *relevant* package metadata: %s (%s)")
erratum_parsing = _("   Retrieving / parsing errata data: %s (%s)")
kickstart_parsing = _("   Retrieving / parsing kickstart data: %s (%s)")
kickstart_downloading = _("   Retrieving / parsing kickstart tree files: %s (%s)")
package_importing = _("   Importing *relevant* package metadata: %s (%s)")
warning_slow = _("   * WARNING: this may be a slow process.")
link_channel_packages = _("Linking packages to channels")
errata_importing = _("   Importing *relevant* errata: %s (%s)")
kickstart_import_nothing_to_do = _("   No new kickstartable tree to import")
kickstart_importing = _("Importing kickstartable trees (%d)")
kickstart_imported = _("Imported kickstartable trees (%d)")
   070701000000D5000081B40000000000000000000000015FBBE8EE000004BD000000000000000000000000000000000000003400000000spacewalk-backend/satellite_tools/mgr-sign-metadata   #! /bin/bash

set -e

FILETOSIGN=$1
[ -z $2 ] && SIGFILE="$FILETOSIGN.asc" || SIGFILE="$2"
[ ! -z "$3" ] && CLRSIGNEDFILE="$3"

if [ -z "$FILETOSIGN" -o ! -r "$FILETOSIGN" ]; then
    echo "No file to sign provided" >&2
    exit 1
fi

if [ ! -r /etc/rhn/signing.conf ]; then
    echo "No config file found: /etc/rhn/signing.conf" >&2
    exit 1
fi

source /etc/rhn/signing.conf

if [ -z "$KEYID" ]; then
    echo "Unable to find GPG KEYID in config" >&2
    exit 1
fi

if [ -z "$GPGPASS" ]; then
    echo "Unable to find GPG PASSWORD in config" >&2
    exit 1
fi

KEYFILE="$FILETOSIGN.key"

# Debian systems require the hashing algorithm to be at least SHA256
if [ ! -z "$DIGESTPREF" ]; then
  DIGESTOPT="--personal-digest-preferences $DIGESTPREF"
else
  DIGESTOPT="--personal-digest-preferences SHA256"
fi

rm -f $SIGFILE
echo "$GPGPASS" | gpg -sab --batch -u $KEYID --passphrase-fd 0 --pinentry-mode loopback $DIGESTOPT -o $SIGFILE $FILETOSIGN

rm -f $KEYFILE
gpg --batch --export -a -o $KEYFILE $KEYID

if [ ! -z "$CLRSIGNEDFILE" ]; then
  rm -f $CLRSIGNEDFILE
  echo "$GPGPASS" | gpg --batch -u $KEYID --passphrase-fd 0 --pinentry-mode loopback $DIGESTOPT --clearsign -o $CLRSIGNEDFILE $FILETOSIGN
fi

exit 0
   070701000000D6000081B40000000000000000000000015FBBE8EE000029AB000000000000000000000000000000000000003800000000spacewalk-backend/satellite_tools/mgr-sign-metadata-ctl   #!/bin/bash

set -e

function usage {
    echo "Usage: mgr-sign-metadata-ctl [enable <keyid> | disable | check-config | check-channels]"
    echo "  enable KEYID     Enable GPG signing of repository metadata using the provided KEYID."
    echo "                   Requires a valid key with the given KEYID to exist in the default keyring."
    echo "  disable          Disable GPG signing of repository metadata."
    echo "  check-channels   Check if the cached channels repodata is signed."
    echo "  check-config     Check configuration and report any problems. This is the default option."
    echo "  regen-metadata   Restart services and schedule metadata regeneration."
}

function check_key_in_keyring {
    if gpg --list-keys | grep --quiet -F "$1"; then
        echo "OK. Found key $1 in keyring."
    else
        echo "ERROR. Key $1 not found in keyring. Generate or import a key pair and then rerun this command."
        exit 2
    fi
}

function regenerate_metadata {
    echo -n "Restarting Tomcat..."
    systemctl restart tomcat
    echo "done."
    echo -n "Restarting Taskomatic..."
    systemctl restart taskomatic
    echo "done."
    echo
    echo "Scheduling repo metadata regeneration..."
    read_spacecmd_user_pass
    spacecmd -q -u $SPACECMD_USER -p $SPACECMD_PASS "softwarechannel_regenerateyumcache -f *"
    RETVAL=$?
    if [ $RETVAL -ne 0 ]; then
        echo "\nERROR queuing repo metadata regeneration. Try executing manually: spacecmd softwarechannel_regenerateyumcache \"*\""
        exit 1
    fi
    echo "done."
}

function changed_repo_signing {
    read -p "Restarting the services and regenerating the metadata is required. Proceed now (y/N)? " -n 1 -r
    echo
    if [[ $REPLY =~ ^[Yy]$ ]]; then
        regenerate_metadata
    else
        echo -e "\nYou can restart the services and regenerate the metadata later by executing:\n    mgr-sign-metadata-ctl regen-metadata"
    fi

    echo
    echo "WARNING: When the metadata regeneration has finished refresh the repo config on all registered machines."
    echo "To check if all channels have signed metadata: mgr-signed-metadata-ctl check-channels"
}

function is_signing_enabled {
    grep --quiet "^sign_metadata.*=.*1\s*$" $RHN_CONF
}

function read_spacecmd_user_pass {
    if [[ -z "$SPACECMD_USER" || -z "$SPACECMD_PASS" ]];then
        echo -n "Server User: ";
        read SPACECMD_USER
        echo -n "Server Password: ";
        read -s SPACECMD_PASS
    fi
    echo
}


ACTION="check-config"
ENABLE_KEYID=""

if [ -n "$1" ]; then
    if [[ "$1" = "enable" ]]; then
        ACTION="$1"
        if [[ -z "$2" ]]; then
           usage
           exit 1
        else
           ENABLE_KEYID="$2"
        fi
    elif [[ "$1" = "disable" || "$1" = "check-config" || "$1" = "check-channels" || "$1" = "regen-metadata" ]]; then
        ACTION="$1"
    elif [[ "$1" = "help" || "$1" = "-h" ]]; then
        usage
        exit 0
    else
        usage
        exit 1
    fi
fi

RHN_CONF="/etc/rhn/rhn.conf"
GPG_SALT_EXPORT_FILE="/srv/susemanager/salt/gpg/mgr-keyring.gpg"
GPG_PUB_EXPORT_FILE="/srv/www/htdocs/pub/mgr-gpg-pub.key"
SIGNING_CONF="/etc/rhn/signing.conf"

if [[ ! -f $SIGNING_CONF ]]; then
    echo "Error. File ${SIGNING_CONF} is missing."
    exit 1
fi

source $SIGNING_CONF

if [[  $ACTION = "enable" ]]; then
    # check if the KEYID exists in the keyring
    check_key_in_keyring "$ENABLE_KEYID"

    # make sure KEYID exists in singing.conf
    if grep --quiet "^KEYID=\"${ENABLE_KEYID}\"" $SIGNING_CONF; then
        echo "OK. Key ${ENABLE_KEYID} is set in ${SIGNING_CONF}."
    elif grep --quiet "^KEYID=\".*\"" $SIGNING_CONF; then
        sed -i "s/KEYID=\".*\"\s*$/KEYID=\"${ENABLE_KEYID}\"/g" $SIGNING_CONF
        echo "DONE. Set key ${ENABLE_KEYID} in ${SIGNING_CONF}."
    else
        echo "KEYID=\"${ENABLE_KEYID}\"" >> $SIGNING_CONF
        echo "DONE. Set key ${ENABLE_KEYID} in ${SIGNING_CONF}."
    fi

    # make sure sign_metadata=1 in rhn.conf
    if grep --quiet "^sign_metadata.*=.*0\s*$" $RHN_CONF; then
        # edit rhn.conf to enable signing
        sed -i 's/sign_metadata.*=.*$/sign_metadata = 1/g' $RHN_CONF
        echo "DONE. Enabled metadata signing in ${RHN_CONF}."

    elif grep --quiet "^sign_metadata.*=.*1" $RHN_CONF; then
        echo "OK. Metadata signing is enabled in ${RHN_CONF}."
    else
        # add line to rhn.conf
        echo "sign_metadata = 1" >> $RHN_CONF
        echo "DONE. Enabled metadata signing in ${RHN_CONF}."
    fi

    # check if key was exported to the salt dir
    EXPORT_SALT_KEY=true
    if [ -f $GPG_SALT_EXPORT_FILE ]; then
        if gpg --no-default-keyring --keyring $GPG_SALT_EXPORT_FILE --list-keys | grep --quiet "$ENABLE_KEYID"; then
            echo "OK. Key ${ENABLE_KEYID} was exported to ${GPG_SALT_EXPORT_FILE}."
            EXPORT_SALT_KEY=false
        fi
    fi
    if [ "$EXPORT_SALT_KEY" = true ]; then
        rm -f $GPG_SALT_EXPORT_FILE
        GPG_SALT_EXPORT_DIR=$(dirname $GPG_SALT_EXPORT_FILE)
        mkdir -p $GPG_SALT_EXPORT_DIR
        chown salt:salt $GPG_SALT_EXPORT_DIR
        chmod 775 $GPG_SALT_EXPORT_DIR
        gpg --export $ENABLE_KEYID > $GPG_SALT_EXPORT_FILE
        chmod 644 $GPG_SALT_EXPORT_FILE
        echo "DONE. Exported key ${ENABLE_KEYID} to ${GPG_SALT_EXPORT_FILE}."
    fi

    # check if key was exported to the http pub dir
    EXPORT_WWW_PUB_KEY=true
    if [ -f $GPG_PUB_EXPORT_FILE ]; then
        if cat $GPG_PUB_EXPORT_FILE | gpg -q --with-colons --import-options show-only --import | grep --quiet $ENABLE_KEYID; then
            echo "OK. Key ${ENABLE_KEYID} was exported to ${GPG_PUB_EXPORT_FILE}."
            EXPORT_WWW_PUB_KEY=false
        fi
    fi
    if [ "$EXPORT_WWW_PUB_KEY" = true ]; then
        rm -f $GPG_PUB_EXPORT_FILE
        gpg --batch --export --armor --output $GPG_PUB_EXPORT_FILE $ENABLE_KEYID
        chmod 644 $GPG_PUB_EXPORT_FILE
        echo "DONE. Exported key ${ENABLE_KEYID} to ${GPG_PUB_EXPORT_FILE}."
    fi

elif [[  $ACTION = "check-config" ]]; then
    # check sign_metadata in rhn.conf
    if is_signing_enabled; then
        echo "Metadata signing is enabled in ${RHN_CONF}."
        echo

        # check KEYID set in signing.conf
        if [[ -z "$KEYID" ]]; then
            echo "ERROR. No KEYID set in ${SIGNING_CONF}."
        else
            echo "OK. KEYID is set in ${SIGNING_CONF}."
            check_key_in_keyring "$KEYID"
        fi

        if [[ -z "$GPGPASS" ]]; then
            echo "ERROR. No GPGPASS set in ${SIGNING_CONF}."
        fi

        # check pub key export file
        if [ -f $GPG_SALT_EXPORT_FILE ]; then
            if gpg --no-default-keyring --keyring $GPG_SALT_EXPORT_FILE --list-keys | grep --quiet $KEYID; then
                echo "OK. Key ${KEYID} was exported to ${GPG_SALT_EXPORT_FILE}."
            else
                echo "ERROR. Public key file ${GPG_SALT_EXPORT_FILE} exists but it doesn't contain key ${KEYID}."
            fi
        else
            echo "ERROR. Public key file $GPG_SALT_EXPORT_FILE is missing."
        fi

        if [ -f $GPG_PUB_EXPORT_FILE ]; then
            if cat $GPG_PUB_EXPORT_FILE | gpg -q --with-colons --import-options show-only --import | grep --quiet $KEYID; then
                echo "OK. Key ${KEYID} was exported to ${GPG_PUB_EXPORT_FILE}."
            else
                echo "ERROR. Public key file ${GPG_PUB_EXPORT_FILE} exists but it doesn't contain key ${KEYID}."
            fi
        else
            echo "ERROR. Public key file $GPG_PUB_EXPORT_FILE is missing."
        fi

    else
        echo "Metadata signing is disabled in ${RHN_CONF}."

        # check KEYID set in signing.conf
        if [[ -z "$KEYID" ]]; then
            echo "OK. No KEYID set in ${SIGNING_CONF}."
        else
            echo "WARNING. KEYID is set in ${SIGNING_CONF}."
        fi

        # check salt key export file
        if [ -f $GPG_SALT_EXPORT_FILE ]; then
            echo "WARNING. Key export file ${GPG_SALT_EXPORT_FILE} is present."
        else
            echo "OK. Key file ${GPG_SALT_EXPORT_FILE} is not present."
        fi

        # check http pub key export file
        if [ -f $GPG_PUB_EXPORT_FILE ]; then
            echo "WARNING. Key export file ${GPG_PUB_EXPORT_FILE} is present."
        else
            echo "OK. Key file ${GPG_PUB_EXPORT_FILE} is not present."
        fi
    fi

elif [[  $ACTION = "disable" ]]; then
    if grep --quiet "^sign_metadata.*=.*$" $RHN_CONF; then
        # edit rhn.conf to disable signing
        sed -i 's/sign_metadata.*=.*$/sign_metadata = 0/g' $RHN_CONF
    else
        # add line to rhn.conf
        echo "sign_metadata = 0" >> $RHN_CONF
    fi
    echo "DONE. Disabled metadata signing in ${RHN_CONF}."

    sed -i "s/KEYID=\".*\"\s*$/KEYID=\"\"/g" $SIGNING_CONF
    echo "DONE. Unset KEYID in ${SIGNING_CONF}."

    if [ -f $GPG_SALT_EXPORT_FILE ]; then
        rm -f $GPG_SALT_EXPORT_FILE
        echo "DONE. Removed key export file ${GPG_SALT_EXPORT_FILE}."
    else
        echo "OK. Key file ${GPG_SALT_EXPORT_FILE} is not present."
    fi

    if [ -f $GPG_PUB_EXPORT_FILE ]; then
        rm -f $GPG_PUB_EXPORT_FILE
        echo "DONE. Removed key export file ${GPG_PUB_EXPORT_FILE}."
    else
        echo "OK. Key file ${GPG_PUB_EXPORT_FILE} is not present."
    fi

    echo
    echo "NOTE: Key pair was not removed from the GPG keyring. Use gpg --delete-keys and --delete-secret-keys if you wish to remove the keys from the keyring."
elif [[ $ACTION = "check-channels" ]]; then
    if is_signing_enabled; then
        read_spacecmd_user_pass
        CHANNELS=$(spacecmd -q -u $SPACECMD_USER -p $SPACECMD_PASS softwarechannel_list)
        RETVAL=$?
        if [ $RETVAL -ne 0 ]; then
            exit 1
        fi
        REPODATA_DIR=/var/cache/rhn/repodata # TODO get mount point from cfg

        for ch in $CHANNELS; do
           if [ ! -d "$REPODATA_DIR/$ch" ]; then
                echo "ERROR. Channel $ch. Cached metadata not generated."
           else
               if [[ -f "$REPODATA_DIR/$ch/Release.gpg" || -f "$REPODATA_DIR/$ch/Release.gpg" ]]; then
                    echo "OK. Channel $ch. Cached metadata is signed."
               else
                    echo "ERROR. Channel $ch. Cached metadata is not signed."
               fi
           fi
        done
    else
        echo "No checking done. Metadata signing is disabled."
    fi
elif [[ $ACTION = "regen-metadata" ]]; then
    regenerate_metadata
fi

if [[ $ACTION = "enable" || $ACTION = "disable" ]]; then
    echo
    echo "NOTE. For the changes to become effective run:"
    echo "   mgr-sign-metadata-ctl regen-metadata"
    echo
fi
 070701000000D7000081B40000000000000000000000015FBBE8EE00001929000000000000000000000000000000000000003C00000000spacewalk-backend/satellite_tools/mgr-update-pkg-extra-tags   #!/usr/bin/python

import os
import sys
import traceback
import argparse
from debian import debfile
from rhn import rhnLockfile
from spacewalk.server import rhnSQL
from spacewalk.common.rhnConfig import CFG, initCFG
from spacewalk.server.importlib.backendLib import DBstring, sanitizeValue
from spacewalk.satellite_tools.progress_bar import ProgressBar
from spacewalk.server import taskomatic

try:
    #  python 2
    from urllib import unquote
    import urlparse
except ImportError:
    #  python3
    import urllib.parse as urlparse # pylint: disable=F0401,E0611
    from urllib.parse import unquote

try:
    import xmlrpclib
except ImportError:
    import xmlrpc.client as xmlrpclib  # pylint: disable=F0401

DEFAULT_SERVER = 'localhost'

FORMAT_PRIORITY = ['.xz', '.gz', '']

PROCESSED = ['arch',
             'name',
             'summary',
             'epoch',
             'version',
             'release',
             'payload_size',
             'vendor',
             'package_group',
             'requires',
             'obsoletes',
             'predepends',
             'package',
             'architecture',
             'description',
             'maintainer',
             'section',
             'version',
             'depends',
             'provides',
             'conflicts',
             'replaces',
             'recommends',
             'suggests',
             'breaks',
             'pre-depends',
             'installed-size',
             ]

def systemExit(code, msg=None):
    sys.stderr.write(str(msg) + '\n')
    sys.exit(code)


def releaseLOCK():
    global LOCK
    if LOCK:
        LOCK.release()
        LOCK = None


def log(msg):
    print(msg)


class MetadataRefresh(object):

    def __init__(self, verbose):
        self.verbose = verbose
        self.channels = None

        self.select_channels = rhnSQL.prepare(
            """select distinct c.id, c.label from rhnChannel c, rhnChannelPackage cp, rhnPackage p, rhnPackageArch pa
                        where c.id=cp.channel_id and cp.package_id=p.id and p.package_arch_id=pa.id and pa.label like :deb""")
        self.select_pkgs = rhnSQL.prepare(
            """select p.id, p.path from rhnPackage p, rhnPackageArch pa
                        where p.package_arch_id=pa.id and pa.label like :deb""")
        self.insert_tag = rhnSQL.prepare("""
            insert into rhnPackageExtraTag(package_id, key_id, value) values(:package_id, :key_id, :value)
            """)
        self.delete_tags = rhnSQL.prepare("delete from rhnPackageExtraTag where package_id=:package_id")
        self.select_tag_key = rhnSQL.prepare("select id, name from rhnPackageExtraTagKey where name=:name");
        self.insert_tag_key = rhnSQL.prepare("insert into rhnPackageExtraTagKey(id, name) values(:id, :name)")

    def _create_extra_tag(self, package_id, key, value):
        value = sanitizeValue(value, DBstring(2048))
        self.select_tag_key.execute(name=key)
        dbkey = self.select_tag_key.fetchone_dict()
        if not dbkey:
            key_id = rhnSQL.Sequence('rhn_package_extra_tags_keys_id_seq').next()
            self.insert_tag_key.execute(id=key_id, name=key)
        else:
            key_id = dbkey["id"]
        self.insert_tag.execute(package_id=package_id, key_id=key_id, value=value)

    def _get_channels(self):
        if not self.channels:
            self.select_channels.execute(deb='%-deb')
            self.channels = self.select_channels.fetchall_dict()

    def refresh_db(self):
        self._get_channels()
        self.select_pkgs.execute(deb='%-deb')
        pkgs = self.select_pkgs.fetchall_dict()
        if pkgs:
            pb = ProgressBar(prompt='Updating {} packages in {} channel(s) '.format(len(pkgs), len(self.channels)), endTag=' - complete',
                         finalSize=len(pkgs), finalBarLength=40, stream=sys.stdout)
            pb.printAll(1)
            for pkg in pkgs:
                pb.addTo(1)
                pb.printIncrement()
                pkg_id = pkg['id']
                pkg_path = pkg['path']
                deb_path = os.path.join(CFG.MOUNT_POINT, pkg_path)
                deb = None
                try:
                    deb = debfile.DebFile(deb_path)
                    debcontrol = deb.debcontrol()
                    self.delete_tags.execute(package_id=pkg_id)

                    for key in list(debcontrol.keys()):
                        if key.lower() not in PROCESSED:
                            value = debcontrol[key]
                            if self.verbose:
                                log('%s |%s |%s | %s ' % (pkg_id, key, value, deb_path))
                            self._create_extra_tag(pkg_id, key, value)
                finally:
                    if deb:
                        deb.close()
            rhnSQL.commit()
            pb.printComplete()
        else:
            log('No packages to refresh')

    def regenerate_metadata(self):
        log('\nScheduling regeneration of repo metadata for channels:')
        self._get_channels()
        for channel in self.channels:
            log('- {}'.format(channel['label']))
        taskomatic.add_to_repodata_queue_for_channel_package_subscription(
            [channel['label'] for channel in self.channels], [], "server.app.updatepkgextratags")
        rhnSQL.commit()
        log('done.')


def main(args):
    global LOCK
    LOCK = None
    try:
        LOCK = rhnLockfile.Lockfile('/var/run/mgr-refresh-pkg-extra-tags.pid')
    except rhnLockfile.LockfileLockedException:
        systemExit(1, 'ERROR: attempting to run more than one instance of '
                      'mgr-refresh-pkg-metadata Exiting.')

    initCFG('server.satellite')
    initCFG('server.susemanager')
    rhnSQL.initDB()

    refresh = MetadataRefresh(args.verbose)
    refresh.refresh_db()
    refresh.regenerate_metadata()


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Update DEB packages extra fields in the database.')
    parser.add_argument('-v', '--verbose', dest='verbose', help='be verbose', action='store_true', default=False)
    args = parser.parse_args()

    try:
        sys.exit(abs(main(args) or 0))
    except KeyboardInterrupt:
        releaseLOCK()
        systemExit(1, '\nProcess has been interrupted.')
    except SystemExit as e:
        releaseLOCK()
        sys.exit(e.code)
    except:
        releaseLOCK()
        raise
   070701000000D8000081B40000000000000000000000015FBBE8EE000010E1000000000000000000000000000000000000003200000000spacewalk-backend/satellite_tools/progress_bar.py #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import sys
import time


class ProgressBar:

    """A simplete progress bar class. See example in main below."""

    def __init__(self, prompt='working: ', endTag=' - done',
                 finalSize=100.0, finalBarLength=10,
                 barChar='#', stream=sys.stdout, redrawYN=1):

        # disabling redrawing of the hash marks. Too many people are
        # complaining.
        redrawYN = 0

        self.size = 0.0
        self.barLength = 0
        self.barLengthPrinted = 0
        self.prompt = prompt
        self.endTag = endTag
        self.finalSize = float(finalSize)
        self.finalBarLength = int(finalBarLength)
        self.barChar = barChar
        self.stream = stream
        self.redrawYN = redrawYN
        if self.stream not in [sys.stdout, sys.stderr]:
            self.redrawYN = 0

    def reinit(self):
        self.size = 0.0
        self.barLength = 0
        self.barLengthPrinted = 0

    def printAll(self, contextYN=0):
        """ Prints/reprints the prompt and current level of hashmarks.
        Eg:             ____________________
            Processing: ###########
        NOTE: The underscores only occur if you turn on contextYN.
        """
        if contextYN:
            self.stream.write('%s%s\n' % (' ' * len(self.prompt), '_' * self.finalBarLength))
        toPrint = self.prompt + self.barChar * self.barLength
        if self.redrawYN:
            # self.stream.write('\b'*len(toPrint))
            # backup
            self.stream.write('\b' * 80)  # nuke whole line (80 good 'nuf?)
            completeBar = len(self.prompt + self.endTag) + self.finalBarLength
            # erase
            self.stream.write(completeBar * ' ')
            # backup again
            self.stream.write(completeBar * '\b')
        self.stream.write(toPrint)
        self.stream.flush()
        self.barLengthPrinted = self.barLength

    def printIncrement(self):
        "visually updates the bar."
        if self.redrawYN:
            self.printAll(contextYN=0)
        else:
            self.stream.write(self.barChar * (self.barLength - self.barLengthPrinted))
        self.stream.flush()
        self.barLengthPrinted = self.barLength

    def printComplete(self):
        """Completes the bar reguardless of current object status (and then
           updates the object's status to complete)."""
        self.complete()
        self.printIncrement()
        self.stream.write(self.endTag + '\n')
        self.stream.flush()

    def update(self, newSize):
        "Update the status of the class to the newSize of the bar."
        newSize = float(newSize)
        if newSize >= self.finalSize:
            newSize = self.finalSize
        self.size = newSize
        if self.finalSize == 0:
            self.barLength = self.finalBarLength
        else:
            self.barLength = int((self.size * self.finalBarLength) / self.finalSize)
            if self.barLength >= self.finalBarLength:
                self.barLength = self.finalBarLength

    def addTo(self, additionalSize):
        "Update the object's status to an additional bar size."
        self.update(self.size + additionalSize)

    def complete(self):
        self.update(self.finalSize)


#------------------------------------------------------------------------------

if __name__ == '__main__':
    print("An example:")
    bar_length = 40
    items = 200
    pb = ProgressBar('standby: ', ' - all done!', items, bar_length, 'o')
    pb.printAll(1)
    for i in range(items):
        # pb.update(i)
        pb.addTo(1)
        time.sleep(0.005)
        pb.printIncrement()
    pb.printComplete()

#------------------------------------------------------------------------------
   070701000000D9000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002F00000000spacewalk-backend/satellite_tools/repo_plugins    070701000000DA000081B40000000000000000000000015FBBE8EE00000323000000000000000000000000000000000000003800000000spacewalk-backend/satellite_tools/repo_plugins/Makefile   # Makefile for repo sync plugins
#
#
# Copyright (c) 2009--2013 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
# 
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation. 
#
#

TOP	= ../..

# Specific stuff
SUBDIR	= satellite_tools/repo_plugins
SPACEWALK_FILES	= __init__ yum_src uln_src deb_src

include $(TOP)/Makefile.defs

 070701000000DB000081B40000000000000000000000015FBBE8EE000010B4000000000000000000000000000000000000003B00000000spacewalk-backend/satellite_tools/repo_plugins/__init__.py    #
# Copyright (c) 2008--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import re
import rpm
from uyuni.common import rhn_pkg
from spacewalk.common.rhnException import rhnFault
from spacewalk.server import rhnPackageUpload

CACHE_DIR = '/var/cache/rhn/reposync/'


class ContentPackage:

    def __init__(self):
        # map of checksums
        self.checksums = {}
        self.checksum_type = None
        self.checksum = None

        # unique ID that can be used by plugin
        self.unique_id = None

        self.name = None
        self.version = None
        self.release = None
        self.epoch = None
        self.arch = None

        self.path = None

        self.a_pkg = None

    def clear_header(self):
        """a_pkg hold the header data. Remove it to not waste memory"""
        self.a_pkg = None

    def __cmp__(self, other):
        ret = cmp(self.name, other.name)
        if ret == 0:
            rel_self = str(self.release).split('.')[0]
            rel_other = str(other.release).split('.')[0]
            # pylint: disable=E1101
            ret = rpm.labelCompare((str(self.epoch), str(self.version), rel_self),
                                   (str(other.epoch), str(other.version), rel_other))
        if ret == 0:
            ret = cmp(self.arch, other.arch)
        return ret

    def getNRA(self):
        rel = re.match(".*?\\.(.*)",self.release)
        rel = rel.group(1)
        nra = str(self.name) + str(rel) + str(self.arch)
        return nra

    def setNVREA(self, name, version, release, epoch, arch):
        self.name = name
        self.version = version
        self.release = release
        self.arch = arch
        self.epoch = epoch

    def getNVREA(self):
        if self.epoch:
            return self.name + '-' + self.version + '-' + self.release + '-' + self.epoch + '.' + self.arch
        else:
            return self.name + '-' + self.version + '-' + self.release + '.' + self.arch

    def getNEVRA(self):
        if self.epoch is None:
            self.epoch = '0'
        return self.name + '-' + self.epoch + ':' + self.version + '-' + self.release + '.' + self.arch

    def load_checksum_from_header(self):
        if self.path is None:
            raise rhnFault(50, "Unable to load package", explain=0)
        self.a_pkg = rhn_pkg.package_from_filename(self.path)
        self.a_pkg.read_header()
        if self.checksum_type:
            self.a_pkg.set_checksum_type(self.checksum_type)
        if not self.a_pkg.checksum:
            self.a_pkg.payload_checksum()
        self.a_pkg.input_stream.close()
        if self.checksum != self.a_pkg.checksum:
            raise rhnFault(50, "checksums did not match %s vs %s" % (self.checksum, self.a_pkg.checksum), explain=0)

    def upload_package(self, org_id, metadata_only=False):
        if not metadata_only:
            rel_package_path = rhnPackageUpload.relative_path_from_header(
                self.a_pkg.header, org_id, self.a_pkg.checksum_type, self.a_pkg.checksum)
        else:
            rel_package_path = None
        _unused = rhnPackageUpload.push_package(self.a_pkg,
                                                force=False,
                                                relative_path=rel_package_path,
                                                org_id=org_id)
        return rel_package_path

    def set_checksum(self, checksum_type_in=None, checksum_in=None):
        if checksum_type_in and checksum_in:
            self.checksum_type = checksum_type_in
            self.checksum = checksum_in
            if not((checksum_type_in in self.checksums) and (self.checksums[checksum_type_in] == checksum_in)):
                self.checksums[checksum_type_in] = checksum_in

070701000000DC000081B40000000000000000000000015FBBE8EE00003E3C000000000000000000000000000000000000003A00000000spacewalk-backend/satellite_tools/repo_plugins/deb_src.py #
# Copyright (c) 2016--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import sys
import os.path
from shutil import rmtree
from shutil import copyfile
import time
import re
import fnmatch
import requests
from functools import cmp_to_key
from salt.utils.versions import LooseVersion
from uyuni.common import fileutils
from spacewalk.common.suseLib import get_proxy
from spacewalk.satellite_tools.download import get_proxies
from spacewalk.satellite_tools.repo_plugins import ContentPackage, CACHE_DIR
from spacewalk.satellite_tools.syncLib import log2
from spacewalk.common.rhnConfig import CFG, initCFG
from spacewalk.common import repo

try:
    #  python 2 
    from urllib import unquote
    import urlparse
except ImportError:
    #  python3
    import urllib.parse as urlparse # pylint: disable=F0401,E0611
    from urllib.parse import unquote

RETRIES = 10
RETRY_DELAY = 1
FORMAT_PRIORITY = ['.xz', '.gz', '']


class DebPackage:
    def __init__(self):
        self.name = None
        self.epoch = None
        self.version = None
        self.release = None
        self.arch = None
        self.relativepath = None
        self.checksum_type = None
        self.checksum = None

    def __getitem__(self, key):
        return getattr(self, key)

    def __setitem__(self, key, value):
        return setattr(self, key, value)

    def evr(self):
        evr = ""
        if self.epoch:
           evr = evr + "{}:".format(self.epoch)
        if self.version:
           evr = evr + "{}".format(self.version)
        if self.release:
           evr = evr + "-{}".format(self.release)
        return evr

    def is_populated(self):
        return all([attribute is not None for attribute in (self.name, self.epoch,
                                                            self.version, self.release, self.arch,
                                                            self.relativepath, self.checksum_type,
                                                            self.checksum)])


class DebRepo:
    # url example - http://ftp.debian.org/debian/dists/jessie/main/binary-amd64/
    def __init__(
        self,
        url,
        cache_dir,
        pkg_dir,
        proxy_addr="",
        proxy_user="",
        proxy_pass="",
        gpg_verify=True,
    ):
        self.url = url
        parts = url.rsplit('/dists/', 1)
        self.base_url = [parts[0]]
        # Make sure baseurl ends with / and urljoin will work correctly
        if self.base_url[0][-1] != '/':
            self.base_url[0] += '/'
        self.urls = self.base_url
        self.sslclientcert = self.sslclientkey = self.sslcacert = None
        self.proxy = proxy_addr
        self.proxy_username = proxy_user
        self.proxy_password = proxy_pass
        self.gpg_verify = gpg_verify

        self.basecachedir = cache_dir
        if not os.path.isdir(self.basecachedir):
            fileutils.makedirs(self.basecachedir, user='wwwrun', group='www')
        self.includepkgs = []
        self.exclude = []
        self.pkgdir = pkg_dir
        self.http_headers = {}

    def verify(self):
        """
        Verify package index checksum and signature.

        :return:
        """
        if not repo.DpkgRepo(self.url, self._get_proxies(), self.gpg_verify).verify_packages_index():
            raise repo.GeneralRepoException("Package index checksum failure")

    def _get_proxies(self):
        """
        Returns proxies dict for requests with python-requests.
        """
        if self.proxy:
            (_, netloc, _, _, _) = urlparse.urlsplit(self.proxy)
            proxies = {
                'http': 'http://' + netloc,
                'https': 'http://' + netloc
            }
            if self.proxy_username and self.proxy_password:
                proxies = {
                    'http': 'http://' + self.proxy_username + ":" + self.proxy_password + "@" + netloc,
                    'https': 'http://' + self.proxy_username + ":" + self.proxy_password + "@" + netloc,
                }
            return proxies
        else:
            return None


    def _download(self, url):
        if url.startswith('file://'):
            srcpath = unquote(url[len('file://'):])
            if not os.path.exists(srcpath):
                return ''
            filename = self.basecachedir + '/' + os.path.basename(url)
            copyfile(srcpath, filename)
            return filename
        for _ in range(0, RETRIES):
            try:
                data = requests.get(url, proxies=self._get_proxies(), cert=(self.sslclientcert, self.sslclientkey),
                                    verify=self.sslcacert)
                if not data.ok:
                    return ''
                filename = os.path.join(self.basecachedir, os.path.basename(urlparse.urlparse(url).path))
                fd = open(filename, 'wb')
                try:
                    for chunk in data.iter_content(chunk_size=1024):
                        fd.write(chunk)
                finally:
                    if fd is not None:
                        fd.close()
                return filename
            except requests.exceptions.RequestException as exc:
                print("ERROR: requests.exceptions.RequestException occurred:", exc)
                time.sleep(RETRY_DELAY)

        return ''

    def get_package_list(self):
        decompressed = None
        packages_raw = []
        to_return = []

        for extension in FORMAT_PRIORITY:
            scheme, netloc, path, query, fragid = urlparse.urlsplit(self.url)
            url = urlparse.urlunsplit((scheme, netloc,
                                       path + ('/' if not path.endswith('/') else '') + 'Packages' + extension, query, fragid))
            filename = self._download(url)
            if filename:
                if query:
                    newfilename = filename.split('?')[0]
                    os.rename(filename, newfilename)
                    filename = newfilename
                decompressed = fileutils.decompress_open(filename)
                break

        if decompressed:
            for pkg in decompressed.read().split("\n\n"):
                packages_raw.append(pkg)
            decompressed.close()
        else:
            print("ERROR: Download of package list failed.")

        # Parse and format package metadata
        for chunk in packages_raw:
            package = DebPackage()
            package.epoch = ""
            lines = chunk.split("\n")
            checksums = {}
            for line in lines:
                pair = line.split(" ", 1)
                if pair[0] == "Package:":
                    package.name = pair[1]
                elif pair[0] == "Architecture:":
                    package.arch = pair[1] + '-deb'
                elif pair[0] == "Version:":
                    package['epoch'] = ''
                    version = pair[1]
                    if version.find(':') != -1:
                        package['epoch'], version = version.split(':')
                    if version.find('-') != -1:
                        tmp = version.split('-')
                        package['version'] = '-'.join(tmp[:-1])
                        package['release'] = tmp[-1]
                    else:
                        package['version'] = version
                        package['release'] = 'X'
                elif pair[0] == "Filename:":
                    package.relativepath = pair[1]
                elif pair[0] == "SHA256:":
                    checksums['sha256'] = pair[1]
                elif pair[0] == "SHA1:":
                    checksums['sha1'] = pair[1]
                elif pair[0] == "MD5sum:":
                    checksums['md5'] = pair[1]

            # Pick best available checksum
            if 'sha256' in checksums:
                package.checksum_type = 'sha256'
                package.checksum = checksums['sha256']
            elif 'sha1' in checksums:
                package.checksum_type = 'sha1'
                package.checksum = checksums['sha1']
            elif 'md5' in checksums:
                package.checksum_type = 'md5'
                package.checksum = checksums['md5']

            if package.is_populated():
                to_return.append(package)
        return to_return


class ContentSource:

    def __init__(self, url, name, insecure=False, interactive=True, yumsrc_conf=None,
                 org="1", channel_label="", no_mirrors=False, ca_cert_file=None,
                 client_cert_file=None, client_key_file=None):
        # pylint: disable=W0613
        self.url = url
        self.name = name
        if org:
            self.org = org
        else:
            self.org = "NULL"

        comp = CFG.getComponent()
        # read the proxy configuration in /etc/rhn/rhn.conf
        initCFG('server.satellite')

        self.proxy_addr, self.proxy_user, self.proxy_pass = get_proxy(self.url)
        self.authtoken = None

        self.repo = DebRepo(url, os.path.join(CACHE_DIR, self.org, name),
                            os.path.join(CFG.MOUNT_POINT, CFG.PREPENDED_DIR, self.org, 'stage'),
                            self.proxy_addr, self.proxy_user, self.proxy_pass, gpg_verify=not(insecure))
        self.repo.verify()

        self.num_packages = 0
        self.num_excluded = 0

        # keep authtokens for mirroring
        (_scheme, _netloc, _path, query, _fragid) = urlparse.urlsplit(url)
        if query:
            self.authtoken = query
        initCFG(comp)

    def get_md_checksum_type(self):
        pass

    def get_products(self):
        # No products
        return []

    def get_susedata(self):
        # No susedata
        return []

    def get_mediaproducts(self):
        # No mediaproducts data
        return None

    def list_packages(self, filters, latest):
        """ list packages"""

        pkglist = self.repo.get_package_list()
        self.num_packages = len(pkglist)
        if latest:
            latest_pkgs = {}
            for pkg in pkglist:
                ident = '{}.{}'.format(pkg.name, pkg.arch)
                if ident not in latest_pkgs.keys() or LooseVersion(pkg.evr()) > LooseVersion(latest_pkgs[ident].evr()):
                    latest_pkgs[ident] = pkg
            pkglist = list(latest_pkgs.values())
        pkglist.sort(key = cmp_to_key(self._sort_packages))

        if not filters:
            # if there's no include/exclude filter on command line or in database
            for p in self.repo.includepkgs:
                filters.append(('+', [p]))
            for p in self.repo.exclude:
                filters.append(('-', [p]))

        if filters:
            pkglist = self._filter_packages(pkglist, filters)
            self.num_excluded = self.num_packages - len(pkglist)

        to_return = []
        for pack in pkglist:
            new_pack = ContentPackage()
            new_pack.setNVREA(pack.name, pack.version, pack.release,
                              pack.epoch, pack.arch)
            new_pack.unique_id = pack
            new_pack.checksum_type = pack.checksum_type
            new_pack.checksum = pack.checksum
            to_return.append(new_pack)
        return to_return

    @staticmethod
    def _sort_packages(pkg1, pkg2):
        """sorts a list of deb package dicts by name"""
        if pkg1.name > pkg2.name:
            return 1
        elif pkg1.name == pkg2.name:
            return 0
        else:
            return -1

    @staticmethod
    def _filter_packages(packages, filters):
        """ implement include / exclude logic
            filters are: [ ('+', includelist1), ('-', excludelist1),
                           ('+', includelist2), ... ]
        """
        if filters is None:
            return

        selected = []
        excluded = []
        allmatched_include = []
        allmatched_exclude = []
        if filters[0][0] == '-':
            # first filter is exclude, start with full package list
            # and then exclude from it
            selected = packages
        else:
            excluded = packages

        for filter_item in filters:
            sense, pkg_list = filter_item
            regex = fnmatch.translate(pkg_list[0])
            reobj = re.compile(regex)
            if sense == '+':
                # include
                for excluded_pkg in excluded:
                    if reobj.match(excluded_pkg['name']):
                        allmatched_include.insert(0, excluded_pkg)
                        selected.insert(0, excluded_pkg)
                for pkg in allmatched_include:
                    if pkg in excluded:
                        excluded.remove(pkg)
            elif sense == '-':
                # exclude
                for selected_pkg in selected:
                    if reobj.match(selected_pkg['name']):
                        allmatched_exclude.insert(0, selected_pkg)
                        excluded.insert(0, selected_pkg)

                for pkg in allmatched_exclude:
                    if pkg in selected:
                        selected.remove(pkg)
                excluded = (excluded + allmatched_exclude)
            else:
                raise IOError("Filters are malformed")
        return selected

    def clear_cache(self, directory=None):
        if directory is None:
            directory = os.path.join(CACHE_DIR, self.org, self.name)
        # remove content in directory
        for item in os.listdir(directory):
            path = os.path.join(directory, item)
            if os.path.isfile(path):
                os.unlink(path)
            elif os.path.isdir(path):
                rmtree(path)

    @staticmethod
    def get_updates():
        # There isn't any update info in the repository
        return '', []

    @staticmethod
    def get_groups():
        pass

    # Get download parameters for threaded downloader
    def set_download_parameters(self, params, relative_path, target_file, checksum_type=None,
                                checksum_value=None, bytes_range=None):
        # Create directories if needed
        target_dir = os.path.dirname(target_file)
        if not os.path.exists(target_dir):
            os.makedirs(target_dir, int('0755', 8))

        params['authtoken'] = self.authtoken
        params['urls'] = self.repo.urls
        params['relative_path'] = relative_path
        params['authtoken'] = self.authtoken
        params['target_file'] = target_file
        params['ssl_ca_cert'] = self.repo.sslcacert
        params['ssl_client_cert'] = self.repo.sslclientcert
        params['ssl_client_key'] = self.repo.sslclientkey
        params['checksum_type'] = checksum_type
        params['checksum'] = checksum_value
        params['bytes_range'] = bytes_range
        params['proxy'] = self.proxy_addr
        params['proxy_username'] = self.proxy_user
        params['proxy_password'] = self.proxy_pass
        params['http_headers'] = self.repo.http_headers
        # Older urlgrabber compatibility
        params['proxies'] = get_proxies(self.repo.proxy, self.repo.proxy_username,
                                        self.repo.proxy_password)

    @staticmethod
    def get_file(path, local_base=None):
        # pylint: disable=W0613
        # Called from import_kickstarts, not working for deb repo
        log2(0, 0, "Unable to download path %s from deb repo." % path, stream=sys.stderr)
070701000000DD000081B40000000000000000000000015FBBE8EE00000DDD000000000000000000000000000000000000003A00000000spacewalk-backend/satellite_tools/repo_plugins/uln_src.py """
Copyright (C) 2014 Oracle and/or its affiliates. All rights reserved.

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, version 2


This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.

ULN plugin for spacewalk-repo-sync.
"""

# pylint: disable=E0012, C0413
import sys
sys.path.append('/usr/share/rhn')

from spacewalk.satellite_tools.repo_plugins.yum_src import ContentSource as yum_ContentSource
from spacewalk.satellite_tools.syncLib import RhnSyncException
from spacewalk.satellite_tools.ulnauth import ULNAuth

class ContentSource(yum_ContentSource):

    def __init__(self, url, name, insecure=False, interactive=True, yumsrc_conf=ULNAuth.ULN_CONF_PATH,
                 org=1, channel_label="", no_mirrors=False,
                 ca_cert_file=None, client_cert_file=None, client_key_file=None):
        if url[:6] != "uln://":
            raise RhnSyncException("url format error, url must start with uln://")
        # Make sure baseurl ends with / and urljoin will work correctly
        if url[-1] != '/':
            url += '/'
        yum_ContentSource.__init__(self, url=url, name=name, insecure=insecure,
                                   interactive=interactive, yumsrc_conf=yumsrc_conf, org=org,
                                   channel_label=channel_label, no_mirrors=no_mirrors,
                                   ca_cert_file=ca_cert_file, client_cert_file=client_cert_file,
                                   client_key_file=client_key_file)
        self.uln_token = None

    def _authenticate(self, url):
        self._url_orig = url
        self._uln_auth = ULNAuth()
        self.uln_token = self._uln_auth.authenticate(url)
        self.http_headers = {'X-ULN-Api-User-Key': self.uln_token}
        hostname, label = self._uln_auth.get_hostname(self.url)
        self._load_proxy_settings(hostname)
        print(("The download URL is: " + self._uln_auth.url + "/XMLRPC/GET-REQ/" + label))
        if self.proxy_url:
            print(("Trying proxy " + self.proxy_url))

    # pylint: disable=arguments-differ
    def setup_repo(self, repo, *args, **kwargs):
        yum_ContentSource.setup_repo(self, repo, *args, uln_repo=True, **kwargs)

    # Get download parameters for threaded downloader
    def set_download_parameters(self, params, relative_path, target_file, checksum_type=None,
                                checksum_value=None, bytes_range=None):
        yum_ContentSource.set_download_parameters(self,
                                                  params=params,
                                                  relative_path=relative_path,
                                                  target_file=target_file,
                                                  checksum_type=checksum_type,
                                                  checksum_value=checksum_value,
                                                  bytes_range=bytes_range)
        hostname, label = self._uln_auth.get_hostname(self.url)
        params['urls'] = [self._uln_auth.url + "/XMLRPC/GET-REQ/" + label]
   070701000000DE000081B40000000000000000000000015FBBE8EE0000BCFF000000000000000000000000000000000000003A00000000spacewalk-backend/satellite_tools/repo_plugins/yum_src.py # coding: utf-8
#
# Copyright (c) 2008--2018 Red Hat, Inc.
# Copyright (c) 2010--2019 SUSE LINUX GmbH, Nuernberg, Germany.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# SUSE trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate SUSE trademarks that are incorporated
# in this software or its documentation.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

from __future__ import absolute_import, unicode_literals

from shutil import rmtree, copytree

import configparser
import fnmatch
import glob
import gzip
import os
import re
import solv
import subprocess
import sys
import tempfile
import types
import urlgrabber

try:
    from urllib import urlencode, unquote, quote
    from urlparse import urlsplit, urlparse, urlunparse
except:
    from urllib.parse import urlsplit, urlencode, urlparse, urlunparse, unquote, quote

import xml.etree.ElementTree as etree

from functools import cmp_to_key
from salt.utils.versions import LooseVersion
from uyuni.common import checksum, fileutils
from spacewalk.common import rhnLog
from spacewalk.satellite_tools.repo_plugins import ContentPackage, CACHE_DIR
from spacewalk.satellite_tools.download import get_proxies
from spacewalk.common.rhnConfig import CFG, initCFG
from spacewalk.common.suseLib import get_proxy


# namespace prefix to parse patches.xml file
PATCHES_XML = '{http://novell.com/package/metadata/suse/patches}'
REPO_XML = '{http://linux.duke.edu/metadata/repo}'
METALINK_XML = '{http://www.metalinker.org/}'

CACHE_DIR = '/var/cache/rhn/reposync'
SPACEWALK_LIB = '/var/lib/spacewalk'
SPACEWALK_GPG_KEYRING = os.path.join(SPACEWALK_LIB, 'gpgdir/pubring.gpg')
ZYPP_CACHE_PATH = 'var/cache/zypp'
ZYPP_RAW_CACHE_PATH = os.path.join(ZYPP_CACHE_PATH, 'raw')
ZYPP_SOLV_CACHE_PATH = os.path.join(ZYPP_CACHE_PATH, 'solv')
REPOSYNC_ZYPPER_ROOT = os.path.join(SPACEWALK_LIB, "reposync/root")
REPOSYNC_ZYPPER_RPMDB_PATH = os.path.join(REPOSYNC_ZYPPER_ROOT, 'var/lib/rpm')
REPOSYNC_ZYPPER_CONF = '/etc/rhn/spacewalk-repo-sync/zypper.conf'
REPOSYNC_EXTRA_HTTP_HEADERS_CONF = '/etc/rhn/spacewalk-repo-sync/extra_headers.conf'

RPM_PUBKEY_VERSION_RELEASE_RE = re.compile(r'^gpg-pubkey-([0-9a-fA-F]+)-([0-9a-fA-F]+)')


class ZyppoSync:
    """
    This class prepares a environment for running Zypper inside a dedicated reposync root

    """
    def __init__(self, root=None):
        self._root = root
        if self._root is not None:
            self._init_root(self._root)

    def _init_root(self, root):
        """
        Creates a root environment for Zypper, but only if none is around.

        :return: None
        """
        try:
            for pth in [root, os.path.join(root, "etc/zypp/repos.d"), REPOSYNC_ZYPPER_ROOT]:
                if not os.path.exists(pth):
                    os.makedirs(pth)
        except Exception as exc:
            msg = "Unable to initialise Zypper root for {}: {}".format(root, exc)
            rhnLog.log_clean(0, msg)
            sys.stderr.write(str(msg) + "\n")
            raise
        try:
            # Synchronize new GPG keys that come from the Spacewalk GPG keyring
            self.__synchronize_gpg_keys()
        except Exception as exc:
            msg = "Unable to synchronize Spacewalk GPG keyring: {}".format(exc)
            rhnLog.log_clean(0, msg)
            sys.stderr.write(str(msg) + "\n")

    def __synchronize_gpg_keys(self):
        """
        This method does update the Zypper RPM database with new keys coming from the Spacewalk GPG keyring

        """
        spacewalk_gpg_keys = {}
        zypper_gpg_keys = {}
        with tempfile.NamedTemporaryFile() as f:
            # Collect GPG keys from the Spacewalk GPG keyring
            os.system("gpg -q --batch --no-options --no-default-keyring --no-permission-warning --keyring {} --export -a > {}".format(SPACEWALK_GPG_KEYRING, f.name))
            process = subprocess.Popen(['gpg', '--verbose', '--with-colons', f.name], stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
            for line in process.stdout.readlines():
               line_l = line.decode().split(":")
               if line_l[0] == "sig" and "selfsig" in line_l[10]:
                   spacewalk_gpg_keys.setdefault(line_l[4][8:].lower(), []).append(format(int(line_l[5]), 'x'))

            # Collect GPG keys from reposync Zypper RPM database
            process = subprocess.Popen(['rpm', '-q', 'gpg-pubkey', '--dbpath', REPOSYNC_ZYPPER_RPMDB_PATH], stdout=subprocess.PIPE)
            for line in process.stdout.readlines():
                match = RPM_PUBKEY_VERSION_RELEASE_RE.match(line.decode())
                if match:
                    zypper_gpg_keys[match.groups()[0]] = match.groups()[1]

            # Compare GPG keys and remove keys from reposync that are going to be imported with a newer release.
            for key in zypper_gpg_keys:
                # If the GPG key id already exists, is that new key actually newer? We need to check the release
                release_i = int(zypper_gpg_keys[key], 16)
                if key in spacewalk_gpg_keys and any(int(i, 16) > release_i for i in spacewalk_gpg_keys[key]):
                    # This GPG key has a newer release on the Spacewalk GPG keyring that on the reposync Zypper RPM database.
                    # We delete this key from the RPM database to allow importing the newer version.
                    os.system("rpm --dbpath {} -e gpg-pubkey-{}-{}".format(REPOSYNC_ZYPPER_RPMDB_PATH, key, zypper_gpg_keys[key]))

            # Finally, once we deleted the existing old key releases from the Zypper RPM database
            # we proceed to import all keys from the Spacewalk GPG keyring. This will allow new GPG
            # keys release are upgraded in the Zypper keyring since rpmkeys does not handle the upgrade
            # properly
            os.system("rpmkeys --dbpath {} --import {}".format(REPOSYNC_ZYPPER_RPMDB_PATH, f.name))


class ZypperRepo:
    def __init__(self, root, url, org):
       self.root = root
       self.baseurl = [url]
       self.basecachedir = os.path.join(CACHE_DIR, org)
       self.pkgdir = os.path.join(CFG.MOUNT_POINT, CFG.PREPENDED_DIR, org, 'stage')
       self.urls = self.baseurl
       # Make sure baseurl ends with / and urljoin will work correctly
       if self.urls[0][-1] != '/':
           self.urls[0] += '/'
       # Make sure root paths are created
       if not os.path.isdir(self.root):
           fileutils.makedirs(self.root, user='wwwrun', group='www')
       if not os.path.isdir(self.pkgdir):
           fileutils.makedirs(self.pkgdir, user='wwwrun', group='www')
       self.is_configured = False
       self.includepkgs = []
       self.exclude = []


class RawSolvablePackage:
    def __init__(self, solvable):
        self.name = solvable.name
        self.raw_name = str(solvable)
        self.epoch, self.version, self.release = self._parse_solvable_evr(solvable.evr)
        self.arch = solvable.arch
        cksum = solvable.lookup_checksum(solv.SOLVABLE_CHECKSUM)
        self.checksum_type = cksum.typestr()
        self.checksum = cksum.hex()
        self.packagesize = solvable.lookup_num(solv.SOLVABLE_DOWNLOADSIZE)
        self.relativepath = solvable.lookup_location()[0]

    def __repr__(self):
        return "RawSolvablePackage({})".format(self.raw_name)

    @staticmethod
    def _parse_solvable_evr(evr):
        """
        Return the (epoch, version, release) tuple based on evr string.
        The "evr" string from libsolv is represented as: "epoch:version-release"

        https://github.com/openSUSE/libsolv/blob/master/src/solvable.h

        :returns: tuple
        """
        if evr in [None, '']:
           return ('', '', '')
        idx_epoch = evr.find(':')
        epoch = evr[:idx_epoch] if idx_epoch != -1 else ''
        idx_release = evr.find('-')
        if idx_release != -1:
            version = evr[idx_epoch + 1:idx_release]
            release = evr[idx_release + 1:]
        else:
            version = evr[idx_epoch + 1:]
            release = ''
        return epoch, version, release


class RepoMDError(Exception):
    """ An exception thrown when not RepoMD is found. """
    pass


class SolvFileNotFound(Exception):
    """ An exception thrown when not Solv file is found. """
    pass


class UpdateNoticeException(Exception):
    """ An exception thrown for bad UpdateNotice data. """
    pass


class UpdateNotice(object):
    """
    Simplified UpdateNotice class implementation
    https://github.com/rpm-software-management/yum/blob/master/yum/update_md.py

    A single update notice (for instance, a security fix).
    """
    def __init__(self, elem=None, repoid=None, vlogger=None):
        self._md = {
            'from'             : '',
            'type'             : '',
            'title'            : '',
            'release'          : '',
            'status'           : '',
            'version'          : '',
            'pushcount'        : '',
            'update_id'        : '',
            'issued'           : '',
            'updated'          : '',
            'description'      : '',
            'rights'           : '',
            'severity'         : '',
            'summary'          : '',
            'solution'         : '',
            'references'       : [],
            'pkglist'          : [],
            'reboot_suggested' : False,
            'restart_suggested' : False
        }

        if elem is not None:
            self._parse(elem)

    def __getitem__(self, item):
        """ Allows scriptable metadata access (ie: un['update_id']). """
        if type(item) is int:
            return sorted(self._md)[item]
        ret = self._md.get(item)
        if ret == '':
            ret = None
        return ret

    def __setitem__(self, item, val):
        self._md[item] = val

    def _parse(self, elem):
        """
        Parse an update element::
            <!ELEMENT update (id, synopsis?, issued, updated,
                              references, description, rights?,
                              severity?, summary?, solution?, pkglist)>
                <!ATTLIST update type (errata|security) "errata">
                <!ATTLIST update status (final|testing) "final">
                <!ATTLIST update version CDATA #REQUIRED>
                <!ATTLIST update from CDATA #REQUIRED>
        """
        if elem.tag == 'update':
            for attrib in ('from', 'type', 'status', 'version'):
                self._md[attrib] = elem.attrib.get(attrib)
            for child in elem:
                if child.tag == 'id':
                    if not child.text:
                        raise UpdateNoticeException("No id element found")
                    self._md['update_id'] = child.text
                elif child.tag == 'pushcount':
                    self._md['pushcount'] = child.text
                elif child.tag == 'issued':
                    self._md['issued'] = child.attrib.get('date')
                elif child.tag == 'updated':
                    self._md['updated'] = child.attrib.get('date')
                elif child.tag == 'references':
                    self._parse_references(child)
                elif child.tag == 'description':
                    self._md['description'] = child.text
                elif child.tag == 'rights':
                    self._md['rights'] = child.text
                elif child.tag == 'severity':
                    self._md[child.tag] = child.text
                elif child.tag == 'summary':
                    self._md['summary'] = child.text
                elif child.tag == 'solution':
                    self._md['solution'] = child.text
                elif child.tag == 'pkglist':
                    self._parse_pkglist(child)
                elif child.tag == 'title':
                    self._md['title'] = child.text
                elif child.tag == 'release':
                    self._md['release'] = child.text
        else:
            raise UpdateNoticeException('No update element found')

    def _parse_references(self, elem):
        """
        Parse the update references::
            <!ELEMENT references (reference*)>
            <!ELEMENT reference>
                <!ATTLIST reference href CDATA #REQUIRED>
                <!ATTLIST reference type (self|other|cve|bugzilla) "self">
                <!ATTLIST reference id CDATA #IMPLIED>
                <!ATTLIST reference title CDATA #IMPLIED>
        """
        for reference in elem:
            if reference.tag == 'reference':
                data = {}
                for refattrib in ('id', 'href', 'type', 'title'):
                    data[refattrib] = reference.attrib.get(refattrib)
                self._md['references'].append(data)
            else:
                raise UpdateNoticeException('No reference element found')

    def _parse_pkglist(self, elem):
        """
        Parse the package list::
            <!ELEMENT pkglist (collection+)>
            <!ELEMENT collection (name?, package+)>
                <!ATTLIST collection short CDATA #IMPLIED>
                <!ATTLIST collection name CDATA #IMPLIED>
            <!ELEMENT name (#PCDATA)>
        """
        for collection in elem:
            data = { 'packages' : [] }
            if 'short' in collection.attrib:
                data['short'] = collection.attrib.get('short')
            for item in collection:
                if item.tag == 'name':
                    data['name'] = item.text
                elif item.tag == 'package':
                    data['packages'].append(self._parse_package(item))
            self._md['pkglist'].append(data)

    def _parse_package(self, elem):
        """
        Parse an individual package::
            <!ELEMENT package (filename, sum, reboot_suggested, restart_suggested)>
                <!ATTLIST package name CDATA #REQUIRED>
                <!ATTLIST package version CDATA #REQUIRED>
                <!ATTLIST package release CDATA #REQUIRED>
                <!ATTLIST package arch CDATA #REQUIRED>
                <!ATTLIST package epoch CDATA #REQUIRED>
                <!ATTLIST package src CDATA #REQUIRED>
            <!ELEMENT reboot_suggested (#PCDATA)>
            <!ELEMENT restart_suggested (#PCDATA)>
            <!ELEMENT filename (#PCDATA)>
            <!ELEMENT sum (#PCDATA)>
                <!ATTLIST sum type (md5|sha1) "sha1">
        """
        package = {}
        for pkgfield in ('arch', 'epoch', 'name', 'version', 'release', 'src'):
            package[pkgfield] = elem.attrib.get(pkgfield)

        #  Bad epoch and arch data is the most common (missed) screwups.
        # Deal with bad epoch data.
        if not package['epoch'] or package['epoch'][0] not in '0123456789':
            package['epoch'] = None

        for child in elem:
            if child.tag == 'filename':
                package['filename'] = child.text
            elif child.tag == 'sum':
                package['sum'] = (child.attrib.get('type'), child.text)
            elif child.tag == 'reboot_suggested':
                self._md['reboot_suggested'] = True
            elif child.tag == 'restart_suggested':
                self._md['restart_suggested'] = True
        return package


class ContentSource:
    def __init__(self, url, name, insecure=False, interactive=True,
                 yumsrc_conf=None, org="1", channel_label="",
                 no_mirrors=False, ca_cert_file=None, client_cert_file=None,
                 client_key_file=None):
        """
        Plugin constructor.
        """

        # pylint: disable=W0613
        if urlsplit(url).scheme:
          self.url = url
        else:
          self.url = "file://%s" % url
        self.name = name
        self.insecure = insecure
        self.interactive = interactive
        self.org = org if org else "NULL"
        self.proxy_hostname = None
        self.proxy_url = None
        self.proxy_user = None
        self.proxy_pass = None
        self.authtoken = None
        self.sslcacert = ca_cert_file
        self.sslclientcert = client_cert_file
        self.sslclientkey = client_key_file
        self.http_headers = {}

        comp = CFG.getComponent()
        # read configuration from /etc/rhn/rhn.conf
        initCFG('server.satellite')

        # keep authtokens for mirroring
        (_scheme, _netloc, _path, query, _fragid) = urlsplit(url)
        if query:
            self.authtoken = query

        # load proxy configuration based on the url
        self._load_proxy_settings(self.url)

        # Get extra HTTP headers configuration from /etc/rhn/spacewalk-repo-sync/extra_headers.conf
        if os.path.isfile(REPOSYNC_EXTRA_HTTP_HEADERS_CONF):
            http_headers_cfg = configparser.ConfigParser()
            http_headers_cfg.read_file(open(REPOSYNC_EXTRA_HTTP_HEADERS_CONF))
            section_name = None

            if http_headers_cfg.has_section(self.name):
                section_name = self.name
            elif http_headers_cfg.has_section(channel_label):
                section_name = channel_label
            elif http_headers_cfg.has_section('main'):
                section_name = 'main'

            if section_name:
                for hdr in http_headers_cfg[section_name]:
                    self.http_headers[hdr] = http_headers_cfg.get(section_name, option=hdr)

        # perform authentication if implemented
        self._authenticate(url)

        # Make sure baseurl ends with / and urljoin will work correctly
        self.urls = [url]
        if self.urls[0][-1] != '/':
            self.urls[0] += '/'

        # Exclude non-valid characters from reponame
        self.reponame = self.name
        for chr in ["$", " ", ".", ";"]:
            self.reponame = self.reponame.replace(chr, "_")
        self.channel_label = channel_label
        # SUSE vendor repositories belongs to org = NULL
        root = os.path.join(CACHE_DIR, str(org or "NULL"), self.channel_label or self.reponame)

        self.repo = ZypperRepo(root=root, url=self.url, org=self.org)
        self.num_packages = 0
        self.num_excluded = 0
        self.gpgkey_autotrust = None
        self.groupsfile = None
        # set config component back to original
        initCFG(comp)

    def _load_proxy_settings(self, url):
        # read the proxy configuration in /etc/rhn/rhn.conf
        comp = CFG.getComponent()
        initCFG('server.satellite')

        # Get the global HTTP Proxy settings from DB or per-repo
        # settings on /etc/rhn/spacewalk-repo-sync/zypper.conf
        if CFG.http_proxy:
            self.proxy_url, self.proxy_user, self.proxy_pass = get_proxy(url)
            self.proxy_hostname = self.proxy_url
        elif os.path.isfile(REPOSYNC_ZYPPER_CONF):
            zypper_cfg = configparser.ConfigParser()
            zypper_cfg.read_file(open(REPOSYNC_ZYPPER_CONF))
            section_name = None

            if zypper_cfg.has_section(self.name):
                section_name = self.name
            elif zypper_cfg.has_section(channel_label):
                section_name = channel_label
            elif zypper_cfg.has_section('main'):
                section_name = 'main'

            if section_name:
                if zypper_cfg.has_option(section_name, option='proxy'):
                    self.proxy_hostname = zypper_cfg.get(section_name, option='proxy')
                    self.proxy_url = "http://%s" % self.proxy_hostname

                if zypper_cfg.has_option(section_name, 'proxy_username'):
                    self.proxy_user = zypper_cfg.get(section_name, 'proxy_username')

                if zypper_cfg.has_option(section_name, 'proxy_password'):
                    self.proxy_pass = zypper_cfg.get(section_name, 'proxy_password')

        # set config component back to original
        initCFG(comp)

    def _get_mirror_list(self, repo, url):
        mirrorlist_path = os.path.join(repo.root, 'mirrorlist.txt')
        returnlist = []
        content = []
        try:
            urlgrabber_opts = {}
            self.set_download_parameters(urlgrabber_opts, url, mirrorlist_path)
            urlgrabber.urlgrab(url, mirrorlist_path, **urlgrabber_opts)
        except Exception as exc:
            # no mirror list found continue without
            return returnlist

        def _replace_and_check_url(url_list):
            goodurls = []
            skipped = None
            for url in url_list:
                # obvious bogons get ignored b/c, we could get more interesting checks but <shrug>
                if url in ['', None]:
                    continue
                try:
                    # This started throwing ValueErrors, BZ 666826
                    (s,b,p,q,f,o) = urlparse(url)
                    if p[-1] != '/':
                        p = p + '/'
                except (ValueError, IndexError, KeyError) as e:
                    s = 'blah'

                if s not in ['http', 'ftp', 'file', 'https']:
                    skipped = url
                    continue
                else:
                    goodurls.append(urlunparse((s,b,p,q,f,o)))
            return goodurls

        try:
           with open(mirrorlist_path, 'r') as mirrorlist_file:
               content = mirrorlist_file.readlines()
        except Exception as exc:
            self.error_msg("Could not read mirrorlist: {}".format(exc))

        try:
            # Try to read a metalink XML
            for files in etree.parse(mirrorlist_path).getroot():
                file_elem = files.find(METALINK_XML+'file')
                if file_elem.get('name') == 'repomd.xml':
                    _urls = file_elem.find(METALINK_XML+'resources').findall(METALINK_XML+'url')
                    for _url in _urls:
                        # The mirror urls in the metalink file are for repomd.xml so it
                        # gives a list of mirrors for that one file, but we want the list
                        # of mirror baseurls. Joy of reusing other people's stds. :)
                        if not _url.text.endswith("/repodata/repomd.xml"):
                            continue
                        returnlist.append(_url.text[:-len("/repodata/repomd.xml")])
        except Exception as exc:
            # If no metalink XML, we try to read a mirrorlist
            for line in content:
                if re.match('^\s*\#.*', line) or re.match('^\s*$', line):
                    continue
                mirror = re.sub('\n$', '', line) # no more trailing \n's
                (mirror, count) = re.subn('\$ARCH', '$BASEARCH', mirror)
                returnlist.append(mirror)

        returnlist = _replace_and_check_url(returnlist)

        try:
           # Write the final mirrorlist that is going to be pass to Zypper
           with open(mirrorlist_path, 'w') as mirrorlist_file:
               mirrorlist_file.write(os.linesep.join(returnlist))
        except Exception as exc:
            self.error_msg("Could not write the calculated mirrorlist: {}".format(exc))
        return returnlist

    def setup_repo(self, repo, uln_repo=False):
        """
        Setup repository and fetch metadata
        """
        self.zypposync = ZyppoSync(root=repo.root)
        zypp_repo_url = self._prep_zypp_repo_url(self.url, uln_repo)

        mirrorlist = self._get_mirror_list(repo, self.url)
        if mirrorlist:
            repo.baseurl = mirrorlist
        repo.urls = repo.baseurl

        # Manually call Zypper
        repo_cfg = '''[{reponame}]
enabled=1
autorefresh=0
{repo_url}={url}
gpgcheck={gpgcheck}
repo_gpgcheck={gpgcheck}
type=rpm-md
'''
        if uln_repo:
           _url = 'plugin:spacewalk-uln-resolver?url={}'.format(zypp_repo_url)
        elif self.http_headers:
           _url = 'plugin:spacewalk-extra-http-headers?url={}&repo_name={}&channel_label={}'.format(quote(zypp_repo_url), self.name, self.channel_label)
        else:
           _url = zypp_repo_url if not mirrorlist else os.path.join(repo.root, 'mirrorlist.txt')

        with open(os.path.join(repo.root, "etc/zypp/repos.d", str(self.channel_label or self.reponame) + ".repo"), "w") as repo_conf_file:
            repo_conf_file.write(repo_cfg.format(
                reponame=self.channel_label or self.reponame,
                repo_url='baseurl' if not mirrorlist else 'mirrorlist',
                url=_url,
                gpgcheck="0" if self.insecure else "1"
            ))
        zypper_cmd = "zypper"
        if not self.interactive:
            zypper_cmd = "{} -n".format(zypper_cmd)
        ret_error = os.system("{} --root {} --reposd-dir {} --cache-dir {} --raw-cache-dir {} --solv-cache-dir {} ref".format(
            zypper_cmd,
            REPOSYNC_ZYPPER_ROOT,
            os.path.join(repo.root, "etc/zypp/repos.d/"),
            REPOSYNC_ZYPPER_RPMDB_PATH,
            os.path.join(repo.root, "var/cache/zypp/raw/"),
            os.path.join(repo.root, "var/cache/zypp/solv/")
        ))
        if ret_error:
            raise RepoMDError("Cannot access repository. Maybe repository GPG keys are not imported")

        repo.is_configured = True

    def error_msg(self, message):
        rhnLog.log_clean(0, message)
        sys.stderr.write(str(message) + "\n")

    def _prep_zypp_repo_url(self, url, uln_repo):
        """
        Prepare the repository baseurl to use in the Zypper repo file.
        This will add the HTTP Proxy and Client certificate settings as part of
        the url parameters to be interpreted by CURL during the Zypper execution.

        :returns: str
        """
        ret_url = None
        query_params = {}
        if self.proxy_hostname:
            query_params['proxy'] = self.proxy_hostname
        if self.proxy_user:
            query_params['proxyuser'] = self.proxy_user
        if self.proxy_pass:
            query_params['proxypass'] = self.proxy_pass
        if self.sslcacert:
            # Since Zypper only accepts CAPATH, we need to split the certificates bundle
            # and run "c_rehash" on our custom CAPATH
            _ssl_capath = os.path.dirname(self.sslcacert)
            msg = "Preparing custom SSL CAPATH at {}".format(_ssl_capath)
            rhnLog.log_clean(0, msg)
            sys.stdout.write(str(msg) + "\n")
            os.system("awk 'BEGIN {{c=0;}} /BEGIN CERT/{{c++}} {{ print > \"{0}/cert.\" c \".pem\"}}' < {1}".format(_ssl_capath, self.sslcacert))
            os.system("c_rehash {} 2&>1 /dev/null".format(_ssl_capath))
            query_params['ssl_capath'] = _ssl_capath
        if self.sslclientcert:
            query_params['ssl_clientcert'] = self.sslclientcert
        if self.sslclientkey:
            query_params['ssl_clientkey'] = self.sslclientkey
        new_query = unquote(urlencode(query_params, doseq=True))
        if self.authtoken or uln_repo:
            ret_url = "{0}&{1}".format(url, new_query)
        else:
            ret_url = "{0}?{1}".format(url, new_query) if new_query else url
        return ret_url

    def _md_exists(self, tag):
        """
        Check if the requested metadata exists on the repository

        :returns: bool
        """
        if not self.repo.is_configured:
            self.setup_repo(self.repo)
        return bool(self._retrieve_md_path(tag))

    def _retrieve_md_path(self, tag):
        """
        Return the path to the requested metadata if exists

        :returns: str
        """
        if not self.repo.is_configured:
            self.setup_repo(self.repo)

        _repodata_path = self._get_repodata_path()
        _file_globs = ["/*{}.xml.gz", "/*{}.xml", "/*{}.yaml.gz", "/*{}.yaml"]
        for f in _file_globs:
            _md_files = glob.glob(_repodata_path + f.format(tag))
            if _md_files:
                return _md_files[0]
        return None

    def _get_repodata_path(self):
        """
        Return the path to the repository repodata directory

        :returns: str
        """
        if not self.repo.is_configured:
            self.setup_repo(self.repo)
        return os.path.join(self.repo.root, ZYPP_RAW_CACHE_PATH, self.channel_label or self.reponame, "repodata")

    def get_md_checksum_type(self):
        """
        Return the checksum type of the primary.xml if exists, otherwise
        default output is "sha1".

        :returns: str
        """
        if self._md_exists('repomd'):
            repomd_path = self._retrieve_md_path('repomd')
            infile = repomd_path.endswith('.gz') and gzip.open(repomd_path) or open(repomd_path, 'rt')
            for repodata in etree.parse(infile).getroot():
                if repodata.get('type') == 'primary':
                    checksum_elem = repodata.find(REPO_XML+'checksum')
                    return checksum_elem.get('type')
        return "sha1"

    def _get_solvable_packages(self):
        """
        Return the full list of solvable packages available at the configured repo.
        This information is read from the solv file created by Zypper.

        :returns: list
        """
        if not self.repo.is_configured:
            self.setup_repo(self.repo)
        self.solv_pool = solv.Pool()
        self.solv_repo = self.solv_pool.add_repo(str(self.channel_label or self.reponame))
        solv_path = os.path.join(self.repo.root, ZYPP_SOLV_CACHE_PATH, self.channel_label or self.reponame, 'solv')
        if not os.path.isfile(solv_path) or not self.solv_repo.add_solv(solv.xfopen(str(solv_path)), 0):
            raise SolvFileNotFound(solv_path)
        self.solv_pool.addfileprovides()
        self.solv_pool.createwhatprovides()
        # Solvables with ":" in name are not packages
        return [pack for pack in self.solv_repo.solvables if ':' not in pack.name]

    def _get_solvable_dependencies(self, solvables):
        """
        Return a list containing all passed solvables and all its calculated dependencies.

        For each solvable we explore the "SOLVABLE_REQUIRES" to add any new solvable where "SOLVABLE_PROVIDES"
        is matching the requirement. All the new solvables that are added will be again processed in order to get
        a new level of dependencies.

        The exploration of dependencies is done when all the solvables are been processed and no new solvables are added

        :returns: list
        """
        if not self.repo.is_configured:
            self.setup_repo(self.repo)
        known_solvables = set()

        new_deps = True
        next_solvables = solvables

        # Collect solvables dependencies in depth
        while new_deps:
            new_deps = False
            for sol in next_solvables:
                # Do not explore dependencies from solvables that are already proceesed
                if sol not in known_solvables:
                    # This solvable has not been proceesed yet. We need to calculate its dependencies
                    known_solvables.add(sol)
                    new_deps = True
                    # Adding solvables that provide the dependencies
                    for _req in sol.lookup_deparray(keyname=solv.SOLVABLE_REQUIRES):
                        next_solvables.extend(self.solv_pool.whatprovides(_req))
        return list(known_solvables)

    def _apply_filters(self, pkglist, filters):
        """
        Return a list of packages where defined filters were applied.

        :returns: list
        """
        if not filters:
            # if there's no include/exclude filter on command line or in database
            for p in self.repo.includepkgs:
                filters.append(('+', [p]))
            for p in self.repo.exclude:
                filters.append(('-', [p]))

        if filters:
            pkglist = self._filter_packages(pkglist, filters)
            pkglist = self._get_solvable_dependencies(pkglist)

            # Do not pull in dependencies if there're explicitly excluded
            pkglist = self._filter_packages(pkglist, filters, True)
            self.num_excluded = self.num_packages - len(pkglist)

        return pkglist

    @staticmethod
    def _fix_encoding(text):
        if text is None:
            return None
        else:
            return str(text)

    @staticmethod
    def _filter_packages(packages, filters, exclude_only=False):
        """ implement include / exclude logic
            filters are: [ ('+', includelist1), ('-', excludelist1),
                           ('+', includelist2), ... ]
        """
        if filters is None:
            return

        selected = []
        excluded = []
        allmatched_include = []
        allmatched_exclude = []
        if exclude_only or filters[0][0] == '-':
            # first filter is exclude, start with full package list
            # and then exclude from it
            selected = packages
        else:
            excluded = packages

        for filter_item in filters:
            sense, pkg_list = filter_item
            regex = fnmatch.translate(pkg_list[0])
            reobj = re.compile(regex)
            if sense == '+':
                if exclude_only:
                    continue
                # include
                for excluded_pkg in excluded:
                    if reobj.match(excluded_pkg.name):
                        allmatched_include.insert(0, excluded_pkg)
                        selected.insert(0, excluded_pkg)
                for pkg in allmatched_include:
                    if pkg in excluded:
                        excluded.remove(pkg)
            elif sense == '-':
                # exclude
                for selected_pkg in selected:
                    if reobj.match(selected_pkg.name):
                        allmatched_exclude.insert(0, selected_pkg)
                        excluded.insert(0, selected_pkg)

                for pkg in allmatched_exclude:
                    if pkg in selected:
                        selected.remove(pkg)
                excluded = (excluded + allmatched_exclude)
            else:
                raise IOError("Filters are malformed")
        return selected

    def get_susedata(self):
        """
        Return susedata metadata from the repository if available

        :returns: list
        """
        susedata = []
        if self._md_exists('susedata'):
            data_path = self._retrieve_md_path('susedata')
            infile = data_path.endswith('.gz') and gzip.open(data_path) or open(data_path, 'rt')
            for package in etree.parse(infile).getroot():
                d = {}
                d['pkgid'] = package.get('pkgid')
                d['name'] = package.get('name')
                d['arch'] = package.get('arch')
                d['keywords'] = []
                for child in package:
                    # we use "endswith" because sometimes it has a namespace
                    # and sometimes not :-(
                    if child.tag.endswith('version'):
                        d['version'] = child.get('ver')
                        d['release'] = child.get('rel')
                        d['epoch'] = child.get('epoch')
                        if d['epoch'] == '0' or d['epoch'] == '':
                            d['epoch'] = None
                        if child.get('arch'):
                            d['arch'] = child.get('arch')

                    elif child.tag.endswith('keyword'):
                        d['keywords'].append(child.text)
                    elif child.tag == 'eula':
                        d['eula'] = child.text
                susedata.append(d)
        return susedata

    def get_products(self):
        """
        Return products metadata from the repository if available

        :returns: list
        """
        products = []
        if self._md_exists('products'):
            data_path = self._retrieve_md_path('products')
            infile = data_path.endswith('.gz') and gzip.open(data_path) or open(data_path, 'rt')
            for product in etree.parse(infile).getroot():
                p = {}
                p['name'] = product.find('name').text
                p['arch'] = product.find('arch').text
                version = product.find('version')
                p['version'] = version.get('ver')
                p['release'] = version.get('rel')
                p['epoch'] = version.get('epoch')
                p['vendor'] = self._fix_encoding(product.find('vendor').text)
                p['summary'] = self._fix_encoding(product.find('summary').text)
                p['description'] = self._fix_encoding(product.find('description').text)
                if p['epoch'] == '0':
                    p['epoch'] = None
                products.append(p)
        return products

    def get_updates(self):
        """
        Return update metadata from the repository if available

        :returns: list
        """
        if self._md_exists('updateinfo'):
            notices = {}
            updates_path = self._retrieve_md_path('updateinfo')
            infile = updates_path.endswith('.gz') and gzip.open(updates_path) or open(updates_path, 'rt')
            for _event, elem in etree.iterparse(infile):
                if elem.tag == 'update':
                    un = UpdateNotice(elem)
                    key = un['update_id']
                    key = "%s-%s" % (un['update_id'], un['version'])
                    if key not in notices:
                        notices[key] = un
            return ('updateinfo', notices.values())
        elif self._md_exists('patches'):
            patches_path = self._retrieve_md_path('patches')
            infile = patches_path.endswith('.gz') and gzip.open(patches_path) or open(patches_path, 'rt')
            notices = []
            for patch in etree.parse(infile).getroot():
                checksum_elem = patch.find(PATCHES_XML+'checksum')
                location_elem = patch.find(PATCHES_XML+'location')
                relative = location_elem.get('href')
                checksum_type = checksum_elem.get('type')
                checksum = checksum_elem.text
                filename = os.path.join(self._get_repodata_path(), os.path.basename(relative))
                try:
                    notices.append(etree.parse(filename).getroot())
                except SyntaxError as e:
                    self.error_msg("Could not parse %s. "
                                   "The file is not a valid XML document. %s" %
                                   (filename, e.msg))
                    continue
            return ('patches', notices)
        else:
            return ('', [])

    def get_groups(self):
        """
        Return path to the repository groups metadata file if available

        :returns: str
        """
        # groups -> /var/cache/rhn/reposync/1/CentOS_7_os_x86_64/bc140c8149fc43a5248fccff0daeef38182e49f6fe75d9b46db1206dc25a6c1c-c7-x86_64-comps.xml.gz
        groups = None
        if self._md_exists('comps'):
            groups = self._retrieve_md_path('comps')
        return groups

    def get_modules(self):
        """
        Return path to the repository modules metadata file if available

        :returns: str
        """
        modules = None
        if self._md_exists('modules'):
            modules = self._retrieve_md_path('modules')
        return modules

    def get_mediaproducts(self):
        """
        Return path to media.1/products file if available

        :returns: str
        """
        media_products_path = os.path.join(self._get_repodata_path(), 'media.1/products')
        try:
            (s,b,p,q,f,o) = urlparse(self.url)
            if p[-1] != '/':
                p = p + '/'
            p = p + 'media.1/products'
        except (ValueError, IndexError, KeyError) as e:
            return None
        url = urlunparse((s,b,p,q,f,o))
        try:
            urlgrabber_opts = {}
            self.set_download_parameters(urlgrabber_opts, url, media_products_path)
            urlgrabber.urlgrab(url, media_products_path, **urlgrabber_opts)
        except Exception as exc:
            # no 'media.1/products' file found
            return None
        return media_products_path

    def raw_list_packages(self, filters=None):
        """
        Return a raw list of available packages.

        :returns: list
        """
        rawpkglist = [RawSolvablePackage(solvable) for solvable in self._get_solvable_packages()]
        return self._apply_filters(rawpkglist, filters)

    def list_packages(self, filters, latest):
        """
        List available packages.

        :returns: list
        """
        pkglist = self._get_solvable_packages()
        pkglist.sort(key = cmp_to_key(self._sort_packages))
        self.num_packages = len(pkglist)
        pkglist = self._apply_filters(pkglist, filters)

        if latest:
            latest_pkgs = {}
            new_pkgs = []
            for pkg in pkglist:
               ident = '{}.{}'.format(pkg.name, pkg.arch)
               if ident not in latest_pkgs.keys() or LooseVersion(str(pkg.evr)) > LooseVersion(str(latest_pkgs[ident].evr)):
                  latest_pkgs[ident] = pkg
            pkglist = list(latest_pkgs.values())

        to_return = []
        for pack in pkglist:
            new_pack = ContentPackage()
            epoch, version, release = RawSolvablePackage._parse_solvable_evr(pack.evr)
            new_pack.setNVREA(pack.name, version, release, epoch, pack.arch)
            new_pack.unique_id = RawSolvablePackage(pack)
            checksum = pack.lookup_checksum(solv.SOLVABLE_CHECKSUM)
            new_pack.checksum_type = checksum.typestr()
            new_pack.checksum = checksum.hex()
            to_return.append(new_pack)
        return to_return

    @staticmethod
    def _sort_packages(pkg1, pkg2):
        """sorts a list of deb package dicts by name"""
        if pkg1.name > pkg2.name:
            return 1
        elif pkg1.name == pkg2.name:
            return 0
        else:
            return -1

    def clear_cache(self, directory=None, keep_repomd=False):
        """
        Clear all cache files from the environment.

        """
        if directory is None:
            directory = self.repo.root

        # remove content in directory
        for item in os.listdir(directory):
            path = os.path.join(directory, item)
            if os.path.isfile(path) and not (keep_repomd and item == "repomd.xml"):
                os.unlink(path)
            elif os.path.isdir(path):
                rmtree(path)

    def get_metadata_paths(self):
        """
        Simply return the 'primary' and 'updateinfo' path from repomd

        Example output:
        [
            (
                'repodata/bc140c8149fc43a5248fccff0daeef38182e49f6fe75d9b46db1206dc25a6c1c-c7-x86_64-comps.xml.gz',
                ('sha256', 'bc140c8149fc43a5248fccff0daeef38182e49f6fe75d9b46db1206dc25a6c1c')
            ),
            (
                'repodata/6614b3605d961a4aaec45d74ac4e5e713e517debb3ee454a1c91097955780697-primary.sqlite.bz2',
                ('sha256', '6614b3605d961a4aaec45d74ac4e5e713e517debb3ee454a1c91097955780697')
            )
        ]

        :returns: list
        """
        def get_location(data_item):
            for sub_item in data_item:
                if sub_item.tag.endswith("location"):
                    return sub_item.attrib.get("href")

        def get_checksum(data_item):
            for sub_item in data_item:
                if sub_item.tag.endswith("checksum"):
                    return sub_item.attrib.get("type"), sub_item.text

        if self._md_exists('repomd'):
            repomd_path = self._retrieve_md_path('repomd')
        else:
            raise RepoMDError(self._get_repodata_path())
        repomd = open(repomd_path, 'rb')
        files = {}
        for _event, elem in etree.iterparse(repomd):
            if elem.tag.endswith("data"):
                if elem.attrib.get("type") == "primary_db":
                    files['primary'] = (get_location(elem), get_checksum(elem))
                elif elem.attrib.get("type") == "primary" and 'primary' not in files:
                    files['primary'] = (get_location(elem), get_checksum(elem))
                elif elem.attrib.get("type") == "updateinfo":
                    files['updateinfo'] = (get_location(elem), get_checksum(elem))
                elif elem.attrib.get("type") == "group_gz":
                    files['group'] = (get_location(elem), get_checksum(elem))
                elif elem.attrib.get("type") == "group" and 'group' not in files:
                    files['group'] = (get_location(elem), get_checksum(elem))
                elif elem.attrib.get("type") == "modules":
                    files['modules'] = (get_location(elem), get_checksum(elem))
        repomd.close()
        return list(files.values())

    def repomd_up_to_date(self):
        """
        Check if repomd.xml has been updated by spacewalk.

        :returns: bool
        """
        if self._md_exists('repomd'):
            repomd_old_path = self._retrieve_md_path('repomd')
            repomd_new_path = os.path.join(self._get_repodata_path(), "repomd.xml.new")
            # Newer file not available? Don't do anything. It should be downloaded before this.
            if not os.path.isfile(repomd_new_path):
                return True
            return checksum.getFileChecksum('sha256', filename=repomd_old_path) == checksum.getFileChecksum('sha256', filename=repomd_new_path)
        else:
            return False

    # Get download parameters for threaded downloader
    def set_download_parameters(self, params, relative_path, target_file, checksum_type=None,
                                checksum_value=None, bytes_range=None):
        # Create directories if needed
        target_dir = os.path.dirname(target_file)
        if not os.path.exists(target_dir):
            os.makedirs(target_dir, int('0755', 8))

        params['authtoken'] = self.authtoken
        params['urls'] = self.repo.urls
        params['relative_path'] = relative_path
        params['authtoken'] = self.authtoken
        params['target_file'] = target_file
        params['ssl_ca_cert'] = self.sslcacert
        params['ssl_client_cert'] = self.sslclientcert
        params['ssl_client_key'] = self.sslclientkey
        params['checksum_type'] = checksum_type
        params['checksum'] = checksum_value
        params['bytes_range'] = bytes_range
        params['proxy'] = self.proxy_url
        params['proxy_username'] = self.proxy_user
        params['proxy_password'] = self.proxy_pass
        params['http_headers'] = self.http_headers
        # Older urlgrabber compatibility
        params['proxies'] = get_proxies(self.proxy_url, self.proxy_user, self.proxy_pass)

    def get_file(self, path, local_base=None):
        try:
            try:
                temp_file = ""
                if local_base is not None:
                    target_file = os.path.join(local_base, path)
                    target_dir = os.path.dirname(target_file)
                    if not os.path.exists(target_dir):
                        os.makedirs(target_dir, int('0755', 8))
                    temp_file = target_file + '..download'
                    if os.path.exists(temp_file):
                        os.unlink(temp_file)
                    downloaded = urlgrabber.urlgrab(path, temp_file)
                    os.rename(downloaded, target_file)
                    return target_file
                else:
                    return urlgrabber.urlread(path)
            except urlgrabber.URLGrabError:
                return
        finally:
            if os.path.exists(temp_file):
                os.unlink(temp_file)

    def set_ssl_options(self, ca_cert, client_cert, client_key):
        self.sslcacert = ca_cert
        self.sslclientcert = client_cert
        self.sslclientkey = client_key

    def _authenticate(self, url):
        pass
 070701000000DF000081B40000000000000000000000015FBBE8EE0001A25F000000000000000000000000000000000000002E00000000spacewalk-backend/satellite_tools/reposync.py #
# Copyright (c) 2008--2018 Red Hat, Inc.
# Copyright (c) 2010--2011 SUSE Linux Products GmbH
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import os
import re
import shutil
import socket
import subprocess
import sys
import time
import traceback
import base64
from datetime import datetime
try:
    from html.parser import HTMLParser
except ImportError:
    from HTMLParser import HTMLParser
from dateutil.parser import parse as parse_date
from xml.dom import minidom
import gzip
from dateutil.tz import tzutc
import gettext
import errno
import multiprocessing

from rhn.connections import idn_puny_to_unicode

from uyuni.common.usix import raise_with_tb

from spacewalk.server import rhnPackage, rhnSQL, rhnChannel, suseEula
from uyuni.common import fileutils
from spacewalk.common import rhnLog, rhnCache, rhnMail, suseLib
from spacewalk.common.rhnTB import fetchTraceback
from spacewalk.common import repo
from uyuni.common.rhnLib import isSUSE, utc
from uyuni.common.checksum import getFileChecksum
from spacewalk.common.rhnConfig import CFG, initCFG
from spacewalk.common.rhnException import rhnFault
from spacewalk.server.importlib import importLib, mpmSource, packageImport, errataCache
from spacewalk.server.importlib.packageImport import ChannelPackageSubscription
from spacewalk.server.importlib.backendOracle import SQLBackend
from spacewalk.server.importlib.errataImport import ErrataImport
from spacewalk.satellite_tools.download import ThreadedDownloader, ProgressBarLogger, TextLogger
from spacewalk.satellite_tools.repo_plugins import CACHE_DIR
from spacewalk.satellite_tools.repo_plugins import yum_src
from spacewalk.server import taskomatic, rhnPackageUpload
from spacewalk.satellite_tools.satCerts import verify_certificate_dates
from spacewalk.satellite_tools.syncLib import log, log2, log2disk, dumpEMAIL_LOG, log2background

translation = gettext.translation('spacewalk-backend-server', fallback=True)
_ = translation.gettext
hostname = socket.gethostname()
if '.' not in hostname:
    hostname = socket.getfqdn()


default_log_location = '/var/log/rhn/'
relative_comps_dir = 'rhn/comps'
relative_modules_dir = 'rhn/modules'
relative_mediaproducts_dir = 'suse/media.1'
checksum_cache_filename = 'reposync/checksum_cache'
default_import_batch_size = 20

errata_typemap = {
    'security': 'Security Advisory',
    'recommended': 'Bug Fix Advisory',
    'bugfix': 'Bug Fix Advisory',
    'optional': 'Product Enhancement Advisory',
    'feature': 'Product Enhancement Advisory',
    'enhancement': 'Product Enhancement Advisory'
}

# namespace prefixes for parsing SUSE patches XML files
YUM = "{http://linux.duke.edu/metadata/common}"
RPM = "{http://linux.duke.edu/metadata/rpm}"
SUSE = "{http://novell.com/package/metadata/suse/common}"
PATCH = "{http://novell.com/package/metadata/suse/patch}"

class ChannelException(Exception):
    """Channel Error"""
    def __init__(self, value=None):
        Exception.__init__(self)
        self.value = value
    def __str__(self):
        return "%s" %(self.value,)

    def __unicode__(self):
        return self.value

class ChannelTimeoutException(ChannelException):
    """Channel timeout error e.g. a remote repository is not responding"""
    pass

def send_mail(sync_type="Repo"):
    """ Send email summary """
    body = dumpEMAIL_LOG()
    if body:
        print((_("+++ sending log as an email +++")))
        host_label = idn_puny_to_unicode(os.uname()[1])
        headers = {
            'Subject': _("%s sync. report from %s") % (sync_type, host_label),
        }
        comp = CFG.getComponent()
        initCFG('web')
        sndr = "root@%s" % host_label
        if CFG.default_mail_from:
            sndr = CFG.default_mail_from
        rhnMail.send(headers, body, sender=sndr)
        initCFG(comp)
    else:
        print((_("+++ email requested, but there is nothing to send +++")))


class KSDirParser:
    file_blacklist = ["release-notes/"]

    def __init__(self):
        self.dir_content = []

    def get_content(self):
        return self.dir_content


class KSDirHtmlParser(KSDirParser):
    def __init__(self, plug, dir_name):
        KSDirParser.__init__(self)

        dir_html = plug.get_file(dir_name)
        if dir_html is None:
            return

        for s in (m.group(1) for m in re.finditer(r'(?i)<a href="(.+?)"', dir_html)):
            if not (re.match(r'/', s) or re.search(r'\?', s) or re.search(r'\.\.', s) or re.match(r'[a-zA-Z]+:', s) or
                    re.search(r'\.rpm$', s)):
                if re.search(r'/$', s):
                    file_type = 'DIR'
                else:
                    file_type = 'FILE'

                if s not in (self.file_blacklist):
                    self.dir_content.append({'name': s, 'type': file_type})


class KSDirLocalParser(KSDirParser):
    def __init__(self, base_dir, dir_name):
        KSDirParser.__init__(self)
        dir_path = os.path.join(base_dir, dir_name)
        for dir_item in os.listdir(dir_path):
            if not dir_item.endswith(".rpm"):
                dir_item_path = os.path.join(dir_path, dir_item)
                if os.path.isdir(dir_item_path):
                    file_type = 'DIR'
                    dir_item = "%s/" % dir_item
                else:
                    file_type = 'FILE'
                if dir_item not in self.file_blacklist:
                    self.dir_content.append({'name': dir_item, 'type': file_type})


class TreeInfoError(Exception):
    pass


class TreeInfoParser(object):
    def __init__(self, filename):
        self.parser = ConfigParser.RawConfigParser()
        # do not lowercase
        self.parser.optionxform = str
        fp = open(filename)
        try:
            try:
                self.parser.readfp(fp)
            except ConfigParser.ParsingError:
                raise TreeInfoError("Could not parse treeinfo file!")
        finally:
            if fp is not None:
                fp.close()

    def get_images(self):
        files = []
        for section_name in self.parser.sections():
            if section_name.startswith('images-') or section_name == 'stage2':
                for item in self.parser.items(section_name):
                    files.append(item[1])
        return files

    def get_family(self):
        for section_name in self.parser.sections():
            if section_name == 'general':
                for item in self.parser.items(section_name):
                    if item[0] == 'family':
                        return item[1]

    def get_major_version(self):
        for section_name in self.parser.sections():
            if section_name == 'general':
                for item in self.parser.items(section_name):
                    if item[0] == 'version':
                        return item[1].split('.')[0]

    def get_package_dir(self):
        for section_name in self.parser.sections():
            if section_name == 'general':
                for item in self.parser.items(section_name):
                    if item[0] == 'packagedir':
                        return item[1]

    def get_addons(self):
        addons_dirs = []
        for section_name in self.parser.sections():
            # check by name
            if section_name.startswith('addon-'):
                for item in self.parser.items(section_name):
                    if item[0] == 'repository':
                        addons_dirs.append(item[1])
            # check by type
            else:
                repository = None
                repo_type = None
                for item in self.parser.items(section_name):
                    if item[0] == 'repository':
                        repository = item[1]
                    elif item[0] == 'type':
                        repo_type = item[1]

                if repo_type == 'addon' and repository is not None:
                    addons_dirs.append(repository)

        return addons_dirs


def set_filter_opt(option, opt_str, value, parser):
    # pylint: disable=W0613
    if opt_str in ['--include', '-i']:
        f_type = '+'
    else:
        f_type = '-'
    parser.values.filters.append((f_type, [v.strip() for v in value.split(',') if v.strip()]))


def getChannelRepo():

    initCFG('server.satellite')
    rhnSQL.initDB()
    items = {}
    sql = """
           select s.source_url, c.label
             from rhnChannel c
        left join rhnChannelContentSource cs on cs.channel_id=c.id
        left join rhnContentSource s on s.id = cs.source_id
            where s.source_url is not null
               or c.org_id is null
           """
    h = rhnSQL.prepare(sql)
    h.execute()
    while 1:
        row = h.fetchone_dict()
        if not row:
            break
        if not row['label'] in items:
            items[row['label']] = []
        if row['source_url']:
            items[row['label']] += [row['source_url']]

    return items


def getParentsChilds(b_only_custom=False):

    initCFG('server.satellite')
    rhnSQL.initDB()

    sql = """
        select c1.label, c2.label parent_channel, c1.id
        from rhnChannel c1 left outer join rhnChannel c2 on c1.parent_channel = c2.id
        order by c2.label desc, c1.label asc
    """
    h = rhnSQL.prepare(sql)
    h.execute()
    d_parents = {}
    while 1:
        row = h.fetchone_dict()
        if not row:
            break
        if not b_only_custom or rhnChannel.isCustomChannel(row['id']):
            parent_channel = row['parent_channel']
            if not parent_channel:
                d_parents[row['label']] = []
            else:
                # If the parent is not a custom channel treat the child like
                # it's a parent for our purposes
                if parent_channel not in d_parents:
                    d_parents[row['label']] = []
                else:
                    d_parents[parent_channel].append(row['label'])

    return d_parents


def getCustomChannels():

    # with SUSE we sync also Vendor channels with reposync
    # change parameter to False to get not only Custom Channels
    d_parents = getParentsChilds(False)
    l_custom_ch = []

    for ch in d_parents:
        l_custom_ch += [ch] + d_parents[ch]

    return l_custom_ch


def write_ssl_set_cache(ca_cert, client_cert, client_key):
    """Write one SSL set into cache directory and return path to files."""
    def create_dir_tree(path):
        try:
            os.makedirs(path, int('0750', 8))
        except OSError:
            exc = sys.exc_info()[1]
            if exc.errno == errno.EEXIST and os.path.isdir(path):
                pass
            else:
                raise

    filenames = {}
    for cert in (ca_cert, client_cert, client_key):
        (name, pem, org) = cert
        filenames[cert] = None
        if name is not None and pem is not None:
            if not org:
                org = "NULL"
            else:
                org = str(org)
            ssldir = os.path.join(CACHE_DIR, '.ssl-certs', org)
            cert_file = os.path.join(ssldir, "%s.pem" % name)
            if not os.path.exists(cert_file):
                create_dir_tree(ssldir)
                f = open(cert_file, "wb")
                f.write(pem)
                f.close()
            filenames[cert] = cert_file

    return filenames[ca_cert], filenames[client_cert], filenames[client_key]


def clear_ssl_cache():
    ssldir = os.path.join(CACHE_DIR, '.ssl-certs')
    shutil.rmtree(ssldir, True)


def get_single_ssl_set(keys, check_dates=False):
    """Picks one of available SSL sets for given repository."""
    if check_dates:
        for ssl_set in keys:
            if verify_certificate_dates(str(ssl_set['ca_cert'])) and \
                (not ssl_set['client_cert'] or
                 verify_certificate_dates(str(ssl_set['client_cert']))):
                return ssl_set
    # Get first
    else:
        return keys[0]
    return None


class RepoSync(object):

    def __init__(self, channel_label, repo_type=None, url=None, fail=False,
                 filters=None, no_errata=False, sync_kickstart=False, latest=False,
                 metadata_only=False, strict=0, excluded_urls=None, no_packages=False,
                 log_dir="reposync", log_level=None, force_kickstart=False, force_all_errata=False,
                 check_ssl_dates=False, force_null_org_content=False, show_packages_only=False,
                 noninteractive=False, deep_verify=False):
        self.regen = False
        self.fail = fail
        self.filters = filters or []
        self.no_packages = no_packages
        self.no_errata = no_errata
        self.sync_kickstart = sync_kickstart
        self.force_all_errata = force_all_errata
        self.force_kickstart = force_kickstart
        self.latest = latest
        self.metadata_only = metadata_only
        self.ks_tree_type = 'externally-managed'
        self.interactive = not noninteractive
        self.deep_verify = deep_verify
        self.error_messages = []
        self.available_packages = {}
        self.ks_install_type = None
        self.show_packages_only = show_packages_only
        self.regenerate_bootstrap_repo = False

        initCFG('server.susemanager')
        rhnSQL.initDB()

        # setup logging
        log_filename = channel_label + '.log'
        log_path = default_log_location + log_dir + '/' + log_filename
        if log_level is None:
            log_level = 0
        CFG.set('DEBUG', log_level)
        rhnLog.initLOG(log_path, log_level)
        # os.fchown isn't in 2.4 :/
        if isSUSE():
            os.system("chgrp www " + log_path)
        else:
            os.system("chgrp apache " + log_path)

        log2disk(0, "Command: %s" % str(sys.argv))
        log2disk(0, "Sync of channel started.")

        self.channel_label = channel_label
        self.channel = self.load_channel()
        if not self.channel:
            log(0, "Channel %s does not exist." % channel_label)
            sys.exit(1)

        if not self.channel['org_id'] or force_null_org_content:
            self.org_id = None
        else:
            self.org_id = int(self.channel['org_id'])

        if not url:
            # TODO:need to look at user security across orgs
            h = rhnSQL.prepare(
                """
                select s.id, s.source_url, s.metadata_signed, s.label as repo_label, cst.label as repo_type_label
                from rhnContentSource s,
                     rhnChannelContentSource cs,
                     rhnContentSourceType cst
                where s.id = cs.source_id
                  and cst.id = s.type_id
                  and cs.channel_id = :channel_id""")
            h.execute(channel_id=int(self.channel['id']))
            sources = h.fetchall_dict()
            self.urls = []
            if excluded_urls is None:
                excluded_urls = []
            if sources:
                self.urls = self._format_sources(sources, excluded_urls, repo_type)
            else:
                # generate empty metadata and quit
                taskomatic.add_to_repodata_queue_for_channel_package_subscription(
                    [channel_label], [], "server.app.yumreposync")
                rhnSQL.commit()
                log2(0, 0, "Channel has no URL associated", stream=sys.stderr)
                if not self.org_id:
                    # RES base vendor channels do not have a URL. This is not an error
                    sys.exit(0)
                sys.exit(1)
        else:
            if repo_type:
                repo_type_label = repo_type
            else:
                repo_type_label = 'yum'
            self.urls = [{'id': None, 'source_url': url, 'metadata_signed' : 'N', 'repo_label': None, 'repo_type': repo_type_label}]

        if not self.urls:
            log2(0, 0, "Channel %s has no URL associated" % channel_label, stream=sys.stderr)

        self.repo_plugin = None
        self.strict = strict
        self.all_packages = set()
        self.all_errata = set()
        self.check_ssl_dates = check_ssl_dates
        # Init cache for computed checksums to not compute it on each reposync run again
        #self.checksum_cache = rhnCache.get(checksum_cache_filename)
        #if self.checksum_cache is None:
        #    self.checksum_cache = {}
        self.arches = self.get_compatible_arches(int(self.channel['id']))
        self.import_batch_size = default_import_batch_size

    def set_import_batch_size(self, batch_size):
        self.import_batch_size = int(batch_size)

    def set_urls_prefix(self, prefix):
        """If there are relative urls in DB, set their real location in runtime"""
        for index, url in enumerate(self.urls):
            # Make list, add prefix, make tuple and save
            url = list(url)
            url[1] = "%s%s" % (prefix, url[1])
            url = tuple(url)
            self.urls[index] = url

    def sync(self, update_repodata=True):
        """Trigger a reposync"""
        failed_packages = 0
        sync_error = 0
        repo_checksum_type = 'sha1'
        start_time = datetime.now()
        for data in self.urls:
            data['source_url'] = self.set_repo_credentials(data)
            insecure = False
            if data['metadata_signed'] == 'N':
                insecure = True

            plugin = None
            repo_type = data['repo_type']

            for url in data['source_url']:
                try:
                    if '://' not in url:
                        raise Exception("Unknown protocol in repo URL: %s" % url)

                    # If the repository uses a uln:// URL, switch to the ULN plugin, overriding the command-line
                    if url.startswith("uln://"):
                        repo_type = "uln"

                    is_non_local_repo = (url.find("file:/") < 0)
                    self.repo_plugin = self.load_plugin(repo_type)

                    if data['repo_label']:
                        repo_name = data['repo_label']
                    else:
                        # use modified relative_url as name of repo plugin, because
                        # it used as name of cache directory as well
                        relative_url = '_'.join(url.split('://')[1].split('/')[1:])
                        repo_name = relative_url.replace("?", "_").replace("&", "_").replace("=", "_")

                    ca_cert_file = client_cert_file = client_key_file = repo_id = None

                    if data['id'] is not None:
                        h = rhnSQL.execute("""
                        select k1.description as ca_cert_name, k1.key as ca_cert, k1.org_id as ca_cert_org,
                               k2.description as client_cert_name, k2.key as client_cert, k2.org_id as client_cert_org,
                               k3.description as client_key_name, k3.key as client_key, k3.org_id as client_key_org
                        from rhncontentsource cs inner join
                             rhncontentsourcessl csssl on cs.id = csssl.content_source_id inner join
                             rhncryptokey k1 on csssl.ssl_ca_cert_id = k1.id left outer join
                             rhncryptokey k2 on csssl.ssl_client_cert_id = k2.id left outer join
                             rhncryptokey k3 on csssl.ssl_client_key_id = k3.id
                        where cs.id = :repo_id
                        """, repo_id=int(data['id']))
                        keys = []
                        while True:
                            row = h.fetchone_dict()
                            if row is None:
                                break
                            for col in ['ca_cert', 'client_cert', 'client_key']:
                                row[col] = rhnSQL.read_lob(row[col])
                            keys.append(row)
                        if keys:
                            ssl_set = get_single_ssl_set(keys, check_dates=self.check_ssl_dates)
                            if ssl_set:
                                (ca_cert_file, client_cert_file, client_key_file) = write_ssl_set_cache(
                                    (ssl_set['ca_cert_name'], ssl_set['ca_cert'], ssl_set['ca_cert_org']),
                                    (ssl_set['client_cert_name'], ssl_set['client_cert'], ssl_set['client_cert_org']),
                                    (ssl_set['client_key_name'], ssl_set['client_key'], ssl_set['client_key_org']))
                            else:
                                raise ValueError("No valid SSL certificates were found for repository.")

                    try:
                        plugin = self.repo_plugin(url, repo_name, insecure, self.interactive,
                                                  org=str(self.org_id or ''),
                                                  channel_label=self.channel_label,
                                                  ca_cert_file=ca_cert_file,
                                                  client_cert_file=client_cert_file,
                                                  client_key_file=client_key_file)
                    except repo.GeneralRepoException as exc:
                        log(0, "Plugin error: {}".format(exc))
                        sync_error = -1
                    except Exception as exc:
                        log(0, "Unhandled error occurred: {}".format(exc))
                        raise

                    if self.show_packages_only:
                        self.show_packages(plugin, repo_id)
                    elif plugin is not None:
                        if update_repodata:
                            plugin.clear_cache()

                        # update the checksum type of channels with org_id NULL
                        # this fetch also the normal xml primary file
                        repo_checksum_type = plugin.get_md_checksum_type()

                        if not self.no_packages:
                            self.import_groups(plugin)
                            if repo_type == "yum":
                                self.import_modules(plugin)
                            ret = self.import_packages(plugin, data['id'], url, is_non_local_repo)
                            failed_packages += ret

                        if not self.no_errata:
                            self.import_updates(plugin)

                        self.import_mediaproducts(plugin)

                        # only for repos obtained from the DB
                        if self.sync_kickstart and data['repo_label']:
                            try:
                                self.import_kickstart(plugin, data['repo_label'], is_non_local_repo)
                            except:
                                rhnSQL.rollback()
                                raise
                        self.import_products(plugin)
                        self.import_susedata(plugin)

                except rhnSQL.SQLError as e:
                    log(0, "SQLError: %s" % e)
                    raise
                except ChannelTimeoutException as e:
                    log(0, e)
                    self.sendErrorMail(str(e))
                    sync_error = -1
                except ChannelException as e:
                    log(0, "ChannelException: %s" % e)
                    self.sendErrorMail("ChannelException: %s" % str(e))
                    sync_error = -1
                except yum_src.RepoMDError as e:
                    if "primary not available" in str(e):
                        taskomatic.add_to_repodata_queue_for_channel_package_subscription(
                            [self.channel_label], [], "server.app.yumreposync")
                        rhnSQL.commit()
                        log(0, "Repository has no packages. (%s)" % e)
                        sync_error = -1
                    else:
                        log(0, "RepoMDError: %s" % e)
                        self.sendErrorMail("RepoMDError: %s" % e)
                        sync_error = -1
                except:
                    log(0, "Unexpected error: %s" % sys.exc_info()[0])
                    log(0, "%s" % traceback.format_exc())
                    self.sendErrorMail(fetchTraceback())
                    sync_error = -1

        # In strict mode unlink all packages from channel which are not synced from current repositories
        if self.strict and sync_error == 0:
            if not self.no_packages:
                channel_packages = rhnSQL.fetchall_dict("""
                    select p.id, ct.label as checksum_type, c.checksum
                    from rhnChannelPackage cp,
                         rhnPackage p,
                         rhnChecksumType ct,
                         rhnChecksum c
                    where cp.channel_id = :channel_id
                      and cp.package_id = p.id
                      and p.checksum_id = c.id
                      and c.checksum_type_id = ct.id
                    """, channel_id=int(self.channel['id'])) or []
                for package in channel_packages:
                    if (package['checksum_type'], package['checksum']) not in self.all_packages:
                        self.disassociate_package(package['checksum_type'], package['checksum'])
                        self.regen = True

            # For custom channels unlink also errata
            if not self.no_errata and self.channel['org_id']:
                channel_errata = self.list_errata()
                for erratum in channel_errata:
                    if erratum not in self.all_errata:
                        self.disassociate_erratum(erratum)
                        self.regen = True

        # Update cache with package checksums
        #rhnCache.set(checksum_cache_filename, self.checksum_cache)
        self.updateChannelChecksumType(repo_checksum_type)
        rhnSQL.commit()
        if self.regen:
            taskomatic.add_to_repodata_queue_for_channel_package_subscription(
                [self.channel_label], [], "server.app.yumreposync")
            taskomatic.add_to_erratacache_queue(self.channel_label)
        self.update_date()
        rhnSQL.commit()
        if CFG.AUTO_GENERATE_BOOTSTRAP_REPO and self.regenerate_bootstrap_repo:
            log(0, '  Regenerating bootstrap repositories.')
            subprocess.call(["/usr/sbin/mgr-create-bootstrap-repo", "--auto"])

        # update permissions
        fileutils.createPath(os.path.join(CFG.MOUNT_POINT, 'rhn'))  # if the directory exists update ownership only
        for root, dirs, files in os.walk(os.path.join(CFG.MOUNT_POINT, 'rhn')):
            for d in dirs:
                fileutils.setPermsPath(os.path.join(root, d), group='www')
            for f in files:
                fileutils.setPermsPath(os.path.join(root, f), group='www')
        elapsed_time = datetime.now() - start_time
        if self.error_messages:
            self.sendErrorMail("Repo Sync Errors: %s" % '\n'.join(self.error_messages))
            sync_error = -1
        if sync_error == 0 and failed_packages == 0:
            log(0, "Sync completed.")
        # if there is no global problems, but some packages weren't synced
        if sync_error == 0 and failed_packages > 0:
            sync_error = failed_packages
        return elapsed_time, sync_error

    def set_ks_tree_type(self, tree_type='externally-managed'):
        self.ks_tree_type = tree_type

    def set_ks_install_type(self, install_type='generic_rpm'):
        self.ks_install_type = install_type

    def update_date(self):
        """ Updates the last sync time"""
        h = rhnSQL.prepare("""update rhnChannel set LAST_SYNCED = current_timestamp
                             where label = :channel""")
        h.execute(channel=self.channel['label'])

    def load_plugin(self, repo_type):
        """Try to import the repository plugin required to sync the repository

        :repo_type: type of the repository; only 'yum' is currently supported

        """
        name = repo_type + "_src"
        mod = __import__('spacewalk.satellite_tools.repo_plugins', globals(), locals(), [name])
        try:
            submod = getattr(mod, name)
        except AttributeError:
            log2(0, 0, "Repository type %s is not supported. "
                       "Could not import "
                       "spacewalk.satellite_tools.repo_plugins.%s."
                       % (repo_type, name), stream=sys.stderr)
            sys.exit(1)
        return getattr(submod, "ContentSource")

    def import_updates(self, plug):
        (notices_type, notices) = plug.get_updates()
        log(0, '')
        log(0, "  Patches in repo: %s." % len(notices))
        if notices:
            if notices_type == 'updateinfo':
                self.upload_updates(notices)
            elif notices_type == 'patches':
                self.upload_patches(notices)

    def copy_metadata_file(self, plug, filename, comps_type, relative_dir):
        old_checksum = None
        db_timestamp = datetime.fromtimestamp(0.0, utc)
        basename = os.path.basename(filename)
        log(0, '')
        log(0, "  Importing %s file %s." % (comps_type, basename))
        relativedir = os.path.join(relative_dir, self.channel_label)
        absdir = os.path.join(CFG.MOUNT_POINT, relativedir)
        if not os.path.exists(absdir):
            os.makedirs(absdir)
        compressed_suffixes = ['.gz', '.bz', '.xz']
        if comps_type == 'comps' and not re.match('comps.xml(' + "|".join(compressed_suffixes) + ')*', basename):
            log(0, "  Renaming non-standard filename %s to %s." % (basename, 'comps' + basename[basename.find('.'):]))
            basename = 'comps' + basename[basename.find('.'):]
        relativepath = os.path.join(relativedir, basename)
        abspath = os.path.join(absdir, basename)
        for suffix in compressed_suffixes:
            if basename.endswith(suffix):
                abspath = abspath.rstrip(suffix)
                relativepath = relativepath.rstrip(suffix)

        h = rhnSQL.prepare("""select relative_filename, last_modified
                                from rhnChannelComps
                               where channel_id = :cid
                                 and comps_type_id = (select id from rhnCompsType where label = :ctype)""")
        if h.execute(cid=self.channel['id'], ctype=comps_type):
            (db_filename, db_timestamp) = h.fetchone()
            comps_path = os.path.join(CFG.MOUNT_POINT, db_filename)
            if os.path.isfile(comps_path):
                old_checksum = getFileChecksum('sha256', comps_path)

        src = fileutils.decompress_open(filename)
        dst = open(abspath, "w")
        shutil.copyfileobj(src, dst)
        dst.close()
        src.close()
        if old_checksum and old_checksum != getFileChecksum('sha256', abspath):
            self.regen = True
        log(0, "*** NOTE: Importing {1} file for the channel '{0}'. Previous {1} will be discarded.".format(self.channel['label'], comps_type))

        repoDataKey = 'group' if comps_type == 'comps' else comps_type
        file_timestamp = os.path.getmtime(filename)
        last_modified = datetime.fromtimestamp(float(file_timestamp), utc)


        if db_timestamp >= last_modified:
            # already have newer data, skip updating
            return abspath

        # update or insert
        hu = rhnSQL.prepare("""update rhnChannelComps
                                  set relative_filename = :relpath,
                                      modified = current_timestamp,
                                      last_modified = :last_modified
                                where channel_id = :cid
                                  and comps_type_id = (select id from rhnCompsType where label = :ctype)""")
        hu.execute(cid=self.channel['id'], relpath=relativepath, ctype=comps_type,
                   last_modified=last_modified)

        hi = rhnSQL.prepare("""insert into rhnChannelComps
                              (id, channel_id, relative_filename, last_modified, comps_type_id)
                              (select sequence_nextval('rhn_channelcomps_id_seq'),
                                      :cid,
                                      :relpath,
                                      :last_modified,
                              (select id from rhnCompsType where label = :ctype)
                                 from dual
                                where not exists (select 1 from rhnChannelComps
                                    where channel_id = :cid
                                    and comps_type_id = (select id from rhnCompsType where label = :ctype)))""")
        hi.execute(cid=self.channel['id'], relpath=relativepath, ctype=comps_type,
                   last_modified=last_modified)
        return abspath

    def import_groups(self, plug):
        groupsfile = plug.get_groups()
        if groupsfile:
            abspath = self.copy_metadata_file(plug, groupsfile, 'comps', relative_comps_dir)
            plug.groupsfile = abspath

    def import_modules(self, plug):
        modulesfile = plug.get_modules()
        if modulesfile:
            self.copy_metadata_file(plug, modulesfile, 'modules', relative_modules_dir)

    def import_mediaproducts(self, plug):
        mediaproducts = plug.get_mediaproducts()
        if mediaproducts:
            self.copy_metadata_file(plug, mediaproducts, 'mediaproducts', relative_mediaproducts_dir)

    def _populate_erratum(self, notice):
        patch_name = self._patch_naming(notice)
        existing_errata = self.get_errata(patch_name)
        if existing_errata and not self._is_old_suse_style(notice):
            if int(existing_errata['advisory_rel']) < int(notice['version']):
                # A disaster happens
                #
                # re-releasing an errata with a higher release number
                # only happens in case of a disaster.
                # This should force mirrored repos to remove the old
                # errata and take care that the new one is the only
                # available.
                # This mean a hard overwrite
                self._delete_invalid_errata(existing_errata['id'])
            elif int(existing_errata['advisory_rel']) > int(notice['version']):
                # the existing errata has a higher release than the now
                # parsed one. We need to skip the current errata
                return None
            # else: release match, so we update the errata


        if notice['updated']:
            updated_date = self._to_db_date(notice['updated'])
        else:
            updated_date = self._to_db_date(notice['issued'])
        if (existing_errata and
            not self.errata_needs_update(existing_errata, notice['version'], updated_date)):
            return None

        log(0, "Add Patch %s" % patch_name)
        e = importLib.Erratum()
        e['errata_from']   = notice['from']
        e['advisory'] = e['advisory_name'] = patch_name
        e['advisory_rel']  = notice['version']
        e['advisory_type'] = errata_typemap.get(notice['type'], 'Product Enhancement Advisory')
        e['product']       = notice['release'] or 'Unknown'
        e['description']   = notice['description'] or 'not set'
        e['synopsis']      = notice['title'] or notice['update_id']
        if notice['severity']:
            e['security_impact'] = notice['severity']
            if notice['type'] == 'security' and not e['synopsis'].startswith(notice['severity'] + ': '):
                e['synopsis'] = notice['severity'] + ': ' + e['synopsis']
        else:
            # 'severity' not available in older yum versions
            # set default to Low to get a correct currency rating
            e['security_impact'] = "Low"
        e['topic']         = ' '
        e['solution']      = ' '
        e['issue_date']    = self._to_db_date(notice['issued'])
        e['update_date']   = updated_date
        e['org_id'] = self.org_id
        e['notes']         = ''
        e['refers_to']     = ''
        e['channels']      = [{'label':self.channel_label}]
        e['packages']      = []
        e['files']         = []
        if existing_errata:
            e['channels'].extend(existing_errata['channels'])
            e['packages'] = existing_errata['packages']

        npkgs = [pkg for c in notice['pkglist'] for pkg in c['packages']]

        e['packages'] = self._updates_process_packages(npkgs, e['advisory_name'], e['packages'])
        # One or more package references could not be found in the Database.
        # To not provide incomplete patches we skip this update
        if not e['packages'] and not npkgs:
            log(2, "Advisory %s has empty package list." % e['advisory_name'])
        elif not e['packages']:
            log(2, "Advisory %s skipped because of empty package list (filtered)."
                % e['advisory_name'])
            return None

        e['keywords'] = self._update_keywords(notice)
        e['bugs'] = self._update_bugs(notice)
        e['cve'] = self._update_cve(notice)
        e['locally_modified'] = None
        return e

    def upload_updates(self, notices):
        batch = []
        backend = SQLBackend()
        channel_advisory_names = self.list_errata()
        for notice in notices:
            notice = self.fix_notice(notice)

            # Save advisory names from all repositories
            self.all_errata.add(notice['update_id'])

            # pylint: disable=W0703
            try:
                erratum = self._populate_erratum(notice)
                if not erratum:
                    continue
                batch.append(erratum)

                if self.deep_verify:
                    # import step by step
                    importer = ErrataImport(batch, backend)
                    importer.run()
                    batch = []
            except Exception:
                e = "Skipped %s - %s" % (notice['update_id'], sys.exc_info()[1])
                log2(1, 1, e, stream=sys.stderr)
                if self.fail:
                    raise

        if batch:
            log(0, "    Syncing %s new patch(es) to channel." % len(batch))
            importer = ErrataImport(batch, backend)
            importer.run()
            self.regen = True
        elif notices:
            log(0, "    No new patch to sync.")

    def import_packages(self, plug, source_id, url, is_non_local_repo):
        failed_packages = 0
        if (not self.filters) and source_id:
            h = rhnSQL.prepare("""
                    select flag, filter
                      from rhnContentSourceFilter
                     where source_id = :source_id
                     order by sort_order """)
            h.execute(source_id=source_id)
            filter_data = h.fetchall_dict() or []
            filters = [(row['flag'], [v.strip() for v in row['filter'].split(',') if v.strip()])
                       for row in filter_data]
        else:
            filters = self.filters

        skipped = 0
        saveurl = suseLib.URL(url)
        if saveurl.password:
            saveurl.password = "*******"

        packages = []
        try:
            packages = plug.list_packages(filters, self.latest)
        except repo.GeneralRepoException as exc:
            log(0, "Repository failure: {}".format(exc))
        except Exception as exc:
            log(0, "Unhandled failure occurred while listing repository packages: {}".format(exc))

        to_disassociate = {}
        to_process = []
        num_passed = len(packages)
        log(0, "Repo URL: %s" % saveurl.getURL())
        log(0, "    Packages in repo:             %5d" % plug.num_packages)
        if plug.num_excluded:
            log(0, "    Packages passed filter rules: %5d" % num_passed)
        channel_id = int(self.channel['id'])

        for pack in packages:
            if pack.arch not in self.arches:
                # skip packages with incompatible architecture
                skipped += 1
                continue
            epoch = ''
            if pack.epoch and pack.epoch != '0':
                epoch = "%s:" % pack.epoch
            ident = "%s-%s%s-%s.%s" % (pack.name, epoch, pack.version, pack.release, pack.arch)
            self.available_packages[ident] = 1

            packs = rhnPackage.get_info_for_package(
                [pack.name, pack.version, pack.release, pack.epoch, pack.arch],
                channel_id, self.org_id)
            db_pack = None
            for p in packs:
                if p['checksum'] == pack.checksum:
                    db_pack = p
                    break

            to_download = True
            to_link = True
            # Package exists in DB
            if db_pack:
                # Path in filesystem is defined
                if db_pack['path']:
                    pack.path = os.path.join(CFG.MOUNT_POINT, db_pack['path'])
                else:
                    pack.path = ""

                # if the package exists, but under a different org_id we have to download it again
                if self.metadata_only or self.match_package_checksum(pack, db_pack):
                    # package is already on disk or not required
                    to_download = False
                    if db_pack['channel_id'] == channel_id:
                        # package is already in the channel
                        to_link = False

                    # just pass data from DB, they will be used if there is no RPM available
                    pack.set_checksum(db_pack['checksum_type'], db_pack['checksum'])
                    pack.epoch = db_pack['epoch']

                    self.all_packages.add((pack.checksum_type, pack.checksum))

                elif db_pack['channel_id'] == channel_id:
                    # different package with SAME NVREA
                    # disassociate from channel if it doesn't match package which will be downloaded
                    to_disassociate[(db_pack['checksum_type'], db_pack['checksum'])] = True

            if to_download or to_link:
                if pack.arch in ['src', 'nosrc']:
                    to_link = False
                to_process.append((pack, to_download, to_link))

        num_to_process = len(to_process)
        if num_to_process == 0:
            log(0, "    No new packages to sync.")
            if plug.num_packages == 0:
                self.regen = True
            # If we are just appending, we can exit
            if not self.strict:
                return failed_packages
        else:
            log(0, "    Packages already synced:      %5d" % (num_passed - num_to_process))
            log(0, "    Packages to sync:             %5d" % num_to_process)

        downloader = ThreadedDownloader()
        to_download_count = 0
        for what in to_process:
            pack, to_download, to_link = what
            if to_download:
                target_file = os.path.join(plug.repo.pkgdir, pack.checksum, os.path.basename(pack.unique_id.relativepath))
                pack.path = target_file
                params = {}
                checksum_type = pack.checksum_type
                checksum = pack.checksum
                plug.set_download_parameters(params, pack.unique_id.relativepath, target_file,
                                             checksum_type=checksum_type, checksum_value=checksum)
                downloader.add(params)
                to_download_count += 1
        if num_to_process != 0:
            log(0, "    New packages to download:     %5d" % to_download_count)
            log2(0, 0, "  Downloading packages:")
        logger = TextLogger(None, to_download_count)
        downloader.set_log_obj(logger)
        downloader.run()

        log2background(0, "Importing packages started.")
        log(0, '')
        log(0, '  Importing packages to DB:')

        twisted_batch_indexes = self.twisted_batch_indexes(len(to_process), self.import_batch_size)
        to_process_batches = [[to_process[twisted_index] for twisted_index in twisted_batch] for twisted_batch in twisted_batch_indexes]

        affected_channels = []
        with multiprocessing.Pool(processes=min(os.cpu_count() * 2, 32), maxtasksperchild=1) as pool:
            results = [pool.apply_async(self.import_package_batch, args=[to_process_batch, to_disassociate, is_non_local_repo, i, len(to_process_batches)])
                       for i, to_process_batch in enumerate(to_process_batches)]

            for i, result in enumerate(results):
                affected_channels_batch, failed_packages_batch, all_packages, processed_batch = result.get()
                affected_channels += affected_channels_batch
                failed_packages += failed_packages_batch
                self.all_packages.update(all_packages)
                for j, processed in enumerate(processed_batch):
                    to_process[twisted_batch_indexes[i][j]] = processed

        if affected_channels:
            errataCache.schedule_errata_cache_update(affected_channels)
        log2background(0, "Importing packages finished.")

        # Disassociate packages
        for (checksum_type, checksum) in to_disassociate:
            if to_disassociate[(checksum_type, checksum)]:
                self.disassociate_package(checksum_type, checksum)
        # Do not re-link if nothing was marked to link
        if any([to_link for (pack, to_download, to_link) in to_process]):
            log(0, '')
            log(0, "  Linking packages to the channel.")
            # Packages to append to channel
            import_batches = list(self.chunks(
                [self.associate_package(pack) for (pack, to_download, to_link) in to_process if to_link],
                1000))
            count = 0
            for import_batch in import_batches:
                backend = SQLBackend()
                caller = "server.app.yumreposync"
                importer = ChannelPackageSubscription(import_batch,
                                                      backend, caller=caller, repogen=False)
                importer.run()
                backend.commit()
                del importer.batch
                count += len(import_batch)
                log(0, "    {} packages linked".format(count))
            self.regen = True
            self.regenerate_bootstrap_repo = True
        self._normalize_orphan_vendor_packages()
        return failed_packages

    def twisted_batch_indexes(self, total_size, batch_size):
        """Assume a list of total_size elements, and consider the following two possible divisions of its elements: per "batch" or per "chunk".
        Batches are contiguous sub-lists of the original list with batch_size elements each (and there's batch_count=total_size/batch_size of them).
        Example with total_size = 12 and batch_size = 3, thus batch_count = 4:

        List:    [ 0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11 ]
        Batches: [[0,   1,   2], [3,   4,   5], [6,   7,   8], [9,  10,  11]]

        Chunks are contiguous sub-lists as well, but have batch_count instead of batch_size elements each. Example:

        Chunks:  [[0,   1,   2,   3], [4,   5,   6,   7], [8,   9,  10,  11]]

        This function returns sub-lists of the same size of batches, each with elements sampled from every chunk. Example:

        Twisted: [[0,   4,   8], [1,   5,   9], [2,   6,  10], [3,   7,  11]]

        Intuitively, this rearranges elements across batches so that each batch contains a "sample" of elements from "all over" the original list -
        in particular, from every chunk.
        """
        # integer division rounded up
        batch_count = (total_size + batch_size - 1) // batch_size

        # compute element indexes in all batches
        batches = [[batch_size * batch_index + element_index for element_index in range(0, batch_size)] for batch_index
                   in range(0, batch_count)]

        # twist elements across batches. Specifically: the n-th element in a batch has to be picked from the n-th chunk
        twisted_batches = [[self.twisted_index(batches[i][j], batch_count, batch_size) for j in range(0, batch_size)] for i in
                           range(0, batch_count)]

        # discard elements greater than total_size (those were created because we rounded up earlier)
        return [[twisted_batches[i][j] for j in range(0, batch_size) if twisted_batches[i][j] < total_size] for i in
                  range(0, batch_count)]

    def twisted_index(self, i, batch_count, batch_size):
        batch_index = i // batch_size
        element_index = i % batch_size
        return batch_count * element_index + batch_index

    def import_package_batch(self, to_process, to_disassociate, is_non_local_repo, batch_index, batch_count):
        # Prepare SQL statements
        rhnSQL.closeDB(committing=False, closing=False)
        rhnSQL.initDB()
        h_delete_package_queue = rhnSQL.prepare("""delete from rhnPackageFileDeleteQueue where path = :path""")
        backend = SQLBackend()
        mpm_bin_batch = importLib.Collection()
        mpm_src_batch = importLib.Collection()
        affected_channels = []
        upload_caller = "server.app.uploadPackage"

        to_download_count = sum(p[1] for p in to_process)
        import_count = 0
        failed_packages = 0
        all_packages = set()

        for (index, what) in enumerate(to_process):
            pack, to_download, to_link = what
            if not to_download:
                continue
            import_count += 1
            stage_path = pack.path

            # pylint: disable=W0703
            try:
                # check if package was downloaded
                if not os.path.exists(stage_path):
                    raise Exception

                pack.load_checksum_from_header()

                if not self.metadata_only:
                    rel_package_path = rhnPackageUpload.relative_path_from_header(pack.a_pkg.header, self.org_id,
                                                                                  pack.a_pkg.checksum_type,
                                                                                  pack.a_pkg.checksum)
                else:
                    rel_package_path = None

                if rel_package_path:
                    # Save uploaded package to cache with repository checksum type

                    # First write the package to the filesystem to final location
                    # pylint: disable=W0703
                    try:
                        importLib.move_package(pack.a_pkg.payload_stream.name, basedir=CFG.MOUNT_POINT,
                                               relpath=rel_package_path,
                                               checksum_type=pack.a_pkg.checksum_type,
                                               checksum=pack.a_pkg.checksum, force=1)
                    except OSError:
                        e = sys.exc_info()[1]
                        raise_with_tb(rhnFault(50, "Package upload failed: %s" % e), sys.exc_info()[2])
                    except importLib.FileConflictError:
                        raise_with_tb(rhnFault(50, "File already exists"), sys.exc_info()[2])
                    except Exception:
                        raise_with_tb(rhnFault(50, "File error"), sys.exc_info()[2])

                    # Remove any pending scheduled file deletion for this package
                    h_delete_package_queue.execute(path=rel_package_path)

                pkg = mpmSource.create_package(pack.a_pkg.header, size=pack.a_pkg.payload_size,
                                               checksum_type=pack.a_pkg.checksum_type, checksum=pack.a_pkg.checksum,
                                               relpath=rel_package_path, org_id=self.org_id,
                                               header_start=pack.a_pkg.header_start,
                                               header_end=pack.a_pkg.header_end, channels=[])

                if pack.a_pkg.header.is_source:
                    mpm_src_batch.append(pkg)
                else:
                    mpm_bin_batch.append(pkg)
                # we do not want to keep a whole 'a_pkg' object for every package in memory,
                # because we need only checksum. see BZ 1397417
                pack.checksum = pack.a_pkg.checksum
                pack.checksum_type = pack.a_pkg.checksum_type
                pack.epoch = pack.a_pkg.header['epoch']
                pack.a_pkg = None

                all_packages.add((pack.checksum_type, pack.checksum))

                # Downloaded pkg checksum matches with pkg already in channel, no need to disassociate from channel
                if (pack.checksum_type, pack.checksum) in to_disassociate:
                    to_disassociate[(pack.checksum_type, pack.checksum)] = False
                    # Set to_link to False, no need to link again
                    to_process[index] = (pack, True, False)

                # importing packages by batch or if the current packages is the last
                if mpm_bin_batch and (import_count == to_download_count
                                      or len(mpm_bin_batch) % self.import_batch_size == 0):
                    importer = packageImport.PackageImport(mpm_bin_batch, backend, caller=upload_caller)
                    importer.setUploadForce(1)
                    importer.run()
                    rhnSQL.commit()
                    del importer.batch
                    affected_channels.extend(importer.affected_channels)
                    del mpm_bin_batch
                    mpm_bin_batch = importLib.Collection()

                if mpm_src_batch and (import_count == to_download_count
                                      or len(mpm_src_batch) % self.import_batch_size == 0):
                    src_importer = packageImport.SourcePackageImport(mpm_src_batch, backend, caller=upload_caller)
                    src_importer.setUploadForce(1)
                    src_importer.run()
                    rhnSQL.commit()
                    del mpm_src_batch
                    mpm_src_batch = importLib.Collection()

            except KeyboardInterrupt:
                raise
            except rhnSQL.SQLError:
                raise
            except Exception:
                failed_packages += 1
                e = str(sys.exc_info()[1])
                if e:
                    log2(0, 1, e, stream=sys.stderr)
                if self.fail:
                    raise
                to_process[index] = (pack, False, False)
            finally:
                if is_non_local_repo and stage_path:
                    if os.path.exists(stage_path):
                        os.remove(stage_path)
                    if os.path.exists(os.path.dirname(stage_path)):
                        # remove the checksum directory if empty
                        try:
                            os.rmdir(os.path.dirname(stage_path))
                        except OSError as exc:
                            if exc.errno == errno.ENOTEMPTY:
                                pass
                            else:
                                raise exc
            pack.clear_header()

        rhnSQL.closeDB()
        log(0, "  Package batch #{} of {} completed...".format(batch_index + 1, batch_count))
        return affected_channels, failed_packages, all_packages, to_process

    def show_packages(self, plug, source_id):

        if (not self.filters) and source_id:
            h = rhnSQL.prepare("""
                    select flag, filter
                      from rhnContentSourceFilter
                     where source_id = :source_id
                     order by sort_order """)
            h.execute(source_id=source_id)
            filter_data = h.fetchall_dict() or []
            filters = [(row['flag'], re.split(r'[,\s]+', row['filter']))
                       for row in filter_data]
        else:
            filters = self.filters

        packages = plug.raw_list_packages(filters)

        num_passed = len(packages)
        log(0, "    Packages in repo:             %5d" % plug.num_packages)
        if plug.num_excluded:
            log(0, "    Packages passed filter rules: %5d" % num_passed)

        log(0, "    Package marked with '+' will be downloaded next channel synchronization")
        log(0, "    Package marked with '.' is already presented on filesystem")

        channel_id = int(self.channel['id'])

        for pack in packages:

            packs = rhnPackage.get_info_for_package(
                [pack.name, pack.version, pack.release, pack.epoch, pack.arch],
                channel_id, self.org_id)
            db_pack = None
            for p in packs:
                if p['checksum'] == pack.checksum:
                    db_pack = p
                    break

            pack_status = " + "  # need to be downloaded by default
            pack_full_name = "%-60s\t" % (pack.name + "-" + pack.version + "-" + pack.release + "." +
                                          pack.arch + ".rpm")
            pack_size = "%11d bytes\t" % pack.packagesize

            if pack.checksum_type == 'sha512':
                pack_hash_info = "%-140s" % (pack.checksum_type + ' ' + pack.checksum)
            else:
                pack_hash_info = "%-80s " % (pack.checksum_type + ' ' + pack.checksum)

            # Package exists in DB
            if db_pack:
                # Path in filesystem is defined
                if db_pack['path']:
                    pack.path = os.path.join(CFG.MOUNT_POINT, db_pack['path'])
                else:
                    pack.path = ""

                if self.match_package_checksum(db_pack['path'], pack.path, pack.checksum_type, pack.checksum):
                    # package is already on disk
                    pack_status = ' . '

            log(0, "    " + pack_status + pack_full_name + pack_size + pack_hash_info)

    def _normalize_orphan_vendor_packages(self):
        # Sometimes reposync disassociates vendor packages (org_id = 0) from
        # channels.
        # These orphans are then hard to work with in spacewalk (nobody has
        # permissions to view/delete them). We workaround this issue by
        # assigning such packages to the default organization, so that they can
        # be deleted using the existing orphan-deleting procedure.
        h = rhnSQL.prepare("""
            UPDATE rhnPackage
            SET org_id = 1
            WHERE id IN (SELECT p.id
                         FROM rhnPackage p LEFT JOIN rhnChannelPackage cp
                         ON p.id = cp.package_id
                         WHERE p.org_id IS NULL and cp.channel_id IS NULL)
        """)
        affected_row_count = h.execute()
        if (affected_row_count > 0):
            log(
                0,
                "Transferred {} orphaned vendor packages to the default organization"
                .format(affected_row_count)
            )

    def match_package_checksum(self, md_pack, db_pack):
        """compare package checksum"""

        abspath = md_pack.path
        if (self.deep_verify or
            md_pack.checksum_type != db_pack['checksum_type'] or
            md_pack.checksum != db_pack['checksum']):

            if (os.path.exists(abspath) and
                getFileChecksum(md_pack.checksum_type, filename=abspath) == md_pack.checksum):

                return True
            else:
                return False
        elif os.path.exists(abspath):
            return True
        return False

    def associate_package(self, pack):
        package = {}
        package['name'] = pack.name
        package['version'] = pack.version
        package['release'] = pack.release
        package['arch'] = pack.arch
        if pack.a_pkg:
            package['checksum'] = pack.a_pkg.checksum
            package['checksum_type'] = pack.a_pkg.checksum_type
            # use epoch from file header because createrepo puts epoch="0" to
            # primary.xml even for packages with epoch=''
            package['epoch'] = pack.a_pkg.header['epoch']
        else:
            # RPM not available but package metadata are in DB, reuse these values
            package['checksum'] = pack.checksum
            package['checksum_type'] = pack.checksum_type
            package['epoch'] = pack.epoch
        package['channels'] = [{'label': self.channel_label,
                                'id': self.channel['id']}]
        package['org_id'] = self.org_id

        return importLib.IncompletePackage().populate(package)

    def disassociate_package(self, checksum_type, checksum):
        log(3, "Disassociating package with checksum: %s (%s)" % (checksum, checksum_type))
        h = rhnSQL.prepare("""
            delete from rhnChannelPackage cp
             where cp.channel_id = :channel_id
               and cp.package_id in (select p.id
                                       from rhnPackage p
                                       join rhnChecksumView c
                                         on p.checksum_id = c.id
                                      where c.checksum = :checksum
                                        and c.checksum_type = :checksum_type
                                    )
        """)
        h.execute(channel_id=int(self.channel['id']),
                  checksum_type=checksum_type, checksum=checksum)

    def disassociate_erratum(self, advisory_name):
        log(3, "Disassociating erratum: %s" % advisory_name)
        h = rhnSQL.prepare("""
                    delete from rhnChannelErrata ce
                     where ce.channel_id = :channel_id
                       and ce.errata_id in (select e.id
                                              from rhnErrata e
                                            where e.advisory_name = :advisory_name
                                           )
                        """)
        h.execute(channel_id=self.channel['id'], advisory_name=advisory_name)

    def load_channel(self):
        return rhnChannel.channel_info(self.channel_label)

    @staticmethod
    def _to_db_date(date):
        if not date:
            ret = datetime.utcnow()
        elif date.isdigit():
            ret = datetime.fromtimestamp(float(date))
        else:
            ret = parse_date(date)
            try:
                ret = ret.astimezone(tzutc())
            except ValueError as e:
                log(2, e)
        return ret.isoformat(' ')[:19]  # return 1st 19 letters of date, therefore preventing ORA-01830 caused by fractions of seconds

    @staticmethod
    def fix_notice(notice):
        if "." in notice['version']:
            new_version = 0
            for n in notice['version'].split('.'):
                new_version = (new_version + int(n)) * 100
            try:
                notice['version'] = new_version / 100
            except TypeError: # yum in RHEL5 does not have __setitem__
                notice._md['version'] = new_version / 100
        if RepoSync._is_old_suse_style(notice):
            # old suse style; we need to append the version to id
            # to get a seperate patch for every issue
            try:
                notice['update_id'] = notice['update_id'] + '-' + notice['version']
            except TypeError: # yum in RHEL5 does not have __setitem__
                notice._md['update_id'] = notice['update_id'] + '-' + notice['version']
        return notice

    def get_errata(self, update_id):
        """ Return an Errata dict

        search in the database for the given advisory and
        return a dict with important values.
        If the advisory was not found it returns None

        :update_id - the advisory (name)
        """
        h = rhnSQL.prepare("""
            select e.id, e.advisory,
                   e.advisory_name, e.advisory_rel,
                   TO_CHAR(e.update_date, 'YYYY-MM-DD HH24:MI:SS') as update_date
              from rhnerrata e
             where e.advisory = :name
              and (e.org_id = :org_id or (e.org_id is null and :org_id is null))
        """)
        h.execute(name=update_id, org_id=self.org_id)
        ret = h.fetchone_dict()
        if not ret:
            return None

        h = rhnSQL.prepare("""
            select distinct c.label
              from rhnchannelerrata ce
              join rhnchannel c on c.id = ce.channel_id
             where ce.errata_id = :eid
        """)
        h.execute(eid=ret['id'])
        ret['channels'] = h.fetchall_dict() or []
        ret['packages'] = []

        h = rhnSQL.prepare("""
            select p.id as package_id,
                   pn.name,
                   pevr.epoch,
                   pevr.version,
                   pevr.release,
                   pa.label as arch,
                   p.org_id,
                   cv.checksum,
                   cv.checksum_type
              from rhnerratapackage ep
              join rhnpackage p on p.id = ep.package_id
              join rhnpackagename pn on pn.id = p.name_id
              join rhnpackageevr pevr on pevr.id = p.evr_id
              join rhnpackagearch pa on pa.id = p.package_arch_id
              join rhnchecksumview cv on cv.id = p.checksum_id
             where ep.errata_id = :eid
        """)
        h.execute(eid=ret['id'])
        packages = h.fetchall_dict() or []
        for pkg in packages:
            ipackage = importLib.IncompletePackage().populate(pkg)
            ipackage['epoch'] = pkg.get('epoch', '')

            ipackage['checksums'] = {ipackage['checksum_type']: ipackage['checksum']}
            ret['packages'].append(ipackage)

        return ret

    def list_errata(self):
        """List advisory names present in channel"""
        h = rhnSQL.prepare("""select e.advisory_name
            from rhnChannelErrata ce
            inner join rhnErrata e on e.id = ce.errata_id
            where ce.channel_id = :cid
        """)
        h.execute(cid=self.channel['id'])
        advisories = [row['advisory_name'] for row in h.fetchall_dict() or []]
        return advisories

    def import_kickstart(self, plug, repo_label, is_non_local_repo):
        log(0, '')
        log(0, '  Importing kickstarts.')
        ks_path = 'rhn/kickstart/'
        ks_tree_label = re.sub(r'[^-_0-9A-Za-z@.]', '', repo_label.replace(' ', '_'))
        if len(ks_tree_label) < 4:
            ks_tree_label += "_repo"

        # construct ks_path and check we already have this KS tree synced
        id_request = """
                select id
                from rhnKickstartableTree
                where channel_id = :channel_id and label = :label
                """

        if self.org_id:
            ks_path += str(self.org_id) + '/' + ks_tree_label
            # Trees synced from external repositories are expected to have full path it database
            db_path = os.path.join(CFG.MOUNT_POINT, ks_path)
            row = rhnSQL.fetchone_dict(id_request + " and org_id = :org_id", channel_id=self.channel['id'],
                                       label=ks_tree_label, org_id=self.org_id)
        else:
            ks_path += ks_tree_label
            db_path = ks_path
            row = rhnSQL.fetchone_dict(id_request + " and org_id is NULL", channel_id=self.channel['id'],
                                       label=ks_tree_label)

        treeinfo_path = ['treeinfo', '.treeinfo']
        treeinfo_parser = None
        for path in treeinfo_path:
            log(1, "Trying " + path)
            treeinfo = plug.get_file(path, os.path.join(plug.repo.basecachedir, plug.name))
            if treeinfo:
                try:
                    treeinfo_parser = TreeInfoParser(treeinfo)
                    break
                except TreeInfoError:
                    pass

        if not treeinfo_parser:
            log(0, "    Kickstartable tree not detected (no valid treeinfo file)")
            return

        if self.ks_install_type is None:
            family = treeinfo_parser.get_family()
            if family == 'Fedora':
                self.ks_install_type = 'fedora18'
            elif family == 'CentOS':
                self.ks_install_type = 'rhel_' + treeinfo_parser.get_major_version()
            else:
                self.ks_install_type = 'generic_rpm'

        fileutils.createPath(os.path.join(CFG.MOUNT_POINT, ks_path))
        # Make sure images are included
        to_download = set()
        for repo_path in treeinfo_parser.get_images():
            local_path = os.path.join(CFG.MOUNT_POINT, ks_path, repo_path)
            # TODO: better check
            if not os.path.exists(local_path) or self.force_kickstart:
                to_download.add(repo_path)

        if row:
            log(0, "    Kickstartable tree %s already synced. Updating content..." % ks_tree_label)
            ks_id = row['id']
        else:
            row = rhnSQL.fetchone_dict("""
                select sequence_nextval('rhn_kstree_id_seq') as id from dual
                """)
            ks_id = row['id']

            rhnSQL.execute("""
                       insert into rhnKickstartableTree (id, org_id, label, base_path, channel_id, kstree_type,
                                                         install_type, last_modified, created, modified)
                       values (:id, :org_id, :label, :base_path, :channel_id,
                                 ( select id from rhnKSTreeType where label = :ks_tree_type),
                                 ( select id from rhnKSInstallType where label = :ks_install_type),
                                 current_timestamp, current_timestamp, current_timestamp)""", id=ks_id,
                           org_id=self.org_id, label=ks_tree_label, base_path=db_path,
                           channel_id=self.channel['id'], ks_tree_type=self.ks_tree_type,
                           ks_install_type=self.ks_install_type)

            log(0, "    Added new kickstartable tree %s. Downloading content..." % ks_tree_label)

        insert_h = rhnSQL.prepare("""
                insert into rhnKSTreeFile (kstree_id, relative_filename, checksum_id, file_size, last_modified, created,
                 modified) values (:id, :path, lookup_checksum('sha256', :checksum), :st_size,
                 epoch_seconds_to_timestamp_tz(:st_time), current_timestamp, current_timestamp)
        """)

        delete_h = rhnSQL.prepare("""
                delete from rhnKSTreeFile where kstree_id = :id and relative_filename = :path
        """)

        # Downloading/Updating content of KS Tree
        dirs_queue = ['']
        log(0, "    Gathering all files in kickstart repository...")
        while dirs_queue:
            cur_dir_name = dirs_queue.pop(0)
            if is_non_local_repo:
                parser = KSDirHtmlParser(plug, cur_dir_name)
            else:
                parser = KSDirLocalParser(plug.repo.urls[0].replace("file://", ""), cur_dir_name)
            for ks_file in parser.get_content():
                repo_path = cur_dir_name + ks_file['name']
                if ks_file['type'] == 'DIR':
                    dirs_queue.append(repo_path)
                    continue

                if not os.path.exists(os.path.join(CFG.MOUNT_POINT, ks_path, repo_path)) or self.force_kickstart:
                    to_download.add(repo_path)

        for addon_dir in treeinfo_parser.get_addons():
            repomd_url = str(addon_dir + '/repodata/repomd.xml')
            repomd_file = plug.get_file(repomd_url, os.path.join(plug.repo.basecachedir, plug.name))

            if repomd_file:
                # find location of primary.xml
                repomd_xml = minidom.parse(repomd_file)
                for i in repomd_xml.getElementsByTagName('data'):
                    if i.attributes['type'].value == 'primary':
                        primary_url = str(addon_dir + '/' +
                                          i.getElementsByTagName('location')[0].attributes['href'].value)
                        break

                primary_zip = plug.get_file(primary_url, os.path.join(plug.repo.basecachedir, plug.name))
                if primary_zip:
                    primary_xml = gzip.open(primary_zip, 'r')
                    xmldoc = minidom.parse(primary_xml)
                    for i in xmldoc.getElementsByTagName('package'):
                        package = i.getElementsByTagName('location')[0].attributes['href'].value
                        repo_path = str(os.path.normpath(os.path.join(addon_dir, package)))
                        if not os.path.exists(os.path.join(CFG.MOUNT_POINT, ks_path, repo_path)) \
                                or self.force_kickstart:
                            to_download.add(repo_path)

        if to_download:
            log(0, "    Downloading %d kickstart files." % len(to_download))
            progress_bar = ProgressBarLogger("              Downloading kickstarts:", len(to_download))
            downloader = ThreadedDownloader(force=self.force_kickstart)
            for item in to_download:
                params = {}
                plug.set_download_parameters(params, item, os.path.join(CFG.MOUNT_POINT, ks_path, item))
                downloader.add(params)
            downloader.set_log_obj(progress_bar)
            downloader.run()
            log2background(0, "Download finished.")
            for item in to_download:
                st = os.stat(os.path.join(CFG.MOUNT_POINT, ks_path, item))
                # update entity about current file in a database
                delete_h.execute(id=ks_id, path=item)
                insert_h.execute(id=ks_id, path=item,
                                 checksum=getFileChecksum('sha256', os.path.join(CFG.MOUNT_POINT, ks_path, item)),
                                 st_size=st.st_size, st_time=st.st_mtime)
        else:
            log(0, "No new kickstart files to download.")

        rhnSQL.commit()


##############################################################################
### SUSE only code                                                         ###
##############################################################################

    def _format_sources(self, sources, excluded_urls, repo_type):
        ret = []
        for item in sources:
            if item['source_url'] not in excluded_urls:
                if repo_type:
                    repo_type_label = repo_type
                else:
                    repo_type_label = item['repo_type_label']

                ret.append(
                    dict(
                        id=item['id'],
                        source_url=[item['source_url']],
                        metadata_signed=item['metadata_signed'],
                        repo_label=item['repo_label'],
                        repo_type=repo_type_label
                    )
                )
        return ret

    def set_repo_credentials(self, url_dict):
        """Set the credentials in the url_dict['source_url'] url list from the config file"""
        return [self._url_with_repo_credentials(url) for url in url_dict['source_url']]

    def _url_with_repo_credentials(self, url_in):
        """Adds the credentials to the given url from the config file

        We look for the `credentials` query argument and use its value
        as the location of the username and password in the current
        configuration file.

        Examples:
        ?credentials=mirrcred - read 'mirrcred_user' and 'mirrcred_pass'
        ?credeentials=mirrcred_5 - read 'mirrcred_user_5' and 'mirrcred_pass_5'

        """
        url = suseLib.URL(url_in)
        creds = url.get_query_param('credentials')
        if creds:
            creds_no = 0
            try:
                creds_no = int(creds.split("_")[1])
            except (ValueError, IndexError):
                log2(0, 0,
                    "Could not figure out which credentials to use "
                    "for this URL: {0}".format(url.getURL(), stream=sys.stderr)
                )
                sys.exit(1)
            # SCC - read credentials from DB
            h = rhnSQL.prepare("SELECT username, password FROM suseCredentials WHERE id = :id")
            h.execute(id=creds_no)
            credentials = h.fetchone_dict() or None
            if not credentials:
                log2(0, 0, "Could not figure out which credentials to use "
                           "for this URL: "+url.getURL(), stream=sys.stderr)
                sys.exit(1)
            url.username = credentials['username']
            url.password = base64.decodestring(credentials['password'].encode()).decode()
            # remove query parameter from url
            url.query = ""
        return url.getURL()

    def upload_patches(self, notices):
        """Insert the information from patches into the database

        :arg notices: a list of ElementTree roots from individual patch files

        """
        backend = SQLBackend()
        skipped_updates = 0
        batch = []

        for notice in notices:
            e = importLib.Erratum()

            version = notice.find(YUM+'version').get('ver')
            category = notice.findtext(PATCH+'category')

            e['advisory']     = e['advisory_name'] = self._patch_naming(notice)
            e['errata_from']  = 'maint-coord@suse.de'
            e['advisory_rel'] = version
            e['advisory_type'] = errata_typemap.get(category,
                                             'Product Enhancement Advisory')

            existing_errata = self.get_errata(e['advisory'])

            if (existing_errata and
                not self.errata_needs_update(existing_errata, version,
                                             self._to_db_date(notice.get('timestamp')))):
                continue
            log(0, "Add Patch %s" % e['advisory'])

            # product name
            query = rhnSQL.prepare("""
                SELECT p.friendly_name
                  FROM suseproducts p
                  JOIN suseproductchannel pc on p.id = pc.product_id
                 WHERE pc.channel_id = :channel_id
                """)
            query.execute(channel_id=int(self.channel['id']))
            try:
                e['product'] = query.fetchone()[0]
            except TypeError:
                e['product'] = 'unknown product'

            for desc_lang in notice.findall(PATCH+'description'):
                if desc_lang.get('lang') == 'en':
                    e['description'] = desc_lang.text or 'not set'
                    break
            for sum_lang in notice.findall(PATCH+'summary'):
                if sum_lang.get('lang') == 'en':
                    e['synopsis'] = sum_lang.text or 'not set'
                    break
            e['topic']       = ' '
            e['solution']    = ' '
            e['issue_date']  = self._to_db_date(notice.get('timestamp'))
            e['update_date'] = e['issue_date']
            e['notes']       = ''
            e['org_id']      = self.org_id
            e['refers_to']   = ''
            e['channels']    = [{'label': self.channel_label}]
            e['packages']    = []
            e['files']       = []
            if existing_errata:
                e['channels'].extend(existing_errata['channels'])
                e['packages'] = existing_errata['packages']

            atoms = notice.find(PATCH+'atoms')
            packages = atoms.findall(YUM+'package')

            e['packages'] = self._patches_process_packages(packages,
                                                           e['advisory_name'],
                                                           e['packages'])
            # an update can't have zero packages, so we skip this update
            if not e['packages']:
                skipped_updates = skipped_updates + 1
                continue

            e['keywords'] = []
            if notice.find(PATCH+'reboot-needed') is not None:
                kw = importLib.Keyword()
                kw.populate({'keyword': 'reboot_suggested'})
                e['keywords'].append(kw)
            if notice.find(PATCH+'package-manager') is not None:
                kw = importLib.Keyword()
                kw.populate({'keyword': 'restart_suggested'})
                e['keywords'].append(kw)

            e['bugs'] = self.find_bugs(e['description'])
            e['cve'] = self.find_cves(e['description'])
            # set severity to Low to get a currency rating
            e['security_impact'] = "Low"

            e['locally_modified'] = None
            batch.append(e)
            if self.deep_verify:
                # import step by step
                importer = ErrataImport(batch, backend)
                importer.run()
                batch = []

        if skipped_updates > 0:
            log(0, "%d patches skipped because of incomplete package list." % skipped_updates)
        if len(batch) > 0:
            importer = ErrataImport(batch, backend)
            importer.run()
        self.regen = True

    def errata_needs_update(self, existing_errata, new_errata_version, new_errata_changedate):
        """check, if the errata in the DB needs an update

           new_errata_version: integer version number
           new_errata_changedate: date of the last change in DB format "%Y-%m-%d %H:%M:%S"
        """
        if self.force_all_errata:
            # with force_all_errata always re-import all errata
            return True

        if int(existing_errata['advisory_rel']) < int(new_errata_version):
            log(2, "Patch need update: higher version")
            return True
        newdate = datetime.strptime(new_errata_changedate,
                                    "%Y-%m-%d %H:%M:%S")
        olddate = datetime.strptime(existing_errata['update_date'],
                                    "%Y-%m-%d %H:%M:%S")
        if newdate > olddate:
            log(2, "Patch need update: newer update date - %s > %s" % (newdate, olddate))
            return True
        for c in existing_errata['channels']:
            if self.channel_label == c['label']:
                log(2, "No update needed")
                return False
        log(2, "Patch need update: channel not yet part of the patch")
        return True

    def _updates_process_packages(self, packages, advisory_name,
                                  existing_packages):
        """Check if the packages are in the database

        Go through the list of 'packages' and for each of them
        check to see if it is already present in the database. If it is,
        return a list of IncompletePackage objects, otherwise return an
        empty list.

        :packages: a list of dicts that represent packages (updateinfo style)
        :advisory_name: the name of the current erratum
        :existing_packages: list of already existing packages for this errata

        """
        erratum_packages = existing_packages
        for pkg in packages:
            if pkg['arch'] in ['src', 'nosrc']:
                continue
            param_dict = {
                'name': pkg['name'],
                'version': pkg['version'],
                'release': pkg['release'],
                'arch': pkg['arch'],
                'epoch': pkg['epoch'],
                'channel_id': int(self.channel['id'])}
            if param_dict['arch'] not in self.arches:
                continue
            ret = self._process_package(param_dict, advisory_name)
            if not ret:
                if 'epoch' not in param_dict:
                    param_dict['epoch'] = ''
                else:
                    param_dict['epoch'] = '%s:' % param_dict['epoch']
                if "%(name)s-%(epoch)s%(version)s-%(release)s.%(arch)s" % param_dict not in self.available_packages:
                    continue
                # This package could not be found in the database
                # but should be available in this repo
                # so we skip the broken patch.
                errmsg = ("The package "
                          "%(name)s-%(epoch)s%(version)s-%(release)s.%(arch)s "
                          "which is referenced by patch %(patch)s was not found "
                          "in the database. This patch has been skipped." % dict(
                              patch=advisory_name,
                              **param_dict))
                log(0, errmsg)
                self.error_messages.append(errmsg)
                return []

            # add new packages to the errata
            found = False
            for oldpkg in erratum_packages:
                if oldpkg['package_id'] == ret['package_id']:
                    found = True
            if not found:
                erratum_packages.append(ret)
        return erratum_packages

    def _patches_process_packages(self, packages, advisory_name, existing_packages):
        """Check if the packages are in the database

        Go through the list of 'packages' and for each of them
        check to see if it is already present in the database. If it is,
        return a list of IncompletePackage objects, otherwise return an
        empty list.

        :packages: a list of dicts that represent packages (patch style)
        :advisory_name: the name of the current erratum
        :existing_packages: list of already existing packages for this errata

        """
        erratum_packages = existing_packages
        for pkg in packages:
            nevr = pkg.find(YUM+'format').find(RPM+'requires').find(RPM+'entry')
            param_dict = {
                'name': nevr.get('name'),
                'version': nevr.get('ver'),
                'release': nevr.get('rel'),
                'epoch': nevr.get('epoch'),
                'arch': pkg.findtext(YUM+'arch'),
                'channel_id': int(self.channel['id'])
            }
            if param_dict['arch'] not in self.arches:
                continue
            ret = self._process_package(param_dict, advisory_name)
            if not ret:
                if 'epoch' not in param_dict:
                    param_dict['epoch'] = ''
                else:
                    param_dict['epoch'] = '%s:' % param_dict['epoch']
                if "%(name)s-%(epoch)s%(version)s-%(release)s.%(arch)s" % param_dict not in self.available_packages:
                    continue
                # This package could not be found in the database
                # but should be available in this repo
                # so we skip the broken patch.
                errmsg = ("The package "
                          "%(name)s-%(epoch)s%(version)s-%(release)s.%(arch)s "
                          "which is referenced by patch %(patch)s was not found "
                          "in the database. This patch has been skipped." % dict(
                              patch=advisory_name,
                              **param_dict))
                log(0, errmsg)
                self.error_messages.append(errmsg)
                return []

            # add new packages to the errata
            found = False
            for oldpkg in erratum_packages:
                if oldpkg['package_id'] == ret['package_id']:
                    found = True
            if not found:
                erratum_packages.append(ret)
        return erratum_packages

    def import_products(self, repo):
        products = repo.get_products()
        for product in products:
            query = rhnSQL.prepare("""
                select spf.id
                  from suseProductFile spf
                  join rhnpackageevr pe on pe.id = spf.evr_id
                  join rhnpackagearch pa on pa.id = spf.package_arch_id
                 where spf.name = :name
                   and spf.evr_id = LOOKUP_EVR(:epoch, :version, :release)
                   and spf.package_arch_id = LOOKUP_PACKAGE_ARCH(:arch)
                   and spf.vendor = :vendor
                   and spf.summary = :summary
                   and spf.description = :description
            """)
            query.execute(**product)
            row = query.fetchone_dict()
            if not row or 'id' not in row:
                get_id_q = rhnSQL.prepare("""SELECT sequence_nextval('suse_prod_file_id_seq') as id FROM dual""")
                get_id_q.execute()
                row = get_id_q.fetchone_dict() or {}
                if not row or 'id' not in row:
                    print("no id for sequence suse_prod_file_id_seq")
                    continue

                h = rhnSQL.prepare("""
                    insert into suseProductFile
                        (id, name, evr_id, package_arch_id, vendor, summary, description)
                    VALUES (:id, :name, LOOKUP_EVR(:epoch, :version, :release),
                            LOOKUP_PACKAGE_ARCH(:arch), :vendor, :summary, :description)
                """)
                h.execute(id=row['id'], **product)

            params = {
                'product_cap'   : "product(%s)" % product['name'],
                'cap_version'   : product['version'] + "-" + product['release'],
                'channel_id'    : int(self.channel['id'])
            }
            if self.org_id:
                org_statement = "and p.org_id = :channel_org"
                params['channel_org'] = self.org_id
            else:
                org_statement = "and p.org_id is NULL"

            query = rhnSQL.prepare("""
                select p.id
                  from rhnPackage p
                  join rhnPackageProvides pp on pp.package_id = p.id
                  join rhnPackageCapability pc on pc.id = pp.capability_id
                  join rhnChannelPackage cp on cp.package_id = p.id
                 where pc.name = :product_cap
                   and pc.version = :cap_version
                   and cp.channel_id = :channel_id
                   %s
            """ % org_statement)

            query.execute(**params)
            packrow = query.fetchone_dict()
            if not packrow or 'id' not in packrow:
                # package not in DB
                continue

            h = rhnSQL.prepare("""select 1 from susePackageProductFile where package_id = :paid and prodfile_id = :prid""")
            h.execute(paid=packrow['id'], prid=row['id'])
            ex = h.fetchone_dict() or None
            if not ex:
                h = rhnSQL.prepare("""insert into susePackageProductFile (package_id, prodfile_id)
                    VALUES (:package_id, :product_id)
                """)
                h.execute(package_id=packrow['id'], product_id=row['id'])
                self.regen = True

    def import_susedata(self, repo):
        kwcache = {}
        susedata = repo.get_susedata()
        for package in susedata:
            query = rhnSQL.prepare("""
                SELECT p.id
                  FROM rhnPackage p
                  JOIN rhnPackagename pn ON p.name_id = pn.id
                  JOIN rhnChecksumView c ON p.checksum_id = c.id
                  JOIN rhnChannelPackage cp ON p.id = cp.package_id
                 WHERE pn.name = :name
                   AND p.evr_id = LOOKUP_EVR(:epoch, :version, :release)
                   AND p.package_arch_id = LOOKUP_PACKAGE_ARCH(:arch)
                   AND cp.channel_id = :channel_id
                   AND c.checksum = :pkgid
                """)
            query.execute(name=package['name'], epoch=package['epoch'],
                          version=package['version'], release=package['release'],
                          arch=package['arch'], pkgid=package['pkgid'],
                          channel_id=int(self.channel['id']))
            row = query.fetchone_dict() or None
            if not row or 'id' not in row:
                # package not found in DB
                continue
            pkgid = int(row['id'])
            log(4, "import_susedata pkgid: %s channelId: %s" % (pkgid, int(self.channel['id'])))

            h = rhnSQL.prepare("""
                SELECT smk.id, smk.label
                  FROM suseMdData smd
                  JOIN suseMdKeyword smk ON smk.id = smd.keyword_id
                 WHERE smd.package_id = :package_id
                   AND smd.channel_id = :channel_id
            """)
            h.execute(package_id=pkgid, channel_id=int(self.channel['id']))
            ret = h.fetchall_dict() or {}
            pkgkws = {}
            for row in ret:
                log(4, "DB keyword: %s kid: %s" % (row['label'], row['id']))
                pkgkws[row['label']] = False
                kwcache[row['label']] = row['id']

            for keyword in package['keywords']:
                log(4, "Metadata keyword: %s" % keyword)
                if keyword not in kwcache:
                    kw = rhnSQL.prepare("""select LOOKUP_MD_KEYWORD(:label) id from dual""")
                    kw.execute(label=keyword)
                    kwid = kw.fetchone_dict()['id']
                    kwcache[keyword] = kwid

                if keyword in pkgkws:
                    pkgkws[keyword] = True
                else:
                    log(4, "Insert new keywordId: %s pkgId: %s channelId: %s" % (kwcache[keyword], pkgid, int(self.channel['id'])))
                    kadd = rhnSQL.prepare("""INSERT INTO suseMdData (package_id, channel_id, keyword_id)
                                              VALUES(:package_id, :channel_id, :keyword_id)""")
                    kadd.execute(package_id=pkgid, channel_id=int(self.channel['id']), keyword_id=kwcache[keyword])
                    self.regen = True

            if 'eula' in package:
                eula_id = suseEula.find_or_create_eula(package['eula'])
                rhnPackage.add_eula_to_package(
                  package_id=pkgid,
                  eula_id=eula_id
                )

            # delete all removed keywords
            for label in pkgkws:
                if not pkgkws[label]:
                    log(4, "Delete obsolete keywordId: %s pkgId: %s channelId: %s" % (kwcache[label], pkgid, int(self.channel['id'])))
                    kdel = rhnSQL.prepare("""DELETE FROM suseMdData WHERE package_id = :package_id
                                             AND channel_id = :channel_id AND keyword_id = :keyword_id""")
                    kdel.execute(package_id=pkgid, channel_id=int(self.channel['id']), keyword_id=kwcache[label])
                    self.regen = True

    def _patch_naming(self, notice):
        """Return the name of the patch according to our rules

        :notice: a notice/patch object (this could be a dictionary
        (new-style) or an ElementTree element (old code10 style))

        """
        try:
            version = int(notice.find(YUM+'version').get('ver'))
        except AttributeError:
            # normal yum updates (dicts)
            patch_name = notice['update_id']
        else:
            # code10 patches
            if version >= 1000:
                # old suse style patch naming
                patch_name = notice.get('patchid')
            else:
                # new suse style patch naming
                patch_name = notice.find(YUM+'name').text

        # remove the channel-specific prefix
        # this way we can merge patches from different channels like
        # SDK, HAE and SLES
        update_tag = self.channel['update_tag']
        if update_tag and patch_name.startswith(update_tag):
            patch_name = patch_name[len(update_tag)+1:] # +1 for the hyphen
        elif update_tag and update_tag in patch_name:
            # SLE12 has SUSE-<update-tag>-...
            patch_name = patch_name.replace('SUSE-' + update_tag , 'SUSE', 1)

        return patch_name

    def _process_package(self, param_dict, advisory_name):
        """Search for a package in the the database

        Search for the package specified by 'param_dict' to see if it is
        already present in the database. If it is, return a
        IncompletePackage objects, otherwise return None.

        :param_dict: dict that represent packages (nerva + channel_id)
        :advisory_name: the name of the current erratum

        """
        pkgepoch = param_dict['epoch']
        del param_dict['epoch']

        if not pkgepoch or pkgepoch == '0':
            epochStatement = "(pevr.epoch is NULL or pevr.epoch = '0')"
        else:
            epochStatement = "pevr.epoch = :epoch"
            param_dict['epoch'] = pkgepoch
        if self.org_id:
            param_dict['org_id'] = self.org_id
            orgidStatement = " = :org_id"
        else:
            orgidStatement = " is NULL"

        h = rhnSQL.prepare("""
            select p.id, c.checksum, c.checksum_type, pevr.epoch
              from rhnPackage p
              join rhnPackagename pn on p.name_id = pn.id
              join rhnpackageevr pevr on p.evr_id = pevr.id
              join rhnpackagearch pa on p.package_arch_id = pa.id
              join rhnArchType at on pa.arch_type_id = at.id
              join rhnChecksumView c on p.checksum_id = c.id
              join rhnChannelPackage cp on p.id = cp.package_id
             where pn.name = :name
               and p.org_id %s
               and pevr.version = :version
               and pevr.release = :release
               and pa.label = :arch
               and %s
               and at.label = 'rpm'
               and cp.channel_id = :channel_id
            """ % (orgidStatement, epochStatement))
        h.execute(**param_dict)
        cs = h.fetchone_dict()

        if not cs:
            return None

        package = importLib.IncompletePackage()
        for k in param_dict:
            if k not in ['epoch', 'channel_label', 'channel_id']:
                package[k] = param_dict[k]
        package['epoch'] = cs['epoch']
        package['org_id'] = self.org_id

        package['checksums'] = {cs['checksum_type'] : cs['checksum']}
        package['checksum_type'] = cs['checksum_type']
        package['checksum'] = cs['checksum']

        package['package_id'] = cs['id']
        return package

    def sendErrorMail(self, body):
        to = CFG.TRACEBACK_MAIL
        fr = to
        if isinstance(to, type([])):
            fr = to[0].strip()
            to = ', '.join([s.strip() for s in to])

        headers = {
            "Subject" : "SUSE Manager repository sync failed (%s)" % hostname,
            "From"    : "%s <%s>" % (hostname, fr),
            "To"      : to,
        }
        extra = "Syncing Channel '%s' failed:\n\n" % self.channel_label
        rhnMail.send(headers, extra + body)

    def updateChannelChecksumType(self, repo_checksum_type):
        """
        check, if the checksum_type of the channel matches the one of the repo
        if not, change the type of the channel
        """
        if repo_checksum_type is None:
            return

        if self.channel['org_id']:
            # custom channels are user managed.
            # Do not autochange this
            return

        h = rhnSQL.prepare("""SELECT ct.label
                                FROM rhnChannel c
                                JOIN rhnChecksumType ct ON c.checksum_type_id = ct.id
                               WHERE c.id = :cid""")
        h.execute(cid=self.channel['id'])
        d = h.fetchone_dict() or None
        if d and d['label'] == repo_checksum_type:
            # checksum_type is the same, no need to change anything
            return
        h = rhnSQL.prepare("""SELECT id FROM rhnChecksumType WHERE label = :clabel""")
        h.execute(clabel=repo_checksum_type)
        d = h.fetchone_dict() or None
        if not (d and d['id']):
            # unknown or invalid checksum_type
            # better not change the channel
            return
        # update the checksum_type
        h = rhnSQL.prepare("""UPDATE rhnChannel
                                 SET checksum_type_id = :ctid
                               WHERE id = :cid""")
        h.execute(ctid=d['id'], cid=self.channel['id'])

    @staticmethod
    def get_compatible_arches(channel_id):
        """Return a list of compatible package arch labels for this channel"""
        h = rhnSQL.prepare("""select pa.label
                              from rhnChannelPackageArchCompat cpac,
                              rhnChannel c,
                              rhnpackagearch pa
                              where c.id = :channel_id
                              and c.channel_arch_id = cpac.channel_arch_id
                              and cpac.package_arch_id = pa.id""")
        h.execute(channel_id=channel_id)
        arches = [k['label'] for k in  h.fetchall_dict()
                if CFG.SYNC_SOURCE_PACKAGES or k['label'] not in ['src', 'nosrc']]
        return arches

    @staticmethod
    def _update_keywords(notice):
        """Return a list of Keyword objects for the notice"""
        keywords = []
        if notice['reboot_suggested']:
            kw = importLib.Keyword()
            kw.populate({'keyword':'reboot_suggested'})
            keywords.append(kw)
        if notice['restart_suggested']:
            kw = importLib.Keyword()
            kw.populate({'keyword':'restart_suggested'})
            keywords.append(kw)
        return keywords

    @staticmethod
    def _update_bugs(notice):
        """Return a list of Bug objects from the notice's references"""
        bugs = {}
        if notice['references'] is None:
            return []
        for bz in notice['references']:
            if bz['type'] == 'bugzilla':
                # Fix: in case of non-integer id try to parse it from href
                if not bz['id'].isdigit():
                    log(2, "Bugzilla ID is wrong: {0}. Trying to parse ID from from URL".format(bz["id"]))
                    bz_id_match = re.search("/show_bug.cgi\?id=(\d+)", bz["href"])
                    if bz_id_match:
                        bz["id"] = bz_id_match.group(1)
                        log(2, "Bugzilla ID found: {0}".format(bz["id"]))
                    else:
                        log2(0, 0, "Unable to find Bugzilla ID for {0}. Omitting".format(bz["id"]), stream=sys.stderr)
                        continue
                if bz['id'] not in bugs:
                    bug = importLib.Bug()
                    bug.populate({'bug_id': bz['id'],
                                  'summary': bz['title'] or ("Bug %s" % bz['id']),
                                  'href': bz['href']})
                    bugs[bz['id']] = bug
        return list(bugs.values())

    @staticmethod
    def _update_cve(notice):
        """Return a list of unique ids from notice references of type 'cve'"""
        cves = []
        if notice['description'] is not None:
            # sometimes CVE numbers appear in the description, but not in
            # the reference list
            cves = RepoSync.find_cves(notice['description'])
        if notice['references'] is not None:
            cves.extend([cve['id'][:20] for cve in notice['references'] if cve['type'] == 'cve'])
        # remove duplicates
        cves = list(set(cves))

        return cves

    @staticmethod
    def _is_old_suse_style(notice):
        if((notice['from'] and "suse" in notice['from'].lower() and
            int(notice['version']) >= 1000) or
            (notice['update_id'][:4] in ('res5', 'res6') and int(notice['version']) > 6 ) or
            (notice['update_id'][:4] == 'res4')):
            # old style suse updateinfo starts with version >= 1000 or
            # have the res update_tag
            return True
        return False

    @staticmethod
    def find_bugs(text):
        """Find and return a list of Bug objects from the bug ids in the `text`
    
        Matches:
         - [#123123], (#123123)

        N.B. We assume that all the bugs are Novell Bugzilla bugs.

        """
        bug_numbers = set(re.findall('[\[\(]#(\d{6})[\]\)]', text))
        bugs = []
        for bug_number in bug_numbers:
            bug = importLib.Bug()
            bug.populate(
                {'bug_id': bug_number,
                 'summary': 'bug number %s' % bug_number,
                 'href':
                     'https://bugzilla.novell.com/show_bug.cgi?id=%s' % bug_number})
            bugs.append(bug)
        return bugs

    @staticmethod
    def find_cves(text):
        """Find and return a list of CVE ids

        Matches:
         - CVE-YEAR-NUMBER

         Beginning 2014, the NUMBER has no maximal length anymore.
         We limit the length at 20 chars, because of the DB column size
        """
        cves = list()
        cves.extend([cve[:20] for cve in set(re.findall('CVE-\d{4}-\d+', text))])
        return cves


    @staticmethod
    def _delete_invalid_errata(errata_id):
        """
        Remove the errata from all channels
        This should only be alled in case of a disaster
        """
        # first get a list of all channels where this errata exists
        h = rhnSQL.prepare("""
            SELECT channel_id
              FROM rhnChannelErrata
             WHERE errata_id = :errata_id
        """)
        h.execute(errata_id=errata_id)
        channels = [x['channel_id'] for x in h.fetchall_dict() or []]

        # delete channel from errata
        h = rhnSQL.prepare("""
            DELETE FROM rhnChannelErrata
             WHERE errata_id = :errata_id
        """)
        h.execute(errata_id=errata_id)

        # delete all packages from errata
        h = rhnSQL.prepare("""
            DELETE FROM rhnErrataPackage ep
             WHERE ep.errata_id = :errata_id
        """)
        h.execute(errata_id=errata_id)

        # delete files from errata
        h = rhnSQL.prepare("""
            DELETE FROM rhnErrataFile
             WHERE errata_id = :errata_id
        """)
        h.execute(errata_id=errata_id)

        # delete erratatmp
        h = rhnSQL.prepare("""
            DELETE FROM rhnErrataTmp
             WHERE id = :errata_id
        """)
        h.execute(errata_id=errata_id)

        # delete errata
        # removes also references from rhnErrataCloned
        # and rhnServerNeededCache
        h = rhnSQL.prepare("""
            DELETE FROM rhnErrata
             WHERE id = :errata_id
        """)
        h.execute(errata_id=errata_id)
        rhnSQL.commit()
        update_needed_cache = rhnSQL.Procedure("rhn_channel.update_needed_cache")

        for cid in channels:
            update_needed_cache(cid)
        rhnSQL.commit()

    @staticmethod
    def chunks(seq, n):
        return (seq[i:i+n] for i in range(0, len(seq), n))
 070701000000E0000081B40000000000000000000000015FBBE8EE00001B0B000000000000000000000000000000000000003200000000spacewalk-backend/satellite_tools/req_channels.py #
# Copyright (c) 2008--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

from uyuni.common import usix


class RequestedChannels:

    """Bookkeeping of the state of various channels
    Argument to constructor is the list of requested channels
    """
    # Simplify the getters/setters/resetters
    __lists = [
        '_requested_imported',  # requested and previously imported
        '_requested_new',  # requested and NOT previously imported
        '_requested_channels',  # Union of the above two
        '_not_requested',  # not requested but available channels
        '_end_of_service',  # requested, once available, but no longer supported
        '_typos',  # requested, but probably a typo
    ]

    def __init__(self, requested=()):
        # All the requested channels
        self._requested = {}
        # All available channels
        self._available = {}
        # All imported channels
        self._imported = {}

        # These will be computed
        # We could have initialized them in a loop, but pychecker would
        # complain that the data member does not exist
        self._requested_imported = []
        self._requested_new = []
        self._requested_channels = []
        self._not_requested = []
        self._end_of_service = []
        self._typos = []

        for l in self.__lists:
            assert hasattr(self, l), "Class does not initialize %s" % l
            assert isinstance(getattr(self, l), usix.ListType)

        # Initialize the requested channels
        self.request(requested)

    def request(self, requested):
        assert isinstance(requested, usix.ListType)

        self._requested.clear()
        for c in requested:
            self._requested[c] = None
        return self

    def _add(self, name, channel):
        if name not in ['_available', '_imported']:
            raise AttributeError('add' + name)
        getattr(self, name)[channel] = None
        return self

    def _set(self, name, channel_list):
        if name not in ['_available', '_imported']:
            raise AttributeError('set' + name)
        assert isinstance(channel_list, usix.ListType)
        h = getattr(self, name)
        h.clear()
        for c in channel_list:
            h[c] = None
        return self

    def _reset(self, name):
        del getattr(self, name)[:]
        return self

    def _get(self, name):
        return getattr(self, name)

    def reset(self):
        self._available.clear()
        self._imported.clear()
        self._reset_computed()

    def _reset_computed(self):
        for name in self.__lists:
            del getattr(self, name)[:]
        return self

    def _print_values(self):
        for name in self.__lists:
            print(("Contents of %s: %s" % (name, getattr(self, name))))
        return self

    def compute(self):
        self._reset_computed()
        available = self._available.copy()
        imported = self._imported.copy()
        for c in self._requested:
            if c in self._available:
                del available[c]
                # Channel exists
                if c in self._imported:
                    del imported[c]
                    self._requested_imported.append(c)
                    continue
                self._requested_new.append(c)
                continue
            # Requested channel not available
            if c in self._imported:
                del imported[c]
                self._end_of_service.append(c)
                continue
            # Typo
            self._typos.append(c)

        for c in list(available.keys()):
            if c in imported:
                # Available, already imported
                del imported[c]
            # Available, not imported
            self._not_requested.append(c)

        # The rest are channels that were once imported, but now are
        # unavailable
        self._end_of_service.extend(list(imported.keys()))

        self._requested_channels.extend(self._requested_new)
        self._requested_channels.extend(self._requested_imported)

        # Sort the lists
        for name in self.__lists:
            getattr(self, name).sort()
        return self

    def __getattr__(self, name):
        if name.startswith('add'):
            return Method(name[3:], self._add)
        if name.startswith('get'):
            return Method(name[3:], self._get)
        if name.startswith('set'):
            return Method(name[3:], self._set)
        if name.startswith('reset'):
            return Method(name[5:], self._reset)
        raise AttributeError(name)


class Method:
    # pylint: disable=R0903

    def __init__(self, name, func):
        self._func = func
        self._name = name

    def __call__(self, *args, **kwargs):
        return self._func(self._name, *args, **kwargs)

# Test functions


def _verify_expectations(c, expectations):
    for k, expected in list(expectations.items()):
        method_name = 'get' + k
        val = getattr(c, method_name)()
        if val == expected:
            print(("ok: %s = %s" % (method_name, expected)))
        else:
            print(("FAILED: %s: expected %s, got %s" % (method_name, expected,
                                                       val)))


def test1(requested, available, imported, expectations):
    c = RequestedChannels(requested)
    # Available channels
    for av in available:
        c.add_available(av)
    # Already impoted
    for i in imported:
        c.add_imported(i)

    c.compute()
    _verify_expectations(c, expectations)


def test2(requested, available, imported, expectations):
    c = RequestedChannels(requested)
    # Available channels
    c.set_available(available)
    # Already impoted
    c.set_imported(imported)

    c.compute()
    _verify_expectations(c, expectations)


def test():
    requested = ['a', 'b', 'c', 'd']
    available = ['a', 'd', 'e', 'f']
    imported = ['d', 'e', 'h']
    expectations = {
        '_requested_imported': ['d'],
        '_requested_new': ['a'],
        '_not_requested': ['e', 'f'],
        '_end_of_service': ['h'],
        '_typos': ['b', 'c'],
        '_requested_channels': ['a', 'd'],
    }
    print("Running test1")
    test1(requested, available, imported, expectations)
    print("Running test2")
    test2(requested, available, imported, expectations)

if __name__ == '__main__':
    test()
 070701000000E1000081FD0000000000000000000000015FBBE8EE0000013D000000000000000000000000000000000000002F00000000spacewalk-backend/satellite_tools/rhn-charsets    #!/bin/bash

if [ $UID != "0" ]; then
  echo "ERROR: must be root to execute"
  exit 1
fi

BACKEND=$( spacewalk-cfg-get db_backend )

if [ $BACKEND == 'postgresql' ]; then
	echo 'show server_encoding; show client_encoding;' | spacewalk-sql --select-mode -
else
	echo "Unknown database backend [$BACKEND]"
	exit 1
fi

   070701000000E2000081B40000000000000000000000015FBBE8EE000005D2000000000000000000000000000000000000003400000000spacewalk-backend/satellite_tools/rhn-charsets.sgml   <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [
<!ENTITY RHNSAT "SUSE Manager Server" >
<!ENTITY COMMAND "rhn-charsets" >

]>
<refentry>

<RefMeta>
<RefEntryTitle>&COMMAND;</RefEntryTitle><manvolnum>8</manvolnum>
<RefMiscInfo>Version 1.0.0</RefMiscInfo>
</RefMeta>

<RefNameDiv>
<RefName><command>&COMMAND;</command></RefName>
<RefPurpose>
Fetch the database characterset types for a &RHNSAT;.
</RefPurpose>
</RefNameDiv>

<RefSynopsisDiv>
<Synopsis>
    <cmdsynopsis>
        <command>&COMMAND;</command> 
    </cmdsynopsis>
</Synopsis>
</RefSynopsisDiv>

<RefSect1><Title>Description</Title>

    <para> <emphasis>&COMMAND;</emphasis> fetches the database characterset
    ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET', 'server_encoding', 'client_encoding')
    values for a &RHNSAT;.  It uses the database connection string found in /etc/rhn/rhn.conf.
    </para>

</RefSect1>

<RefSect1><Title>Files</Title>
<simplelist>
    <member>/etc/rhn/rhn.conf</member>
</simplelist>
</RefSect1>

<RefSect1><Title>See Also</Title>
<simplelist>
    <member>db-control(1) - embedded database environment only!</member>
    <member>rhn-charsets(8)</member>
    <member>rhnpush(8)</member>
    <member>rhn-schema-version(8)</member>
    <member>rhn-ssl-dbstore(8)</member>
    <member>satellite-sync(8)</member>
</simplelist>
</RefSect1>

<RefSect1><Title>Authors</Title>
<simplelist>
    <member>Todd Warner <email>taw@redhat.com</email></member>
</simplelist>
</RefSect1>
</RefEntry>

  070701000000E3000081FD0000000000000000000000015FBBE8EE0000018E000000000000000000000000000000000000002F00000000spacewalk-backend/satellite_tools/rhn-db-stats    #!/bin/sh

if [[ $@ =~ "-h" ]] || [[ $@ =~ "--help" ]] || [ $# -ne 1 -o $# -gt 1 ]; then
        echo "Usage: `basename $0` -h | --help | output-file"
        exit
fi

if [ "$(spacewalk-cfg-get db_backend)" = "postgresql" ]; then
        sql="
SHOW ALL;
"
fi

output=$(echo "$sql" | spacewalk-sql --select-mode -)

if [ "$1" = "-" ]; then
        echo "$output"
else
        echo "$output" > $1
fi
  070701000000E4000081B40000000000000000000000015FBBE8EE0000079D000000000000000000000000000000000000003400000000spacewalk-backend/satellite_tools/rhn-db-stats.sgml   <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [
<!ENTITY THECOMMAND "rhn-db-stats" >

]>
<refentry>

<RefMeta>
<RefEntryTitle>&THECOMMAND;</RefEntryTitle><manvolnum>8</manvolnum>
<RefMiscInfo>Version 1.0.0</RefMiscInfo>
</RefMeta>

<RefNameDiv>
<RefName><command>&THECOMMAND;</command></RefName>
<RefPurpose>
utility for querying important database parameters used by SUSE Manager.
</RefPurpose>
</RefNameDiv>

<RefSynopsisDiv>
<Synopsis>
    <cmdsynopsis>
        <command>&THECOMMAND;</command>
        <arg choice="opt">-h | --help</arg>
	<arg choice="req">output-file</arg>
    </cmdsynopsis>
</Synopsis>
</RefSynopsisDiv>

<RefSect1><Title>Description</Title>

<para>
rhn-db-stats retrieves important parameters from Oracle database
used by your SUSE Manager installation. It is used by spacewalk-debug
(satellite-debug) or it can be used standalone.
</para>

</RefSect1>

<RefSect1><Title>Options</Title>
<variablelist>
    <varlistentry>
        <term>-h | --help</term>
        <listitem>
            <para>Print usage information.</para>
        </listitem>
    </varlistentry>

    <varlistentry>
        <term>output-file</term>
        <listitem>
            <para>File name to save the retrieved information to. Use - if you wish to
                  print the output to stdout.</para>
        </listitem>
    </varlistentry>
</variablelist>
</RefSect1>

<RefSect1><Title>Files</Title>
<simplelist>
    <member>/usr/bin/&THECOMMAND;</member>
</simplelist>
</RefSect1>

<RefSect1><Title>Example</Title>
<simplelist>
        <member><command>&THECOMMAND; database.log</command></member>
</simplelist>
</RefSect1>

<RefSect1><Title>See Also</Title>
<simplelist>
    <member>spacewalk-debug(8)</member>
    <member>rhn-schema-stats(8)</member>
</simplelist>
</RefSect1>

<RefSect1><Title>Authors</Title>
<simplelist>
    <member>Milan Zazrivec <email>mzazrivec@redhat.com</email></member>
</simplelist>
</RefSect1>
</RefEntry>
   070701000000E5000081FD0000000000000000000000015FBBE8EE0000068B000000000000000000000000000000000000003900000000spacewalk-backend/satellite_tools/rhn-satellite-activate  #!/usr/bin/python -u
#
# Copyright (c) 2008--2011 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
# 
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation. 
#

## language imports
import sys
try:
    import os
except KeyboardInterrupt:
    sys.stderr.write("\nUser interrupted process.\n")
    sys.exit(0)


mod_name = os.path.basename(sys.argv[0]).replace('-', '_')
try:
    mod = __import__("spacewalk.satellite_tools", globals(), locals(), [mod_name])
except KeyboardInterrupt:
    sys.stderr.write("\nUser interrupted process.\n")
    sys.exit(0)
except ImportError as e:
    sys.stderr.write("Unable to load module %s\n" % mod_name)
    sys.stderr.write(str(e) + "\n")
    sys.exit(1)
mod = getattr(mod, mod_name)


#-------------------------------------------------------------------------------
if __name__ == '__main__':
    try:
        sys.exit(abs(mod.main() or 0))
    except KeyboardInterrupt:
        sys.stderr.write("\nUser interrupted process.\n")
        sys.exit(0)
    except SystemExit:
        raise
    except:
        sys.stderr.write("\nERROR: unhandled exception occurred:\n")
        raise
#===============================================================================
 070701000000E6000081B40000000000000000000000015FBBE8EE000014EA000000000000000000000000000000000000003E00000000spacewalk-backend/satellite_tools/rhn-satellite-activate.sgml <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [
<!ENTITY RHNSAT "Red Hat Satellite Server" >
<!ENTITY RHNSATACT "rhn-satellite-activate" >

]>
<refentry>

<RefMeta>
<RefEntryTitle>&RHNSATACT;</RefEntryTitle><manvolnum>8</manvolnum>
<RefMiscInfo>Version 3.4.0</RefMiscInfo>
</RefMeta>

<RefNameDiv>
<RefName><command>&RHNSATACT;</command></RefName>
<RefPurpose>
    activates (using an RHSM Manifest) a &RHNSAT;.
</RefPurpose>
</RefNameDiv>

<RefSynopsisDiv>
<Synopsis>
    <cmdsynopsis>
        <command>&RHNSATACT; [ options <replaceable>...</replaceable> ] [ --manifest <replaceable>PATH</replaceable> ] \
  [ --sanity-only ] [ --disconnected ] [ --deactivate ] [ --manifest-info ] \
  [ ---manifest-download ] [ --manifest-refresh ] [ --manifest-reconcile-request ] \
  [ -h|--help ]</command>
    </cmdsynopsis>
</Synopsis>
</RefSynopsisDiv>

<RefSect1><Title>Description</Title>

<para>
    <emphasis>&RHNSATACT;</emphasis> activates (using an RHSM Manifest) a &RHNSAT;.
    The RHSM Manifest is (a) checked for sanity, (b) extracted and data are inserted
    into the local database. If disconnected option is specified, this Satellite
    will not subscribe to Satellite repository and will not receive updates.
    Activation allows &RHNSAT; to sync channel content from CDN repositories.
</para>

<para>
    NOTE: activation generally occurs upon Red Hat Satellite installation.
</para>
</RefSect1>

<RefSect1><Title>Options</Title>
<variablelist>
    <varlistentry>
        <term>--manifest <replaceable>PATH</replaceable></term>
        <listitem>
            <para>new RHSM manifest path/filename.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--sanity-only</term>
        <listitem>
            <para>confirm manifest sanity. Does not activate the Red Hat Satellite locally or remotely.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--disconnected</term>
        <listitem>
            <para>activate locally, but not subscribe to Satellite repository.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--ignore-expiration</term>
        <listitem>
            <para>execute regardless of the expiration of the RHN Certificate (not recommended).</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--ignore-version-mismatch</term>
        <listitem>
            <para>execute regardless of version mismatch of existing and new certificate.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--deactivate</term>
        <listitem>
            <para>Deactivate CDN-activated Satellite.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--manifest-info</term>
        <listitem>
            <para>Show information about currently activated manifest.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--manifest-download</term>
        <listitem>
            <para>Download new manifest from RHSM and save it to temporary location.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--manifest-refresh</term>
        <listitem>
            <para>Download new manifest from RHSM and activate it immediately.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--manifest-reconcile-request</term>
        <listitem>
            <para>Regenerate entitlement certificates in RHSM for your consumer.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-v | --verbose</term>
        <listitem>
            <para>be verbose (accumulable: -vvv means "be *really* verbose").</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-h | --help</term>
        <listitem>
            <para>Display the help screen with a list of options.</para>
        </listitem>
    </varlistentry>
</variablelist>
</RefSect1>

<RefSect1><Title>Files</Title>
<simplelist>
    <member>/usr/bin/rhn-satellite-activate</member>
    <member>/etc/rhn/rhn.conf</member>
</simplelist>
</RefSect1>

<RefSect1><Title>Examples</Title>
<simplelist>
    <member><command>rhn-satellite-activate --manifest /tmp/manifest.zip</command></member>
    <member><command>rhn-satellite-activate --manifest /tmp/manifest.zip --disconnected</command></member>
    <member><command>rhn-satellite-activate --manifest-info</command></member>
    <member><command>rhn-satellite-activate --manifest-download</command></member>
    <member><command>rhn-satellite-activate --manifest-reconcile-request</command></member>
    <member><command>rhn-satellite-activate --manifest-refresh --disconnected</command></member>
    <member><command>rhn-satellite-activate --deactivate</command></member>
</simplelist>
</RefSect1>

<RefSect1><Title>See Also</Title>
<simplelist>
    <member>db-control(1) - embedded database environment only!</member>
    <member>rhn-charsets(8)</member>
    <member>rhnpush(8)</member>
    <member>rhn-schema-version(8)</member>
    <member>rhn-ssl-dbstore(8)</member>
    <member>cdn-sync(8)</member>
</simplelist>
</RefSect1>

<RefSect1><Title>Authors</Title>
<simplelist>
    <member>Todd Warner <email>taw@redhat.com</email></member>
    <member>Jan Dobes <email>jdobes@redhat.com</email></member>
</simplelist>
</RefSect1>
</RefEntry>
  070701000000E7000081FD0000000000000000000000015FBBE8EE00000442000000000000000000000000000000000000003300000000spacewalk-backend/satellite_tools/rhn-schema-stats    #!/bin/bash

if [[ $@ =~ "--help" ]] || [[ $@ =~ "-h" ]] || [ $# -ne 1 ]; then
	echo "Usage: `basename $0` -h | --help | output-file"
	exit
fi

if [ $(spacewalk-cfg-get db_backend) = "postgresql" ]; then
	sql="
select schemaname as schema,
       relname as table,
       n_live_tup as rows
  from pg_stat_user_tables
 order by n_live_tup desc;

select con.conname as name,
       con.contype as type,
       cl.relname as table,
       pg_get_expr(conbin, conrelid) as src
  from pg_constraint con,
       pg_class cl
 where cl.oid = con.conrelid
 order by name;

select
        rvi.label, to_char(rvi.created, 'YYYY-MM-DD') as created,
        to_char(rvi.modified, 'YYYY-MM-DD') as modified,
        rpn.name,
        rpe.epoch,
        rpe.version,
        rpe.release
from
        rhnVersionInfo rvi,
        rhnPackageName rpn,
        rhnPackageEvr rpe
where
        rvi.evr_id = rpe.id and
        rvi.name_id = rpn.id
order by created;
"

fi

output=$(echo "$sql" | spacewalk-sql --select-mode -)

if [ "$1" = "-" ]; then
        echo "$output"
else
        echo "$output" > $1
fi
  070701000000E8000081B40000000000000000000000015FBBE8EE00000795000000000000000000000000000000000000003800000000spacewalk-backend/satellite_tools/rhn-schema-stats.sgml   <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [
<!ENTITY THECOMMAND "rhn-schema-stats">

]>
<refentry>

<RefMeta>
<RefEntryTitle>&THECOMMAND;</RefEntryTitle><manvolnum>8</manvolnum>
<RefMiscInfo>Version 1.0.0</RefMiscInfo>
</RefMeta>

<RefNameDiv>
<RefName><command>&THECOMMAND;</command></RefName>
<RefPurpose>
utility for querying important SUSE Manager database schema statistics.
</RefPurpose>
</RefNameDiv>

<RefSynopsisDiv>
<Synopsis>
    <cmdsynopsis>
        <command>&THECOMMAND;</command>
        <arg choice="opt">-h | --help</arg>
	<arg choice="req">output-file</arg>
    </cmdsynopsis>
</Synopsis>
</RefSynopsisDiv>

<RefSect1><Title>Description</Title>

<para>
rhn-schema-stats retrieves important statistics from your SUSE Manager
database schema. Ordinarily, is used by spacewalk-debug
(satellite-debug), but it can be used standalone.
</para>

</RefSect1>

<RefSect1><Title>Options</Title>
<variablelist>
    <varlistentry>
        <term>-h | --help</term>
        <listitem>
            <para>Print usage information.</para>
        </listitem>
    </varlistentry>

    <varlistentry>
        <term>output-file</term>
        <listitem>
            <para>File name to save the retrieved information to. Use - if you wish to
                  print the output to stdout.</para>
        </listitem>
    </varlistentry>
</variablelist>
</RefSect1>

<RefSect1><Title>Files</Title>
<simplelist>
    <member>/usr/bin/&THECOMMAND;</member>
</simplelist>
</RefSect1>

<RefSect1><Title>Example</Title>
<simplelist>
        <member><command>&THECOMMAND; database.log</command></member>
</simplelist>
</RefSect1>

<RefSect1><Title>See Also</Title>
<simplelist>
    <member>spacewalk-debug(8)</member>
    <member>rhn-db-stats(8)</member>
</simplelist>
</RefSect1>

<RefSect1><Title>Authors</Title>
<simplelist>
    <member>Milan Zazrivec <email>mzazrivec@redhat.com</email></member>
</simplelist>
</RefSect1>
</RefEntry>
   070701000000E9000081FD0000000000000000000000015FBBE8EE000007BE000000000000000000000000000000000000003500000000spacewalk-backend/satellite_tools/rhn-schema-version  #!/usr/bin/python -u
#
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#


import sys
from os.path import exists, join


def errAndExit(errno, msg):
    sys.stderr.write(msg+'\n')
    sys.exit(errno)


# figure out import path
_LIBPATH = ""
for p in ["/var/www/rhns", "/usr/share/rhn"]:
    if exists(p) and exists(join(p, 'server')) and exists(join(p, 'common')):
        _LIBPATH = p
if _LIBPATH not in sys.path:
    sys.path.append(_LIBPATH)


try:
    from spacewalk.server import rhnSQL
except KeyboardInterrupt:
    sys.stderr.write("\nUser interrupted process.\n")
    sys.exit(0)


if __name__ == '__main__':
    rhnSQL.initDB()

    try:
        h = rhnSQL.prepare("""
                SELECT evr_t_as_vre_simple(PE.evr) as evrsimple
                  FROM rhnPackageEVR PE, rhnVersionInfo RVI, rhnPackageName PN
                 WHERE RVI.label = 'schema'
                   AND RVI.name_id = PN.id
                   AND RVI.evr_id = PE.id
                """)
        h.execute()
        row = h.fetchone_dict()
        if row:
            print(row['evrsimple'])
    except KeyboardInterrupt:
        sys.stderr.write("\nUser interrupted process.\n")
        sys.exit(0)
    except (rhnSQL.SQLError, rhnSQL.SQLSchemaError, rhnSQL.SQLConnectError) as e:
        # really a stub for better exception handling in the future.
        sys.stderr.write("SQL error occurred, traceback follows...\n")
        raise


  070701000000EA000081B40000000000000000000000015FBBE8EE00000591000000000000000000000000000000000000003A00000000spacewalk-backend/satellite_tools/rhn-schema-version.sgml <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [
<!ENTITY RHNSAT "SUSE Manager Server" >

]>
<refentry>

<RefMeta>
<RefEntryTitle>rhn-schema-version</RefEntryTitle><manvolnum>8</manvolnum>
<RefMiscInfo>Version 3.1.0</RefMiscInfo>
</RefMeta>

<RefNameDiv>
<RefName><command>rhn-schema-version</command></RefName>
<RefPurpose>
Fetch the database schema version for a &RHNSAT;.
</RefPurpose>
</RefNameDiv>

<RefSynopsisDiv>
<Synopsis>
    <cmdsynopsis>
        <command>rhn-schema-version</command>
        <arg>options <replaceable>...</replaceable></arg>
    </cmdsynopsis>
</Synopsis>
</RefSynopsisDiv>

<RefSect1><Title>Description</Title>
    <para>
        <emphasis>rhn-schema-version</emphasis> fetches the database schema
        version for an &RHNSAT;. It uses the database connection
        string found in /etc/rhn/rhn.conf.
    </para>
</RefSect1>

<RefSect1><Title>Files</Title>
<simplelist>
    <member>/etc/rhn/rhn.conf</member>
</simplelist>
</RefSect1>

<RefSect1><Title>See Also</Title>
<simplelist>
    <member>db-control(1) - embedded database environment only!</member>
    <member>rhn-charsets(8)</member>
    <member>rhnpush(8)</member>
    <member>rhn-ssl-dbstore(8)</member>
    <member>satellite-sync(8)</member>
</simplelist>
</RefSect1>

<RefSect1><Title>Authors</Title>
<simplelist>
    <member>Todd Warner <email>taw@redhat.com</email></member>
</simplelist>
</RefSect1>
</RefEntry>
   070701000000EB000081FD0000000000000000000000015FBBE8EE00000621000000000000000000000000000000000000003200000000spacewalk-backend/satellite_tools/rhn-ssl-dbstore #!/usr/bin/python -u
#
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#


## language imports
import sys
import os


mod_name = os.path.basename(sys.argv[0]).replace('-', '_')
try:
    mod = __import__("spacewalk.satellite_tools", globals(), locals(), [mod_name])
except KeyboardInterrupt:
    sys.stderr.write("\nUser interrupted process.\n")
    sys.exit(0)
except ImportError as e:
    sys.stderr.write("Unable to load module %s\n" % mod_name)
    sys.stderr.write(str(e) + "\n")
    sys.exit(1)
mod = getattr(mod, mod_name)


#-------------------------------------------------------------------------------
if __name__ == '__main__':
    try:
        sys.exit(abs(mod.main() or 0))
    except KeyboardInterrupt:
        sys.stderr.write("\nUser interrupted process.\n")
        sys.exit(0)
    except SystemExit:
        raise
    except:
        sys.stderr.write("\nERROR: unhandled exception occurred:\n")
        raise
#===============================================================================
   070701000000EC000081B40000000000000000000000015FBBE8EE00000AD3000000000000000000000000000000000000003700000000spacewalk-backend/satellite_tools/rhn-ssl-dbstore.sgml    <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [
<!ENTITY THECOMMAND "rhn-ssl-dbstore">

]>
<refentry>

<RefMeta>
<RefEntryTitle>&THECOMMAND;</RefEntryTitle><manvolnum>8</manvolnum>
<RefMiscInfo>Version 1.0.0</RefMiscInfo>
</RefMeta>

<RefNameDiv>
<RefName><command>&THECOMMAND;</command></RefName>
<RefPurpose>
This is a simple utility that pushes your CA SSL certificate into the local
database so that it can be used for things such as provisioning.
</RefPurpose>
</RefNameDiv>

<RefSynopsisDiv>
<Synopsis>
    <cmdsynopsis>
        <command>&THECOMMAND;</command>
        <arg>--ca-cert=<replaceable>CA_CERTIFICATE</replaceable></arg>
        <arg>--label=<replaceable>INTERNAL_LABEL</replaceable></arg>
        <arg>-v | --verbose</arg>
    </cmdsynopsis>
</Synopsis>
</RefSynopsisDiv>

<RefSect1><Title>Description</Title>

<para>This is a simple utility that pushes your CA SSL certificate into the
local database so that it can be used for things such as provisioning. It
should only be used if the CA certificate used for your servers has
changed. Database connection settings are read from /etc/rhn/rhn.conf. (see
the "db-*" settings)</para>

</RefSect1>

<RefSect1><Title>Options</Title>
<variablelist>
    <varlistentry>
        <term>--ca-cert=<replaceable>CA_CERTIFICATE</replaceable></term>
        <listitem>
            <para>Full path to the public CA certificate to be stored in the database.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--label=<replaceable>INTERNAL_LABEL</replaceable></term>
        <listitem>
            <para>FOR TESTING ONLY - alternative database label for this CA
            certificate, default is "RHN-ORG-TRUSTED-SSL-CERT"</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-v | --verbose</term>
        <listitem>
            <para>be verbose (accumulable: -vvv means "be *really* verbose").</para>
        </listitem>
    </varlistentry>
</variablelist>
</RefSect1>

<RefSect1><Title>Files</Title>
<simplelist>
    <member>/usr/bin/&THECOMMAND;</member>
</simplelist>
</RefSect1>

<RefSect1><Title>Example</Title>
<simplelist>
        <member><command>&THECOMMAND; --ca-cert=/root/ssl-build/RHN-ORG-TRUSTED-SSL-CERT</command></member>
</simplelist>
</RefSect1>

<RefSect1><Title>See Also</Title>
<simplelist>
    <member>db-control(1) - embedded database environment only!</member>
    <member>rhn-charsets(8)</member>
    <member>rhnpush(8)</member>
    <member>rhn-schema-version(8)</member>
    <member>rhn-ssl-tool(1)</member>
    <member>satellite-sync(8)</member>
</simplelist>
</RefSect1>

<RefSect1><Title>Authors</Title>
<simplelist>
    <member>Todd Warner <email>taw@redhat.com</email></member>
</simplelist>
</RefSect1>
</RefEntry>
 070701000000ED000081B40000000000000000000000015FBBE8EE000048EC000000000000000000000000000000000000003C00000000spacewalk-backend/satellite_tools/rhn_satellite_activate.py   #
# Copyright (c) 2008--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

# language imports
import os
import sys
import time
import tempfile
import re
from optparse import Option, OptionParser
from M2Crypto import X509

from rhn.connections import idn_ascii_to_puny
# Check if python-rhsm is installed
try:
    from rhsm.config import RhsmConfigParser
except ImportError:
    RhsmConfigParser = None

# common, server imports
from uyuni.common import fileutils
from spacewalk.common import rhnLog
from spacewalk.common.rhnConfig import CFG, initCFG, PRODUCT_NAME
from spacewalk.common.rhnTranslate import _
from spacewalk.server.rhnServer import satellite_cert
# Try to import cdn activation module if available
try:
    from spacewalk.cdn_tools import activation as cdn_activation
    from spacewalk.cdn_tools.manifest import MissingSatelliteCertificateError, ManifestValidationError,\
        IncorrectEntitlementsFileFormatError
    from spacewalk.cdn_tools.common import CdnMappingsLoadError
except ImportError:
    cdn_activation = None
    MissingSatelliteCertificateError = None
    ManifestValidationError = None
    CdnMappingsLoadError = None
from spacewalk.satellite_tools.syncLib import log, log2disk, log2


DEFAULT_RHSM_MANIFEST_LOCATION = '/etc/sysconfig/rhn/rhsm-manifest.zip'
DEFAULT_WEBAPP_GPG_KEY_RING = "/etc/webapp-keyring.gpg"
DEFAULT_CONFIG_FILE = "/etc/rhn/rhn.conf"
DEFAULT_RHSM_CONFIG_FILE = "/etc/rhsm/rhsm.conf"
SUPPORTED_RHEL_VERSIONS = ['5', '6']
LOG_PATH = '/var/log/rhn/activation.log'


def writeError(e):
    log2(0, 0, '\nERROR: %s\n' % e, stream=sys.stderr, cleanYN=1)


class CaCertInsertionError(Exception):
    "raise when fail to insert CA cert into the local database"


def getRHSMUuid():
    """ Tries to get UUID of of this system if it's registered into Subscription manager."""

    if RhsmConfigParser and os.path.isfile(DEFAULT_RHSM_CONFIG_FILE):
        cfg = RhsmConfigParser(config_file=DEFAULT_RHSM_CONFIG_FILE)
        cert_dir = cfg.get('rhsm', 'consumerCertDir')
        cert_path = os.path.join(cert_dir, 'cert.pem')
        if os.path.isfile(cert_path):
            f = open(cert_path, 'r')
            cert = X509.load_cert_string(f.read())
            f.close()
            subject = cert.get_subject()
            return subject.CN
    return None


class RHNCertGeneralSanityException(Exception):
    "general failure"


def getCertChecksumString(sat_cert):
    result = ""
    tree = {}

    # Scalar attributes of sat_cert
    for field in sat_cert.fields_scalar:
        tree[field] = getattr(sat_cert, field)
    # List attributes of sat_cert
    for name, value in list(sat_cert.fields_list.items()):
        field = value.attribute_name
        tree[name] = []
        for item in getattr(sat_cert, field):
            attributes = {}
            for k, v in list(item.attributes.items()):
                attr = getattr(item, v)
                if attr != "":
                    attributes[k] = attr
            tree[name].append(attributes)

    # Create string from tree
    for key in sorted(tree):
        if isinstance(tree[key], list):
            for item in sorted(tree[key], key=lambda item: "".join(sorted(list(item.keys()) + list(item.values())))):
                line = "%s" % key
                for attribute in sorted(item):
                    line += "-%s-%s" % (attribute, item[attribute])
                result += "%s\n" % line
        else:
            if tree[key] is not None:
                result += "%s-%s\n" % (key, tree[key])

    return result


def validateSatCert(cert):
    """ validating (i.e., verifing sanity of) this product.
        I.e., makes sure the product Certificate is a sane certificate
    """

    sat_cert = satellite_cert.SatelliteCert()
    sat_cert.load(cert)

    for key in ['generation', 'product', 'owner', 'issued', 'expires', 'slots']:
        if not getattr(sat_cert, key):
            writeError("Your satellite certificate is not valid. Field %s is not defined.\n"
                       "Please contact your support representative." % key)
            raise RHNCertGeneralSanityException("RHN Entitlement Certificate failed "
                                                "to validate.")

    signature = sat_cert.signature

    # copy cert to temp location (it may be gzipped).
    fd, certTmpFile = tempfile.mkstemp(prefix="/tmp/cert-")
    fo = os.fdopen(fd, 'wb')
    fo.write(getCertChecksumString(sat_cert))
    fo.flush()
    fo.close()

    fd, signatureTmpFile = tempfile.mkstemp(prefix="/tmp/cert-signature-")
    fo = os.fdopen(fd, 'wb')
    fo.write(signature)
    fo.flush()
    fo.close()

    args = ['gpg', '--verify', '-q', '--keyring',
            DEFAULT_WEBAPP_GPG_KEY_RING, signatureTmpFile, certTmpFile]

    log(1, "Checking cert XML sanity and GPG signature: %s" % repr(' '.join(args)))

    ret, out, err = fileutils.rhn_popen(args)
    err = err.read()
    out = out.read()

    # nuke temp cert
    os.unlink(certTmpFile)
    os.unlink(signatureTmpFile)

    if err.find('Ohhhh jeeee: ... this is a bug') != -1 or err.find('verify err') != -1 or ret:
        msg = "%s Entitlement Certificate failed to validate.\n" % PRODUCT_NAME
        msg += "MORE INFORMATION:\n"
        msg = msg + "  Return value: %s\n" % ret +\
                    "  Standard-out: %s\n" % out +\
                    "  Standard-error: %s" % err
        writeError(msg)
        raise RHNCertGeneralSanityException("RHN Entitlement Certificate failed "
                                            "to validate.")
    return 0


def writeRhsmManifest(options, manifest):
    if os.path.exists(DEFAULT_RHSM_MANIFEST_LOCATION):
        fileutils.rotateFile(DEFAULT_RHSM_MANIFEST_LOCATION, depth=5)
    fo = open(DEFAULT_RHSM_MANIFEST_LOCATION, 'w+b')
    fo.write(manifest)
    fo.close()
    # Delete from temporary location
    if options.manifest_refresh:
        os.unlink(options.manifest)
    options.manifest = DEFAULT_RHSM_MANIFEST_LOCATION


def storeRhsmManifest(options):
    """ storing of the RHSM manifest
        writing to default storage location
    """

    if options.manifest and options.manifest != DEFAULT_RHSM_MANIFEST_LOCATION:
        try:
            manifest = open(os.path.abspath(os.path.expanduser(options.manifest)), 'rb').read()
        except (IOError, OSError) as e:
            msg = _('"%s" (specified in commandline)\n'
                    'could not be opened and read:\n%s') % (options.manifest, str(e))
            writeError(msg)
            raise
        try:
            writeRhsmManifest(options, manifest)
        except (IOError, OSError) as e:
            msg = _('"%s" could not be opened\nand/or written to:\n%s') % (
                DEFAULT_RHSM_MANIFEST_LOCATION, str(e))
            writeError(msg)
            raise


def enableSatelliteRepo(rhn_cert):
    args = ['rpm', '-q', '--qf', '\'%{version} %{arch}\'', '-f', '/etc/redhat-release']
    ret, out, err = fileutils.rhn_popen(args)
    data = out.read().strip("'")
    version, arch = data.split()
    # Read from stdout, strip quotes if any and extract first number
    version = re.search(r'\d+', version).group()

    if version not in SUPPORTED_RHEL_VERSIONS:
        log(0, "WARNING: No Satellite repository available for RHEL version: %s." % version)
        return

    arch_str = "server"
    if arch == "s390x":
        arch_str = "system-z"

    sat_cert = satellite_cert.SatelliteCert()
    sat_cert.load(rhn_cert)
    sat_version = getattr(sat_cert, 'satellite-version')

    repo = "rhel-%s-%s-satellite-%s-rpms" % (version, arch_str, sat_version)
    args = ['/usr/bin/subscription-manager', 'repos', '--enable', repo]
    ret, out, err = fileutils.rhn_popen(args)
    if ret:
        msg_ = "Enabling of Satellite repository failed."
        msg = ("%s\nReturn value: %s\nStandard-out: %s\n\n"
               "Standard-error: %s\n"
               % (msg_, ret, out.read(), err.read()))
        writeError(msg)
        raise EnableSatelliteRepositoryException("Enabling of Satellite repository failed. Make sure Satellite "
                                                 "subscription is attached to this system, both versions of RHEL and "
                                                 "Satellite are supported or run activation with --disconnected "
                                                 "option.")


class EnableSatelliteRepositoryException(Exception):
    "when there is no attached satellite subscription in rhsm or incorrect combination of rhel and sat version"


def expiredYN(cert):
    """ dead simple check to see if our RHN cert is not expired
        returns either "" or the date of expiration.
    """

    # parse it and snag "expires"
    sc = satellite_cert.SatelliteCert()
    sc.load(cert)
    # note the correction for timezone
    # pylint: disable=E1101
    try:
        expires = time.mktime(time.strptime(sc.expires, sc.datesFormat_cert))-time.timezone
    except ValueError:
        writeError("Can't seem to parse the expires field in the RHN Certificate. "
                   "RHN Certificate's version is incorrect?")
        # a cop-out FIXME: not elegant
        sys.exit(11)

    now = time.time()
    if expires < now:
        return sc.expires
    else:
        return ''


def processCommandline():
    options = [
        Option('--sanity-only',  action='store_true', help="confirm certificate sanity. Does not activate "
               + "the Red Hat Satellite locally or remotely."),
        Option('--ignore-expiration', action='store_true', help='execute regardless of the expiration '
               + 'of the RHN Certificate (not recommended).'),
        Option('--ignore-version-mismatch', action='store_true', help='execute regardless of version '
               + 'mismatch of existing and new certificate.'),
        Option('-v', '--verbose', action='count',      help='be verbose '
               + '(accumulable: -vvv means "be *really* verbose").'),
        Option('--dump-version', action='store', help="requested version of XML dump"),
        Option('--manifest',     action='store',      help='the RHSM manifest path/filename to activate for CDN'),
        Option('--rhn-cert', action='store', help='this option is deprecated, use --manifest instead'),
        Option('--deactivate', action='store_true', help='deactivate CDN-activated Satellite'),
        Option('--disconnected', action='store_true', help="activate locally, not subscribe to remote repository"),
        Option('--manifest-info', action='store_true', help="show information about currently activated manifest"),
        Option('--manifest-download', action='store_true',
               help="download new manifest from RHSM to temporary location"),
        Option('--manifest-refresh', action='store_true', help="download new manifest from RHSM and activate it"),
        Option('--manifest-reconcile-request', action='store_true',
               help="request regeneration of entitlement certificates")
    ]

    parser = OptionParser(option_list=options)
    options, args = parser.parse_args()

    initCFG('server.satellite')
    if options.verbose is None:
        options.verbose = 0
    CFG.set('DEBUG', options.verbose)
    rhnLog.initLOG(LOG_PATH, options.verbose)
    log2disk(0, "Command: %s" % str(sys.argv))

    # we take no extra commandline arguments that are not linked to an option
    if args:
        writeError("These arguments make no sense in this context (try --help): %s" % repr(args))
        sys.exit(1)

    # No need to check further if deactivating
    if options.deactivate:
        return options

    if options.sanity_only:
        options.disconnected = 1

    if options.manifest_refresh:
        options.manifest_download = 1

    if CFG.DISCONNECTED and not options.disconnected:
        msg = """Satellite server has been setup to run in disconnected mode.
       Either correct server configuration in /etc/rhn/rhn.conf
       or use --disconnected to activate it locally."""
        writeError(msg)
        sys.exit(1)

    options.http_proxy = idn_ascii_to_puny(CFG.HTTP_PROXY)
    options.http_proxy_username = CFG.HTTP_PROXY_USERNAME
    options.http_proxy_password = CFG.HTTP_PROXY_PASSWORD
    log(1, 'HTTP_PROXY: %s' % options.http_proxy)
    log(1, 'HTTP_PROXY_USERNAME: %s' % options.http_proxy_username)
    log(1, 'HTTP_PROXY_PASSWORD: <password>')

    return options


#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

def main():
    """ main routine
        1    general failure
        10   general sanity check failure (to include a remedial cert
             version check)
        11   expired!
        12   certificate version fails remedially
        13   certificate missing in manifest
        14   manifest signature incorrect
        15   cannot load mapping files
        16   manifest download failed
        17   manifest refresh failed
        18   manifest entitlements parse failed
        30   local activation failure

        90   not registered to rhsm
        91   enabling sat repo failed

        127  general unknown failure (not really mapped yet)

        FIXME - need to redo how we process error codes - very manual
    """
    # pylint: disable=R0911

    options = processCommandline()

    if not cdn_activation:
        writeError("Package spacewalk-backend-cdn has to be installed for using this tool.")
        sys.exit(1)

    # CDN Deactivation
    if options.deactivate:
        cdn_activation.Activation.deactivate()
        # Rotate the manifest to not have any currently used
        if os.path.exists(DEFAULT_RHSM_MANIFEST_LOCATION):
            fileutils.rotateFile(DEFAULT_RHSM_MANIFEST_LOCATION, depth=5)
            os.unlink(DEFAULT_RHSM_MANIFEST_LOCATION)
        return 0

    if options.rhn_cert:
        writeError("Activation with RHN Classic Satellite Certificate is deprecated.\nPlease obtain a Manifest for this"
                   " Satellite version via https://access.redhat.com/knowledge/tools/satcert, "
                   "and re-run this activation tool with option --manifest=MANIFEST-FILE.")
        sys.exit(1)

    if not options.manifest:
        if os.path.exists(DEFAULT_RHSM_MANIFEST_LOCATION):
            options.manifest = DEFAULT_RHSM_MANIFEST_LOCATION
            if options.manifest_info:
                cdn_activation.Activation.manifest_info(DEFAULT_RHSM_MANIFEST_LOCATION)
                return 0
            # Call regeneration API on Candlepin server
            if options.manifest_reconcile_request:
                log(0, "Requesting manifest regeneration...")
                ok = cdn_activation.Activation.refresh_manifest(
                    DEFAULT_RHSM_MANIFEST_LOCATION,
                    http_proxy=options.http_proxy,
                    http_proxy_username=options.http_proxy_username,
                    http_proxy_password=options.http_proxy_password)
                if not ok:
                    writeError("Manifest regeneration failed!")
                    return 17
                log(0, "Manifest regeneration requested.")
                return 0
            # Get new refreshed manifest from Candlepin server
            if options.manifest_download:
                log(0, "Downloading manifest...")
                path = cdn_activation.Activation.download_manifest(
                    DEFAULT_RHSM_MANIFEST_LOCATION,
                    http_proxy=options.http_proxy,
                    http_proxy_username=options.http_proxy_username,
                    http_proxy_password=options.http_proxy_password)
                if not path:
                    writeError("Manifest download failed!")
                    return 16
                if options.manifest_refresh:
                    options.manifest = path
                else:
                    log(0, "New manifest saved to: '%s'" % path)
                    return 0
        else:
            writeError("No currently activated manifest was found. "
                       "Run the activation tool with option --manifest=MANIFEST.")
            return 1
    # Handle RHSM manifest
    try:
        cdn_activate = cdn_activation.Activation(options.manifest)
    except CdnMappingsLoadError as e:
        writeError(e)
        return 15
    except MissingSatelliteCertificateError as e:
        writeError(e)
        return 13
    except IncorrectEntitlementsFileFormatError as e:
        writeError(e)
        return 18

    # general sanity/GPG check
    try:
        validateSatCert(cdn_activate.manifest.get_satellite_certificate())
    except RHNCertGeneralSanityException as e:
        writeError(e)
        return 10

    # expiration check
    if not options.ignore_expiration:
        date = expiredYN(cdn_activate.manifest.get_satellite_certificate())
        if date:
            just_date = date.split(' ')[0]
            writeError(
                'Satellite Certificate appears to have expired: %s' % just_date)
            return 11

    if options.sanity_only:
        return 0

    if not options.disconnected:
        rhsm_uuid = getRHSMUuid()
        if not rhsm_uuid:
            writeError("System not registered to RHSM? No identity found. Please register system to RHSM"
                       " or run activation with --disconnected option.")
            return 90
        try:
            enableSatelliteRepo(cdn_activate.manifest.get_satellite_certificate())
        except EnableSatelliteRepositoryException:
            e = sys.exc_info()[1]
            writeError(e)
            return 91

    try:
        cdn_activate.activate()
    except ManifestValidationError:
        e = sys.exc_info()[1]
        writeError(e)
        return 14

    storeRhsmManifest(options)

    return 0


#-------------------------------------------------------------------------------
if __name__ == "__main__":
    sys.stderr.write('\nWARNING: intended to be wrapped by another executable\n'
                     '           calling program.\n')
    sys.exit(abs(main() or 0))
#===============================================================================
070701000000EE000081B40000000000000000000000015FBBE8EE00000CC5000000000000000000000000000000000000003500000000spacewalk-backend/satellite_tools/rhn_ssl_dbstore.py  #
# Copyright (c) 2009--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import os
import sys
from optparse import Option, OptionParser

from spacewalk.common import rhnTB
from spacewalk.server import rhnSQL

from . import satCerts

DEFAULT_TRUSTED_CERT = 'RHN-ORG-TRUSTED-SSL-CERT'


def processCommandline():

    options = [
        Option('--ca-cert',      action='store', default=DEFAULT_TRUSTED_CERT, type="string",
               help='public CA certificate, default is %s' % DEFAULT_TRUSTED_CERT),
        Option('--label',        action='store', default='RHN-ORG-TRUSTED-SSL-CERT', type="string",
               help='FOR TESTING ONLY - alternative database label for this CA certificate, '
               + 'default is "RHN-ORG-TRUSTED-SSL-CERT"'),
        Option('-v', '--verbose', action='count',
               help='be verbose (accumulable: -vvv means "be *really* verbose").'),
    ]

    values, args = OptionParser(option_list=options).parse_args()

    # we take no extra commandline arguments that are not linked to an option
    if args:
        msg = ("ERROR: these arguments make no sense in this context (try "
               "--help): %s\n" % repr(args))
        raise ValueError(msg)

    if not os.path.exists(values.ca_cert):
        sys.stderr.write("ERROR: can't find CA certificate at this location: "
                         "%s\n" % values.ca_cert)
        sys.exit(10)

    # pylint: disable=W0703
    try:
        rhnSQL.initDB()
    except Exception:
        sys.stderr.write("""\
ERROR: there was a problem trying to initialize the database:

%s\n""" % rhnTB.fetchTraceback())
        sys.exit(11)

    if values.verbose:
        print(('Public CA SSL certificate:  %s' % values.ca_cert))

    return values


#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

def main():
    """ main routine
        10  CA certificate not found
        11  DB initialization failure
        13  Couldn't insert the certificate for whatever reason.
    """

    values = processCommandline()

    def writeError(e):
        sys.stderr.write('\nERROR: %s\n' % e)

    try:
        satCerts.store_CaCert(values.label, values.ca_cert, verbosity=values.verbose)
    except satCerts.CaCertInsertionError:
        writeError("Cannot insert certificate into DB!\n\n%s\n" % rhnTB.fetchTraceback())
        sys.exit(13)
    return 0

#-------------------------------------------------------------------------------
if __name__ == "__main__":
    sys.stderr.write('\nWARNING: intended to be wrapped by another executable\n'
                     '           calling program.\n')
    sys.exit(main() or 0)
#===============================================================================
   070701000000EF000081B40000000000000000000000015FBBE8EE000021AE000000000000000000000000000000000000002E00000000spacewalk-backend/satellite_tools/satCerts.py #
# Cert-related functions
#   - RHN certificate
#   - SSL CA certificate
#
# Copyright (c) 2008--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

# language imports
import sys
from datetime import datetime

from M2Crypto import X509

# other rhn imports
from uyuni.common.rhnLib import utc
from uyuni.common.usix import raise_with_tb
from spacewalk.server import rhnSQL
from spacewalk.common.rhnTB import fetchTraceback

# bare-except and broad-except
# pylint: disable=W0702,W0703


# Get not before and not after timestamps from given X509 certificate
def get_certificate_info(cert_str):
    cert = X509.load_cert_string(cert_str)
    not_before = cert.get_not_before().get_datetime()
    not_after = cert.get_not_after().get_datetime()
    subject = cert.get_subject()
    cn = subject.CN
    serial_number = cert.get_serial_number()
    return cn, serial_number, not_before, not_after


def verify_certificate_dates(cert_str):
    _, _, not_before, not_after = get_certificate_info(cert_str)
    now = datetime.now(utc)
    return not_before < now < not_after


def get_all_orgs():
    """ Fetch org_id. Create first org_id if needed.
        owner only needed if no org_id present
        NOTE: this is duplicated elsewhere (backend.py)
              but I need the error differientiation of (1) too many orgs
              and (2) no orgs. backend.py does not differientiate.
    """

    # Get the org id
    h = rhnSQL.prepare(_queryLookupOrgId)
    h.execute()
    rows = h.fetchall_dict()
    return rows or []

_queryLookupOrgId = rhnSQL.Statement("""
    SELECT id
      FROM web_customer
""")

#
# SSL CA certificate section
#

class CaCertInsertionError(Exception):
    pass


def lookup_cert(description, org_id):
    if org_id:
        h = rhnSQL.prepare(_querySelectCryptoCertInfo)
        h.execute(description=description, org_id=org_id)
    else:
        h = rhnSQL.prepare(_querySelectCryptoCertInfoNullOrg)
        h.execute(description=description)

    row = h.fetchone_dict()
    return row

def _checkCertMatch_rhnCryptoKey(cert, description, org_id, deleteRowYN=0,
                                 verbosity=0):
    """ is there an CA SSL certificate already in the database?
        If yes:
            return ID:
              -1, then no cert in DB
              None if they are identical (i.e., nothing to do)
              0...N if cert is in database

        if found, optionally deletes the row and returns -1
        Used ONLY by: store_rhnCryptoKey(...)
    """

    row = lookup_cert(description, org_id)
    rhn_cryptokey_id = -1
    if row:
        if cert == rhnSQL._fix_encoding(rhnSQL.read_lob(row['key'])):
            # match found, nothing to do
            if verbosity:
                print("Nothing to do: certificate to be pushed matches certificate in database.")
            return
        # there can only be one (bugzilla: 120297)
        rhn_cryptokey_id = int(row['id'])
        # print 'found existing certificate - id:', rhn_cryptokey_id
        # NUKE IT!
        if deleteRowYN:
            # print 'found a cert, nuking it! id:', rhn_cryptokey_id
            h = rhnSQL.prepare('delete from rhnCryptoKey where id=:rhn_cryptokey_id')
            h.execute(rhn_cryptokey_id=rhn_cryptokey_id)
            # rhnSQL.commit()
            rhn_cryptokey_id = -1
    return rhn_cryptokey_id


def _insertPrep_rhnCryptoKey(rhn_cryptokey_id, description, org_id):
    """ inserts a row given that a cert is not already in the database
        lob rewrite occurs later during update.
        Used ONLY by: store_rhnCryptoKey(...)
    """

    # NOTE: due to a uniqueness constraint on description
    #       we can't increment and reinsert a row, so we only
    #       do so if the row does not exist.
    #       bugzilla: 120297 - and no I don't like it.
    rhn_cryptokey_id_seq = rhnSQL.Sequence('rhn_cryptokey_id_seq')
    rhn_cryptokey_id = rhn_cryptokey_id_seq.next()
    # print 'no cert found, new one with id:', rhn_cryptokey_id
    h = rhnSQL.prepare(_queryInsertCryptoCertInfo)
    # ...insert
    h.execute(rhn_cryptokey_id=rhn_cryptokey_id,
              description=description, org_id=org_id)
    return rhn_cryptokey_id


def _lobUpdate_rhnCryptoKey(rhn_cryptokey_id, cert):
    """ writes/updates the cert as a lob """

    # Use our update blob wrapper to accomodate differences between Oracle
    # and PostgreSQL:
    h = rhnSQL.cursor()
    try:
        h.update_blob("rhnCryptoKey", "key", "WHERE id = :rhn_cryptokey_id",
                      cert, rhn_cryptokey_id=rhn_cryptokey_id)
    except:
        # didn't go in!
        raise_with_tb(CaCertInsertionError("ERROR: CA certificate failed to be "
                                           "inserted into the database"), sys.exc_info()[2])


def store_CaCert(description, caCert, verbosity=0):
    org_ids = get_all_orgs()
    org_ids.append({'id': None})
    f = open(caCert, 'rb')
    try:
        cert = f.read().strip()
    finally:
        if f is not None:
            f.close()
    for org_id in org_ids:
        org_id = org_id['id']
        store_rhnCryptoKey(description, cert, org_id, verbosity)

def store_rhnCryptoKey(description, cert, org_id, verbosity=0):
    """ stores cert in rhnCryptoKey
        uses:
            _checkCertMatch_rhnCryptoKey
            _delete_rhnCryptoKey - not currently used
            _insertPrep_rhnCryptoKey
            _lobUpdate_rhnCryptoKey
    """
    try:
        # look for a cert match in the database
        rhn_cryptokey_id = _checkCertMatch_rhnCryptoKey(cert, description,
                                                        org_id, deleteRowYN=1,
                                                        verbosity=verbosity)
        if rhn_cryptokey_id is None:
            # nothing to do - cert matches
            return
        # insert into the database
        if rhn_cryptokey_id == -1:
            rhn_cryptokey_id = _insertPrep_rhnCryptoKey(rhn_cryptokey_id,
                                                        description, org_id)
        # write/update
        _lobUpdate_rhnCryptoKey(rhn_cryptokey_id, cert)
        rhnSQL.commit()
    except rhnSQL.sql_base.SQLError:
        raise_with_tb(CaCertInsertionError(
            "...the traceback: %s" % fetchTraceback()), sys.exc_info()[2])


def delete_rhnCryptoKey_null_org(description_prefix):
    h = rhnSQL.prepare(_queryDeleteCryptoCertInfoNullOrg)
    h.execute(description_prefix=description_prefix)


_queryDeleteCryptoCertInfoNullOrg = rhnSQL.Statement("""
    DELETE FROM rhnCryptoKey ck
    WHERE ck.description LIKE :description_prefix || '%%'
      AND ck.crypto_key_type_id = (SELECT id FROM rhnCryptoKeyType WHERE label = 'SSL')
      AND ck.org_id is NULL
""")

_querySelectCryptoCertInfo = rhnSQL.Statement("""
    SELECT ck.id, ck.description, ckt.label as type_label, ck.key
      FROM rhnCryptoKeyType ckt,
           rhnCryptoKey ck
     WHERE ckt.label = 'SSL'
       AND ckt.id = ck.crypto_key_type_id
       AND ck.description = :description
       AND ck.org_id = :org_id
""")

_querySelectCryptoCertInfoNullOrg = rhnSQL.Statement("""
    SELECT ck.id, ck.description, ckt.label as type_label, ck.key
      FROM rhnCryptoKeyType ckt,
           rhnCryptoKey ck
     WHERE ckt.label = 'SSL'
       AND ckt.id = ck.crypto_key_type_id
       AND ck.description = :description
       AND ck.org_id is NULL
""")

_queryInsertCryptoCertInfo = rhnSQL.Statement("""
    INSERT into rhnCryptoKey
           (id, org_id, description, crypto_key_type_id, key)
    SELECT :rhn_cryptokey_id, :org_id, :description, ckt.id, empty_blob()
      FROM rhnCryptoKeyType ckt
     WHERE ckt.label = 'SSL'
""")

def _test_store_rhnCryptoKey(caCert):
    description = 'RHN-ORG-TRUSTED-SSL-CERT'
    store_CaCert(description, caCert)

if __name__ == '__main__':
    rhnSQL.initDB()

    _test_store_rhnCryptoKey('ca.crt')

    # NOTE!!! This has be seg-faulting on exit, specifically upon closeDB()
    #         Bugzilla: 127324

    print("end of __main__")
    rhnSQL.closeDB()
    print("we have closed the database")
  070701000000F0000081B40000000000000000000000015FBBE8EE00001A7E000000000000000000000000000000000000003A00000000spacewalk-backend/satellite_tools/satComputePkgHeaders.py #
# Copyright (c) 2008--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# From the _apache.py
# this is a dummy module that makes pychecker happy and provides
# the _apache module, whcih is normally provided by mod_python
# when a script runs under it

import sys
from optparse import OptionParser, Option

from spacewalk.server import rhnSQL
from uyuni.common import rhn_rpm
from uyuni.common.rhn_pkg import InvalidPackageError

SERVER_RETURN = 0


def log_error(*_args):
    pass


def make_table(*_args):
    pass


def parse_qs(*_args):
    pass


def parse_qsl(*_args):
    pass

status = None
table = None
config_tree = None
server_root = None
mpm_query = None
exists_config_define = None

OK = 1

# End of _apache.py

sys.modules["_apache"] = sys.modules["__main__"]

options_table = [
    Option("-v", "--verbose",       action="count",
           help="Increase verbosity"),
    Option("--commit",              action="store_true",
           help="Commit work"),
    Option("--backup-file",         action="store",
           help="Backup packages into this file"),
    Option("--prefix",              action="store",     default='/pub',
           help="Prefix to find files in"),
]


class Runner:

    def __init__(self):
        self.options = None
        self._channels_hash = None
        self._channel_packages = {}

    def main(self):
        parser = OptionParser(option_list=options_table)

        (self.options, _args) = parser.parse_args()

        rhnSQL.initDB()

        self._channels_hash = self._get_channels()

        package_ids = self._get_packages()
        if package_ids is None:
            return 1

        if self.options.backup_file:
            self._backup_packages(package_ids, self.options.backup_file)

        try:
            self._add_package_header_values(package_ids)
        except:
            rhnSQL.rollback()
            raise

        if self.options.commit:
            print("Commiting work")
            rhnSQL.commit()
        else:
            print("Rolling back")
            rhnSQL.rollback()

    def _get_packages(self):
        package_ids = {}

        h = rhnSQL.prepare(self._query_get_packages)
        for channel_id in list(self._channels_hash.values()):
            h.execute(channel_id=channel_id)
            while 1:
                row = h.fetchone_dict()
                if not row:
                    break
                package_id = row['package_id']
                package_ids[package_id] = (row['path'], row['header_start'], row['header_end'])

        self._channel_packages = {}
        orphaned_packages = {}
        # Now, for each package, get the channels it's part of
        h = rhnSQL.prepare(self._query_get_channel_packages)
        for package_id in package_ids:
            h.execute(package_id=package_id)
            while 1:
                row = h.fetchone_dict()
                if not row:
                    break
                channel_label = row['label']
                if package_id in self._channel_packages:
                    l = self._channel_packages[package_id]
                else:
                    l = self._channel_packages[package_id] = []
                l.append(channel_label)

                if channel_label not in self._channels_hash:
                    orphaned_packages[package_id] = None

        if orphaned_packages:
            print("Bailing out because of packages shared with other channels")
            for package_id in orphaned_packages:
                channels = self._channel_packages[package_id]
                print((package_id, channels))
            return None

        return package_ids

    _query_get_channel_packages = rhnSQL.Statement("""
        select c.id, c.label
          from rhnChannel c,
               rhnChannelPackage cp
         where cp.package_id = :package_id
           and cp.channel_id = c.id
    """)

    _query_get_channels = rhnSQL.Statement("""
        select id, label from rhnChannel
    """)

    def _get_channels(self):
        h = rhnSQL.prepare(self._query_get_channels)
        h.execute()

        ret = {}
        while 1:
            row = h.fetchone_dict()
            if not row:
                break
            ret[row['label']] = row['id']
        return ret

    _query_get_packages = rhnSQL.Statement("""
        select cp.package_id, p.path, p.header_start, p.header_end
          from rhnChannelPackage cp,
               rhnPackage p
         where cp.channel_id = :channel_id
           and cp.package_id = p.id
           and p.path is not null
           and p.header_start = -1
    """)

    _query_add_package_header_values = rhnSQL.Statement("""
        update rhnPackage
           set header_start = :header_start,
               header_end = :header_end
         where id = :package_id
    """)

    def _add_package_header_values(self, package_ids):
        if not package_ids:
            return
        h = rhnSQL.prepare(self._query_add_package_header_values)
        for package_id, (path, header_start, header_end) in list(package_ids.items()):
            try:
                p_file = file(self.options.prefix + "/" + path, 'r')
            except IOError:
                print(("Error opening file %s" % path))
                continue

            try:
                (header_start, header_end) = rhn_rpm.get_header_byte_range(p_file)
            except InvalidPackageError:
                e = sys.exc_info()[1]
                print(("Error reading header size from file %s: %s" % (path, e)))

            try:
                h.execute(package_id=package_id, header_start=header_start, header_end=header_end)
            except rhnSQL.SQLError:
                pass

    @staticmethod
    def _backup_packages(package_ids, backup_file):
        f = open(backup_file, "w+")

        if not package_ids:
            return

        template = "update rhnPackage set header_start=%s and header_end=%s where id = %s;\n"
        for package_id, (_path, header_start, header_end) in list(package_ids.items()):
            s = template % (header_start, header_end, package_id)
            f.write(s)
        f.write("commit;\n")
        f.close()

if __name__ == '__main__':
    sys.exit(Runner().main() or 0)
  070701000000F1000081FD0000000000000000000000015FBBE8EE000018A1000000000000000000000000000000000000003100000000spacewalk-backend/satellite_tools/satellite-sync  #!/usr/bin/python
#
# Script to synchronize RHN meta data between Red Hat and a local Red Hat Satellite.
#
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

# For return codes see bottom of this file

if __name__ != '__main__':
    raise ImportError("module cannot be imported")

import sys


def systemExit(code, msgs=None):
    "Exit with a code and optional message(s). Saved a few lines of code."

    if msgs:
        if type(msgs) not in [type([]), type(())]:
            msgs = (msgs, )
        for msg in msgs:
            sys.stderr.write(str(msg) + '\n')
    sys.exit(code)


import os
import socket

if hasattr(socket, 'sslerror'):
    socket_error = socket.sslerror
else:
    from ssl import socket_error


# quick check to see if you are a super-user.
if os.getuid() != 0:
    sys.stderr.write('ERROR: must be root to execute\n')
    sys.exit(8)


try:
    from rhn import rhnLockfile
    from spacewalk.common.rhnTB import fetchTraceback
except KeyboardInterrupt:
    systemExit(0, "\nUser interrupted process.")
except ImportError:
    sys.stderr.write("Unable to find code tree.\n"
                     "Make sure that the needed libraries are installed and the path is correct: '%s'\n" % _LIBPATH)
    raise


# acquire lock/check for other instances of satellite-sync
#   i.e., lock against multiple instances of satellite-sync
LOCK = None
try:
    LOCK = rhnLockfile.Lockfile('/var/run/satellite-sync.pid')
except rhnLockfile.LockfileLockedException:
    systemExit(1, "SYNC ERROR: attempting to run more than one instance of mgr-inter-sync. Exiting.")

try:
    # NOTE: importing satsync will initialize the logs and CFG
    from spacewalk.satellite_tools import satsync, syncLib
except KeyboardInterrupt:
    systemExit(0, "\nUser interrupted process.")
except ImportError as e:
    systemExit(2, "Unable to find synchronization tools.\n"
                  "Error: %s" % e)


def repr_str(e):
    """ return a repr(e), str(e) string safely
        Will return something like:
            '''
            ...repr(e)...
            ...str(e)...'''
    """

    s = ''

    hasReprYN = hasattr(e, '__repr__')
    hasStrYN = hasattr(e, '__str__')

    if hasReprYN and hasStrYN and e.__repr__ == e.__str__:
        s = '\n%s' % repr(e)
    else:
        if hasReprYN:
            s = '\n%s' % repr(e)
        if hasStrYN:
            s = s + '\n%s' % str(e)
    return s


def systemExit_exception(code, msgs, e):
    """ Exit with a code. Message will head exception info.
        Traceback will be added to email log and written to disk.
        Email log is sent.
    """

    header = ''
    if msgs:
        if type(msgs) not in [type([]), type(())]:
            msgs = (msgs, )
        for msg in msgs:
            header = header + str(msg) + '\n'
        header = header + '\n'

    # write to disk (log file) and email
    tb = header + fetchTraceback()
    syncLib.log2disk(-1, tb)
    # force the whole email thing
    syncLib.initEMAIL_LOG()
    syncLib.log2email(-1, tb)

    # write to stderr, send the email, and exit
    stderrmsg = header + "(Check logs/email for potentially more detail)\n" + \
        repr_str(e) + '\n'
    satsync.sendMail(forceEmail=1)
    systemExit(code, stderrmsg)


def releaseLOCK():
    global LOCK
    if LOCK:
        LOCK.release()


def main():
    # execute
    try:
        return satsync.Runner().main()
    except KeyboardInterrupt:
        systemExit(0, "\nUser interrupted process.")
    except SystemExit:
        satsync.sendMail()
        raise
    except socket.error as e:
        msg = "\nERROR: a general socket exception occurred:"
        systemExit_exception(3, msg, e)
    except socket_error as e:
        msg = ("""
ERROR: an SSL error occurred. Recheck your SSL settings. Those settings may
       include URL's, SSL Certificate settings, firewall rules, etc..
       Also, check that your system time has not drifted! Time drift is one
       of the primary reasons for SSL connection failures.""")
        systemExit_exception(4, msg, e)
    except syncLib.RhnSyncException as e:
        msg = "\nSYNC ERROR:"
        systemExit_exception(5, msg, e)
    except Exception as e:
        msg = "\nSYNC ERROR: unhandled exception occurred:"
        systemExit_exception(6, msg, e)

    releaseLOCK()
    return 0


if __name__ == '__main__':
    try:
        sys.exit(abs(main() or 0))
    except KeyboardInterrupt:
        systemExit(0, "\nUser interrupted process.")
    except SystemExit as e:
        releaseLOCK()
        sys.exit(e.code)
    except Exception as e:
        releaseLOCK()
        systemExit_exception(7, "SYNC ERROR: attempting to display as much information as possible:", e)


# Returned codes means:
#-1 Could not lock file or KeyboardInterrupt or SystemExit
# 0  User interrupted process.
# 1  attempting to run more than one instance of satellite-sync.
# 2  Unable to find synchronization tools.
# 3  a general socket exception occurred
# 4  an SSL error occurred. Recheck your SSL settings.
# 5  RHN error
# 6  unhandled exception occurred
# 7  unknown sync error
# 8  ERROR: must be root to execute
# 9  rpclib fault during synchronization init
# 10 synchronization init error
# 11 Error parsing XML stream
# 12 Channel do not exist
# 13 SQL error during importing package metadata
# 14 SQL error during linking channel packages
# 15 SQL error during xml processing
# 16 server.mount_point not set in the configuration file
# 17 SQL error during retrieving the channels already imported in the satellite's database
# 18 Wrong db connection string in rhn.conf
# 19 Bad arguments
# 20 Could not connect to db.
# 21 Bad debug level
# 22 Not valid step
# 24 no such file
# 25 no such directory
# 26 ISS parent is not configure for ISS
   070701000000F2000081B40000000000000000000000015FBBE8EE00004A99000000000000000000000000000000000000003600000000spacewalk-backend/satellite_tools/satellite-sync.sgml <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [
<!ENTITY RHNSAT "SUSE Manager Server" >
<!ENTITY RHNSYNC "SUSE Manager Incremental Synchronization Tool" >

]>
<refentry>

<RefMeta>
<RefEntryTitle>satellite-sync</RefEntryTitle><manvolnum>8</manvolnum>
<RefMiscInfo>Version 3.5.0</RefMiscInfo>
</RefMeta>

<RefNameDiv>
<RefName><command>satellite-sync</command></RefName>
<RefPurpose>
Incrementally synchronize a SUSE Manager Server DB data and RPM repository with another SUSE Manager Server DB and RPM repository.
</RefPurpose>
</RefNameDiv>

<RefSynopsisDiv>
<Synopsis>
    <cmdsynopsis>
        <command>satellite-sync</command>
        <arg>options <replaceable>...</replaceable></arg>
        <arg>-m<replaceable>DIRECTORY</replaceable></arg>
        <arg>--mount-point=<replaceable>DIRECTORY</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
         <arg>-l</arg> <arg>--list-channels</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-c<replaceable>CHANNEL</replaceable></arg>
        <arg>--channel=<replaceable>CHANNEL</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--iss-parent=<replaceable>ISS_PARENT</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-p</arg> <arg>--print-configuration</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--step=[<replaceable>channels|rpms|packages|<!--source-packages|srpms|-->errata|kickstarts</replaceable>]</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--no-rpms</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--no-packages</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--no-ssl</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--force-all-errata</arg>
    </cmdsynopsis>
<!--
    <cmdsynopsis>
        <arg>- -source-packages</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>- -no-source-packages</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>- -no-srpms</arg>
    </cmdsynopsis>
-->
    <cmdsynopsis>
        <arg>--no-errata</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--no-kickstarts</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--keep-rpms</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--master</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--debug-level=<replaceable>DEBUG_LEVEL</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--email</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--traceback-mail=<replaceable>EMAIL_ADDESS(ES)</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-s<replaceable>HOSTNAME</replaceable></arg>
        <arg>--server=<replaceable>HOSTNAME</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--ignore-proxy</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--http-proxy=<replaceable>HOSTNAME:PORT</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--http-proxy-username=<replaceable>USERNAME</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--http-proxy-password=<replaceable>PASSWORD</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--ca-cert=<replaceable>SSL_CA_CERT_FULL_PATH</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--orgid=<replaceable>ORGID</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--systemid=<replaceable>SYSTEMID_PATH</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--batch-size=<replaceable>BATCH_SIZE</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--list-error-codes</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--no-ssl</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--sync-to-temp</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-h</arg> <arg>--help</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--usage</arg>
    </cmdsynopsis>
</Synopsis>
</RefSynopsisDiv>

<RefSect1><Title>Description</Title>
<para>
    The &RHNSYNC; (<emphasis>satellite-sync</emphasis>) synchronizes
    an &RHNSAT; with another SUSE Manager Server.
</para>
<para>
    This tool enables a &RHNSAT; to update its database metadata and
    RPM packages with that of another SUSE Manager Server. This action can be performed via
    the internet (ie. directly) or via the local file-system (an update/channel
    CD dumped to the appropriate mount point).
</para>
<para>
    Options set by default if no options given: --cache-refresh-level 2, and
    all --step options.
</para>
<para>
    The --step options describe a step in a process (channels,
    rpms, packages, errata, kickstarts). I.e. by default, the process is:
</para>
<para>
        <!--
        <simplelist>
            <member>o arches: sync arch data</member>
        </simplelist>
        <simplelist>
            <member>o channel-families: sync channel family data</member>
        </simplelist>
        -->
        <simplelist>
            <member>o channels: sync channel data</member>
        </simplelist>
        <simplelist>
            <member>o rpms: sync (fetch) rpms</member>
        </simplelist>
        <simplelist>
            <member>o packages: sync full package metadata for those rpms fetched successfully</member>
        </simplelist>
        <simplelist>
            <member>o errata: sync errata data</member>
        </simplelist>
        <simplelist>
            <member>o kickstarts: sync kickstart data</member>
        </simplelist>
</para>
<para>
    Each option is dependent on the other. So, for example, if you use
    "--step packages" and no other option, all other steps that occur prior to
    the "packages" step will be performed as well.
</para>
<para>
    As can be imagined, "--step channels" is called for nearly all operations.
</para>
</RefSect1>

<RefSect1><Title>Options</Title>
<variablelist>
    <varlistentry>
        <term>-h, --help</term>
        <listitem>
            <para>Display the help screen with a list of options.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--usage</term>
        <listitem>
            <para>Display the usage options for satellite sync.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-m<replaceable>DIRECTORY</replaceable>,
            --mount-point=<replaceable>DIRECTORY</replaceable></term>
        <listitem>
            <para>mount point for import : disk update or disconnected install only.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--consider-full</term>
        <listitem>
            <para>When this option is used, the export being synced from disk dump will be
                  considered to be a full export; any package in the channel
                  but not in the export will be deleted. Without this option all disk dumps
                  are interpreted as incremental dumps.
                  This option has sense only for --mount-point.
                  Sync via ISS is always considered as full sync.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--include-custom-channels</term>
        <listitem>
            <para>When satellite-sync is run without the -c/--channel options,
            traditionally only Red Hat channels (with null org) are resynced.
            With this option, existing custom channels are also synced from
	    the channel dump, regardless of whether they were created by previous
            satellite-sync run or manually.
            </para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-l, --list-channels</term>
        <listitem>
            <para>list all available channels for import/syncing and exit.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-c<replaceable>CHANNEL</replaceable>,
            --channel=<replaceable>CHANNEL</replaceable></term>
        <listitem>
            <para>process data for this channel only.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--iss-parent</term>
        <listitem>
            <para>parent satellite to import content from.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-p, --print-configuration</term>
        <listitem>
            <para>print the current configuration and exit.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--no-ssl</term>
        <listitem>
            <para>turn off SSL (not recommended).</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--no-rpms</term>
        <listitem>
            <para>do not fetch actual rpms.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--no-packages</term>
        <listitem>
            <para>do not process full package metadata.</para>
        </listitem>
    </varlistentry>
    <!--
    <varlistentry>
        <term>- -source-packages</term>
        <listitem>
            <para>do not process source package metadata.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>- -no-source-packages</term>
        <listitem>
            <para>do not process source package metadata.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>- -no-srpms</term>
        <listitem>
            <para></para>
        </listitem>
    </varlistentry>
    -->
    <varlistentry>
        <term>--no-errata</term>
        <listitem>
            <para>do not process errata data.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--no-kickstarts</term>
        <listitem>
            <para>do not process kickstart data (provisioning feature).</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--keep-rpms</term>
        <listitem>
            <para>do not remove rpms when importing from local dump.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--master</term>
        <listitem>
            <para>the fully qualified domain name of the master Satellite. Valid with
            --mount-point only. Required if you want to import org data and channel
            permissions.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--force-all-errata</term>
        <listitem>
            <simpara>forcibly process all errata metadata regardless of diff results.</simpara>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--debug-level=<replaceable>DEBUG_LEVEL</replaceable></term>
        <listitem>
            <para>Override the level (amount) of messaging to both the
            log files and the screen. This debug level is set in
            /etc/rhn/rhn.conf (the debug variable). The default setting
            (for normal levels of messaging) is 2. --debug-level can be set
            to a level between 0 (nearly no messaging) to 6 (insane amount of
            messaging).</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--email</term>
        <listitem>
            <para>e-mail a report of what was synced/imported (sent to whomever
            is considered the receiver of "traceback_mail").</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--traceback-mail=<replaceable>EMAIL_ADDRESS(ES)</replaceable></term>
        <listitem>
            <para>alternative email address(es) for all sync correspondence.
            Example: --traceback-mail="user1@example.com, user2@example.com".</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-s<replaceable>HOSTNAME</replaceable>,
           --server=<replaceable>HOSTNAME</replaceable></term>
        <listitem>
            <para>alternative server with which to connect (hostname).</para>
        </listitem>
    </varlistentry>
</variablelist>
</RefSect1>

<RefSect1><Title>DEBUGGING and EXPERIMENTAL Options</Title>
<variablelist>
    <varlistentry>
        <term>--step=[<replaceable>channels|rpms|packages|errata|kickstarts</replaceable>]</term>
        <listitem>
            <para>DEBUG ONLY:</para>
            <para>Perform the sync process *only* to the step specified</para>
            <variablelist>
                <!--
                <varlistentry>
                <term>channel-families</term>
                <listitem>
                    <para>process channel family data. ***don't use this
                    option*** It is rarely used. The step, "channels",
                    or nearly any other step, will process channel families
                    as well.</para>
                </listitem>
                </varlistentry>
                -->
                <varlistentry>
                <term>channels</term>
                <listitem>
                    <para>process channel data. This option will automatically
                    enable the "arches" step.</para>
                </listitem>
                </varlistentry>
                <varlistentry>
                <term>rpms</term>
                <listitem>
                    <para>fetch rpms and fill repository. This option will
                    automatically enable the "channels" step.</para>
                </listitem>
                </varlistentry>
                <varlistentry>
                <term>packages</term>
                <listitem>
                    <para>process full package metadata (can be very slow). This
                    option will automatically enable the "rpms" step.</para>
                </listitem>
                </varlistentry>
                <!--
                <varlistentry>
                <term>source-packages</term>
                <listitem>
                    <para>process source package metadata.</para>
                    <para>this option will automatically enable -step packages.</para>
                </listitem>
                </varlistentry>
                -->
                <varlistentry>
                <term>errata</term>
                <listitem>
                    <para>process errata data. This option will
                    automatically enable the "channels" step.</para>
                </listitem>
                </varlistentry>
                <varlistentry>
                <term>kickstarts</term>
                <listitem>
                    <simpara>process kickstart data (metadata and files) for
                    provisioning. This option will automatically enable the
                    "channels" step.</simpara>
                </listitem>
                </varlistentry>
            </variablelist>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--ignore-proxy</term>
        <listitem>
            <para>Do not use an http proxy under any circumstances</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--http-proxy=<replaceable>HOSTNAME:PORT</replaceable></term>
        <listitem>
            <para>alternative http proxy (hostname:port)</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--http-proxy-username=<replaceable>USERNAME</replaceable></term>
        <listitem>
            <para>alternative http proxy username</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--http-proxy-password=<replaceable>PASSWORD</replaceable></term>
        <listitem>
            <para>alternative http proxy password</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--ca-cert=<replaceable>SSL_CA_CERT_FULL_PATH</replaceable></term>
        <listitem>
            <para>alternative SSL CA Cert (fullpath to cert file)</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--orgid=<replaceable>ORGID</replaceable></term>
        <listitem>
            <para>Organization to which the sync imports data.
            The default is to the administrator's account.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--systemid=<replaceable>SYSTEMID_PATH</replaceable></term>
        <listitem>
            <para>DEBUG ONLY: alternative path to digital system id. This option
            is generally only useful for internal testing.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--batch-size=<replaceable>BATCH_SIZE</replaceable></term>
        <listitem>
            <para>DEBUG ONLY: maximum batch-size for XML/database-import processing
            (1..50).</para>
            <para>This option should not be used except for debugging
            purposes. The most useful case being --batch-size=1 where the
            XML parser and database import process each piece of meta-data
            one at a time, isolating any issues.</para>
            <para>WARNING: --batch-size=1 will dramatically slow down the
            sync process.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--list-error-codes</term>
        <listitem>
            <para>list the possible exit codes for satellite-sync</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--sync-to-temp</term>
        <listitem>
            <para>stream content being synchronized to a tempfile</para>
            <para>On heavily-loaded systems, or network topologies with short timeouts, it
            is possible for a satellite-sync to abort with 'IncompleteRead: IncompleteRead(..)',
            and a UnicodeDecodeError in the sync-logs. This is the result of a partial
            read in the midst of a GzipStream.</para>
            <para>This option tells satellite-sync to stream content being synchronized to a
            local tempfile prior to passing it to the rest of the satellite-sync processing,
            which alleviates this issue.</para>
            <para>This option can be made the default for all satellite-syncs by setting the
            configuration option 'sync_to_temp = 1' in /etc/rhn/rhn.conf.</para>
        </listitem>
    </varlistentry>
</variablelist>
</RefSect1>

<RefSect1><Title>Examples</Title>
<simplelist>
        <member><command>satellite-sync -m /var/tmp/channel-dumps --list-channels</command></member>
        <member><command>satellite-sync -m /var/tmp/channel-dumps -c rhel-x86_64-server-7</command></member>
        <member><command>satellite-sync --iss-parent=stage-satellite.yourorg.com -c rhel-x86_64-server-7</command></member>
</simplelist>
</RefSect1>

<RefSect1><Title>See Also</Title>
<simplelist>
    <member>db-control(1) - embedded database environment only!</member>
    <member>rhn-charsets(8)</member>
    <member>rhnpush(8)</member>
    <member>rhn-schema-version(8)</member>
    <member>rhn-ssl-dbstore(8)</member>
</simplelist>
</RefSect1>

<RefSect1><Title>Authors</Title>
<simplelist>
    <member>Todd Warner <email>taw@redhat.com</email></member>
    <member>Mihai Ibanescu <email>misa@redhat.com</email></member>
    <member>Pradeep Kilambi <email>pkilambi@redhat.com</email></member>
</simplelist>
</RefSect1>
</RefEntry>

<!--
vim: sw=4
-->
   070701000000F3000081B40000000000000000000000015FBBE8EE00019FD7000000000000000000000000000000000000002D00000000spacewalk-backend/satellite_tools/satsync.py  #
# Copyright (c) 2008--2018 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# Spacewalk Incremental Synchronization Tool
#    main function.


# __lang. imports__
# pylint: disable=E0012, C0413
import datetime
import os
import sys
import stat
import time
import fnmatch
try:
    #  python 2
    import Queue
except ImportError:
    #  python3
    import queue as Queue # pylint: disable=F0401
import threading
from optparse import Option, OptionParser
import gettext
from rhn.connections import idn_ascii_to_puny, idn_puny_to_unicode

sys.path.append("/usr/share/rhn")
from up2date_client import config

# __rhn imports__
from uyuni.common import usix
from uyuni.common import rhnLib
from spacewalk.common import rhnMail
from spacewalk.common.rhnLog import initLOG
from spacewalk.common.rhnConfig import CFG, initCFG, PRODUCT_NAME
from spacewalk.common.rhnTB import exitWithTraceback, fetchTraceback
from uyuni.common.checksum import getFileChecksum
from spacewalk.server import rhnSQL
from spacewalk.server.rhnSQL import SQLError, SQLSchemaError, SQLConnectError
from spacewalk.server.rhnLib import get_package_path
from uyuni.common import fileutils

# __rhn sync/import imports__
from spacewalk.satellite_tools import xmlWireSource
from spacewalk.satellite_tools import xmlDiskSource
from spacewalk.satellite_tools.progress_bar import ProgressBar
from spacewalk.satellite_tools.xmlSource import FatalParseException, ParseException
from spacewalk.satellite_tools.diskImportLib import rpmsPath

from spacewalk.satellite_tools.syncLib import log, log2, log2disk, log2stderr, log2email
from spacewalk.satellite_tools.syncLib import RhnSyncException, RpmManip, ReprocessingNeeded
from spacewalk.satellite_tools.syncLib import initEMAIL_LOG, dumpEMAIL_LOG
from spacewalk.satellite_tools.syncLib import FileCreationError, FileManip

from spacewalk.satellite_tools.SequenceServer import SequenceServer
from spacewalk.server.importlib.errataCache import schedule_errata_cache_update

from spacewalk.server.importlib.importLib import InvalidChannelFamilyError
from spacewalk.server.importlib.importLib import MissingParentChannelError
from spacewalk.server.importlib.importLib import get_nevra, get_nevra_dict

from spacewalk.satellite_tools import satCerts
from spacewalk.satellite_tools import req_channels
from spacewalk.satellite_tools import messages
from spacewalk.satellite_tools import sync_handlers
from spacewalk.satellite_tools import constants

translation = gettext.translation('spacewalk-backend-server', fallback=True)
_ = translation.gettext
initCFG('server.satellite')
initLOG(CFG.LOG_FILE, CFG.DEBUG)

_DEFAULT_SYSTEMID_PATH = '/etc/sysconfig/rhn/systemid'
DEFAULT_ORG = 1

# the option object is used everywhere in this module... make it a
# global so we don't have to pass it to everyone.
OPTIONS = None

# pylint: disable=W0212


class Runner:
    step_precedence = {
        'packages': ['download-packages'],
        'source-packages': ['download-source-packages'],
        'errata': ['download-errata'],
        'kickstarts': ['download-kickstarts'],
        'rpms': [''],
        'srpms': [''],
        'channels': ['channel-families'],
        'channel-families': [''],
        'short': [''],
        'download-errata': ['errata'],
        'download-packages': [''],
        'download-source-packages': [''],
        'download-kickstarts': [''],
        'arches': [''],  # 5/26/05 wregglej 156079 Added arches to precedence list.
        'orgs': [''],
        'supportinfo': ['channels', 'packages'],
        'suse-products': ['arches', 'channel-families'],
        'scc-repositories': [''],
        'suse-product-channels': ['suse-products', 'channels'],
        'suse-upgrade-paths': ['suse-products'],
        'suse-product-extensions': ['suse-products'],
        'suse-product-repositories': ['suse-products', 'scc-repositories'],
        'suse-subscriptions': ['channel-families'],
        'cloned-channels': ['channels'],
    }

    # The step hierarchy. We need access to it both for command line
    # processing and for the actions themselves
    step_hierarchy = [
        'orgs',
        'channel-families',
        'arches',
        'channels',
        'short',
        'cloned-channels',
        'download-packages',
        'rpms',
        'packages',
        'srpms',
        'download-source-packages',
        'download-errata',
        'download-kickstarts',
        'source-packages',
        'errata',
        'kickstarts',
        'supportinfo',
        'suse-products',
        'scc-repositories',
        'suse-product-channels',
        'suse-upgrade-paths',
        'suse-product-extensions',
        'suse-product-repositories',
        'suse-subscriptions',
    ]

    def __init__(self):
        self.syncer = None
        self.packages_report = None
        self._xml_file_dir_error_message = ''
        self._affected_channels = None
        self._packages_report = None
        self._actions = None

    # 5/24/05 wregglej - 156079 turn off a step's dependents in the step is turned off.
    def _handle_step_dependents(self, actionDict, step):
        ad = actionDict

        if step in ad:
            # if the step is turned off, then the steps that are dependent on it have to be turned
            # off as well.
            if ad[step] == 0:
                ad = self._turn_off_dependents(ad, step)

        # if the step isn't in the actionDict, then it's dependent actions must be turned off.
        else:
            ad = self._turn_off_dependents(ad, step)
        return ad

    # 5/24/05 wregglej - 156079 actually turns off the dependent steps, which are listed in the step_precedence
    # dictionary.
    def _turn_off_dependents(self, actionDict, step):
        ad = actionDict
        for dependent in self.step_precedence[step]:
            if dependent in ad:
                ad[dependent] = 0
        return ad

    def main(self):
        """Main routine: commandline processing, etc..."""

        # let's time the whole process
        timeStart = time.time()

        actionDict, channels = processCommandline()

        #5/24/05 wregglej - 156079 turn off an step's dependent steps if it's turned off.
        #look at self.step_precedence for a listing of how the steps are dependent on each other.
        for st in self.step_hierarchy:
            actionDict = self._handle_step_dependents(actionDict, st)
        self._actions = actionDict

        # 5/26/05 wregglej - 156079 have to handle the list-channels special case.
        if 'list-channels' in actionDict:
            if actionDict['list-channels'] == 1:
                actionDict['channels'] = 1
                actionDict['arches'] = 0
                actionDict['channel-families'] = 1
                channels = []

        # create and set permissions for package repository mountpoint.
        _verifyPkgRepMountPoint()

        if OPTIONS.email:
            initEMAIL_LOG()

        # init the synchronization processor
        self.syncer = Syncer(channels, actionDict['list-channels'], actionDict['rpms'],
                             forceAllErrata=actionDict['force-all-errata'])
        try:
            self.syncer.initialize()
        except (KeyboardInterrupt, SystemExit):
            raise
        except xmlWireSource.rpclib.xmlrpclib.Fault:
            e = sys.exc_info()[1]
            if CFG.ISS_PARENT:
                # we met old satellite who do not know ISS
                log(-1, ['', messages.sw_iss_not_available % e.faultString ], )
                sys.exit(26)
            else:
                log(-1, ['', messages.syncer_error % e.faultString], )
                sys.exit(9)

        except Exception:  # pylint: disable=E0012, W0703
            e = sys.exc_info()[1]
            log(-1, ['', messages.syncer_error % e], )
            log(-1, '*** TRACEBACK: ')
            import traceback
            log(-1, traceback.format_exc())
            log(-1, '*** BASIC INFO:\n %s' % str(sys.exc_info()[:2]))
            sys.exit(10)

        log(1, '   db:  %s/<password>@%s' % (CFG.DB_USER, CFG.DB_NAME))

        selected = [action for action in list(actionDict) if actionDict[action]]
        log2(-1, 3, "Action list/commandline toggles: %s" % repr(selected),
             stream=sys.stderr)

        if OPTIONS.mount_point:
            self._xml_file_dir_error_message = messages.file_dir_error % \
                OPTIONS.mount_point

        if CFG.DB_BACKEND == 'postgresql':
            import psycopg2 #pylint: disable=F0401
            exception = psycopg2.IntegrityError

        for _try in range(2):
            try:
                for step in self.step_hierarchy:
                    if not actionDict[step]:
                        continue
                    method_name = '_step_' + step.replace('-', '_')
                    if not hasattr(self, method_name):
                        log(-1, _("No handler for step %s") % step)
                        continue
                    method = getattr(self, method_name)
                    ret = method()
                    if ret:
                        sys.exit(ret)
                else:  # for
                    # Everything went fine
                    break
            except ReprocessingNeeded:
                # Try one more time - this time it should be faster since
                # everything should be cached
                log(1, _('Environment changed, trying again...'))
                continue
            except RhnSyncException:
                rhnSQL.rollback()
                raise
            except exception:
                e = sys.exc_info()[1]
                msg = _("ERROR: Encountered IntegrityError: \n"
                        + str(e)
                        + "\nconsider removing mgr-inter-sync cache at /var/cache/rhn/satsync/*"
                        + " and re-run mgr-inter-sync with same options.\n"
                        + "If this error persits after removing cache, please contact SUSE support.")
                log2stderr(-1, msg, cleanYN=1)
                return 1
        else:
            log(1, _('Repeated failures'))

        timeEnd = time.time()
        delta_str = self._get_elapsed_time(timeEnd - timeStart)

        log(1, _("""\
    Import complete:
        Begin time: %s
        End time:   %s
        Elapsed:    %s
          """) % (formatDateTime(dt=time.localtime(timeStart)),
                  formatDateTime(dt=time.localtime(timeEnd)),
                  delta_str),
            cleanYN=1)

        # mail out that log if appropriate
        sendMail()
        return 0

    @staticmethod
    def _get_elapsed_time(elapsed):
        elapsed = int(elapsed)
        hours = int(elapsed / 60 / 60)
        mins = int(elapsed / 60) - (hours * 60)
        secs = elapsed - mins * 60 - hours * 60 * 60

        delta_list = [[hours, _("hours")], [mins, _("minutes")], [secs, _("seconds")]]
        delta_str = ", ".join(["%s %s" % (l[0], l[1]) for l in delta_list])
        return delta_str

    def _run_syncer_step(self, function, step_name):
        """ Runs a function, and catches the most common error cases """
        try:
            ret = function()
        except (xmlDiskSource.MissingXmlDiskSourceDirError,
                xmlDiskSource.MissingXmlDiskSourceFileError) as e:
            log(-1, self._xml_file_dir_error_message +
                '\n       Error message: %s\n' % e)
            return 1
        except (KeyboardInterrupt, SystemExit):
            raise
        except xmlWireSource.rpclib.xmlrpclib.Fault:
            e = sys.exc_info()[1]
            log(-1, messages.failed_step % (step_name, e.faultString))
            return 1
        except Exception:  # pylint: disable=E0012, W0703
            e = sys.exc_info()[1]
            log(-1, messages.failed_step % (step_name, e))
            return 1
        return ret

    def _step_arches(self):
        self.syncer.processArches()

    def _step_channel_families(self):
        self.syncer.processChannelFamilies()

    def _step_channels(self):
        try:
            self.syncer.process_channels()
        except MissingParentChannelError:
            e = sys.exc_info()[1]
            msg = messages.parent_channel_error % repr(e.channel)
            log(-1, msg)
            # log2email(-1, msg) # redundant
            sendMail()
            return 1

    def _step_short(self):
        try:
            return self.syncer.processShortPackages()
        except xmlDiskSource.MissingXmlDiskSourceFileError:
            msg = _("ERROR: The dump is missing package data, "
                    + "use --no-rpms to skip this step or fix the content to include package data.")
            log2disk(-1, msg)
            log2stderr(-1, msg, cleanYN=1)
            sys.exit(25)

    def _step_download_packages(self):
        return self.syncer.download_package_metadata()

    def _step_download_source_packages(self):
        return self.syncer.download_source_package_metadata()

    def _step_rpms(self):
        self._packages_report = self.syncer.download_rpms()
        return None

    # def _step_srpms(self):
    #   return self.syncer.download_srpms()

    def _step_download_errata(self):
        return self.syncer.download_errata()

    def _step_download_kickstarts(self):
        return self.syncer.download_kickstarts()

    def _step_packages(self):
        self._affected_channels = self.syncer.import_packages()

    # def _step_source_packages(self):
    #     self.syncer.import_packages(sources=1)

    def _step_errata(self):
        self.syncer.import_errata()
        # Now that errata have been populated, schedule an errata cache
        # refresh
        schedule_errata_cache_update(self._affected_channels)

    def _step_kickstarts(self):
        self.syncer.import_kickstarts()

    def _step_orgs(self):
        try:
            self.syncer.import_orgs()
        except (RhnSyncException, xmlDiskSource.MissingXmlDiskSourceFileError,
                xmlDiskSource.MissingXmlDiskSourceDirError):
            # the orgs() method doesn't exist; that's fine we just
            # won't sync the orgs
            log(1, [_("The SUSE Manager master does not support syncing orgs data."), _("Skipping...")])

    def _step_supportinfo(self):
        self.syncer.import_supportinfo()

    def _step_suse_products(self):
        self.syncer.import_suse_products()

    def _step_suse_product_channels(self):
        self.syncer.import_suse_product_channels()

    def _step_suse_upgrade_paths(self):
        self.syncer.import_suse_upgrade_paths()

    def _step_suse_product_extensions(self):
        self.syncer.import_suse_product_extensions()

    def _step_suse_product_repositories(self):
        self.syncer.import_suse_product_repositories()

    def _step_scc_repositories(self):
        self.syncer.import_scc_repositories()

    def _step_suse_subscriptions(self):
        self.syncer.import_suse_subscriptions()

    def _step_cloned_channels(self):
        self.syncer.import_cloned_channels()


def sendMail(forceEmail=0):
    """ Send email summary """
    if forceEmail or (OPTIONS is not None and OPTIONS.email):
        body = dumpEMAIL_LOG()
        if body:
            print((_("+++ sending log as an email +++")))
            host_label = idn_puny_to_unicode(os.uname()[1])
            headers = {
                'Subject' : _('SUSE Manager Inter Server sync. report from %s') % host_label,
            }
            sndr = "root@%s" % host_label
            if CFG.default_mail_from:
                sndr = CFG.default_mail_from
            rhnMail.send(headers, body, sender=sndr)
        else:
            print((_("+++ email requested, but there is nothing to send +++")))
        # mail was sent. Let's not allow it to be sent twice...
        OPTIONS.email = None


class Syncer:

    """ high-level sychronization/import class
        NOTE: there should *ONLY* be one instance of this.
    """

    def __init__(self, channels, listChannelsYN, check_rpms, forceAllErrata=False):
        """ Base initialization. Most work done in self.initialize() which
            needs to be called soon after instantiation.
        """

        self._requested_channels = channels
        self.mountpoint = OPTIONS.mount_point
        self.listChannelsYN = listChannelsYN
        self.forceAllErrata = forceAllErrata
        self.sslYN = not OPTIONS.no_ssl
        self._systemidPath = OPTIONS.systemid or _DEFAULT_SYSTEMID_PATH
        self._batch_size = OPTIONS.batch_size
        self.master_label = OPTIONS.master
        #self.create_orgs = OPTIONS.create_missing_orgs
        self.xml_dump_version = OPTIONS.dump_version or str(constants.PROTOCOL_VERSION)
        self.check_rpms = check_rpms
        self.keep_rpms = OPTIONS.keep_rpms

        # Object to help with channel math
        self._channel_req = None
        self._channel_collection = sync_handlers.ChannelCollection()

        self.containerHandler = sync_handlers.ContainerHandler(
            self.master_label)

        # instantiated in self.initialize()
        self.xmlDataServer = None
        self.systemid = None

        self.reporegen = set()

        # self._*_full hold list of all ids for appropriate channel while
        # non-full self._* contain every id only once (in first channel it appeared)
        self._channel_packages = {}
        self._channel_packages_full = {}
        self._avail_channel_packages = {}

        self._missing_channel_packages = None
        self._missing_fs_packages = None

        self._failed_fs_packages = Queue.Queue()
        self._extinct_packages = Queue.Queue()

        self._channel_errata = {}
        self._missing_channel_errata = {}

        self._channel_source_packages = {}
        self._channel_source_packages_full = {}

        self._channel_kickstarts = {}
        self._avail_channel_source_packages = None
        self._missing_channel_src_packages = None
        self._missing_fs_source_packages = None

        self._supportinfo = {}

    def initialize(self):
        """Initialization that requires IO, etc."""

        # Sync from filesystem:
        if self.mountpoint:
            log(1, [_(PRODUCT_NAME + ' - file-system synchronization'),
                    '   mp:  %s' % self.mountpoint])
            self.xmlDataServer = xmlDiskSource.MetadataDiskSource(self.mountpoint)
        # Sync across the wire:
        else:
            self.xmlDataServer = xmlWireSource.MetadataWireSource(self.systemid,
                                                                  self.sslYN, self.xml_dump_version)
            if CFG.ISS_PARENT:
                sync_parent = CFG.ISS_PARENT
                self.systemid = 'N/A'   # systemid is not used in ISS auth process
                is_iss = 1
            else:
                log(1, _(PRODUCT_NAME + ' - live synchronization'))
                log(-1, _("ERROR: Live content synchronizing with RHN Classic Hosted is no longer supported.\nPlease "
                          "use the cdn-sync command instead unless you are attempting to sync from another {PRODUCT_NAME} "
                          "via Inter-Server-Sync (ISS), or from local content on disk via Channel Dump ISOs."),
                    stream=sys.stderr).format(PRODUCT_NAME=PRODUCT_NAME)
                sys.exit(1)

            url = self.xmlDataServer.schemeAndUrl(sync_parent)
            log(1, [_(PRODUCT_NAME + ' - live synchronization'),
                    _('   url: %s') % url,
                    _('   debug/output level: %s') % CFG.DEBUG])
            self.xmlDataServer.setServerHandler(isIss=is_iss)

            if not self.systemid:
                # check and fetch systemid (NOTE: systemid kept in memory... may or may not
                # be better to do it this way).
                if (os.path.exists(self._systemidPath)
                        and os.access(self._systemidPath, os.R_OK)):
                    self.systemid = open(self._systemidPath, 'rb').read()
                else:
                    usix.raise_with_tb(RhnSyncException(_('ERROR: this server must be registered with SUSE Manager.')),
                                       sys.exc_info()[2])
            # authorization check of the satellite
            auth = xmlWireSource.AuthWireSource(self.systemid, self.sslYN,
                                                self.xml_dump_version)
            auth.checkAuth()

    def __del__(self):
        self.containerHandler.close()

    def _process_simple(self, remote_function_name, step_name):
        """ Wrapper function that can process metadata that is relatively
            simple. This does the decoding of data (over the wire or from
            disk).

            step_name is just for pretty printing the actual --step name to
            the console.

            The remote function is passed by name (as a string), to mimic the
            lazy behaviour of the if block
        """

        log(1, ["", _("Retrieving / parsing %s data") % step_name])
        # get XML stream
        stream = None
        method = getattr(self.xmlDataServer, remote_function_name)
        stream = method()

        # parse/process XML stream
        try:
            self.containerHandler.process(stream)
        except KeyboardInterrupt:
            log(-1, _('*** SYSTEM INTERRUPT CALLED ***'), stream=sys.stderr)
            raise
        except (FatalParseException, ParseException, Exception):  # pylint: disable=E0012, W0703
            e = sys.exc_info()[1]
            # nuke the container batch upon error!
            self.containerHandler.clear()
            msg = ''
            if isinstance(e, FatalParseException):
                msg = (_('ERROR: fatal parser exception occurred ') +
                       _('(line: %s, col: %s msg: %s)') % (
                           e.getLineNumber(), e.getColumnNumber(),
                           e._msg))
            elif isinstance(e, ParseException):
                msg = (_('ERROR: parser exception occurred: %s') % (e))
            elif isinstance(e, SystemExit):
                log(-1, _('*** SYSTEM INTERRUPT CALLED ***'), stream=sys.stderr)
                raise
            else:
                msg = _('ERROR: exception (during parse) occurred: ')
            log2stderr(-1, _('   Encountered some errors with %s data '
                             + '(see logs (%s) for more information)') % (step_name, CFG.LOG_FILE))
            log2(-1, 3, [_('   Encountered some errors with %s data:') % step_name,
                         _('   ------- %s PARSE/IMPORT ERROR -------') % step_name,
                         '   %s' % msg,
                         _('   ---------------------------------------')], stream=sys.stderr)
            exitWithTraceback(e, '', 11)
        self.containerHandler.reset()
        log(1, _("%s data complete") % step_name)

    def processArches(self):
        self._process_simple("getArchesXmlStream", "arches")
        self._process_simple("getArchesExtraXmlStream", "additional arches")

    def import_orgs(self):
        self._process_simple("getOrgsXmlStream", "orgs")

    def processChannelFamilies(self):
        self._process_simple("getChannelFamilyXmlStream", "channel-families")
        # pylint: disable=W0703
        try:
            self._process_simple("getProductNamesXmlStream", "product names")
        except Exception:
            pass

    def _write_repomd(self, repomd_path, getRepomdFunc, repomdFileStreamFunc, label, timestamp):
        full_path = os.path.join(CFG.MOUNT_POINT, repomd_path)
        if not os.path.exists(full_path):
            if self.mountpoint or CFG.ISS_PARENT:
                stream = getRepomdFunc(label)
            else:
                stream = repomdFileStreamFunc(label)
            f = FileManip(repomd_path, timestamp, None)
            f.write_file(stream)
            self.reporegen.add(label)

    def _process_comps(self, backend, label, timestamp):
        comps_path = 'rhn/comps/%s/comps-%s.xml' % (label, timestamp)
        self._write_repomd(comps_path, self.xmlDataServer.getComps, \
            xmlWireSource.RPCGetWireSource(self.systemid, self.sslYN, self.xml_dump_version).getCompsFileStream, \
            label, timestamp)
        data = {label: None}
        backend.lookupChannels(data)
        rhnSQL.Procedure('rhn_channel.set_comps')(data[label]['id'], comps_path, 1, timestamp)



    def _process_modules(self, backend, label, timestamp):
        modules_path = 'rhn/modules/%s/modules-%s.yaml' % (label, timestamp)
        self._write_repomd(modules_path, self.xmlDataServer.getModules, \
            xmlWireSource.RPCGetWireSource(self.systemid, self.sslYN, self.xml_dump_version).getModulesFilesStram, \
            label, timestamp)
        data = {label: None}
        backend.lookupChannels(data)
        rhnSQL.Procedure('rhn_channel.set_comps')(data[label]['id'], modules_path, 2, timestamp)


    def process_channels(self):
        """ push channels, channel-family and dist. map information
            as well upon parsing.
        """
        log(1, ["", _("Retrieving / parsing channel data")])

        h = sync_handlers.get_channel_handler()

        # get channel XML stream
        stream = self.xmlDataServer.getChannelXmlStream()
        if self.mountpoint:
            for substream in stream:
                h.process(substream)
            doEOSYN = 0
        else:
            h.process(stream)
            doEOSYN = 1

        h.close()

        # clean up the channel request and populate self._channel_request
        # This essentially determines which channels are to be imported
        self._compute_channel_request()

        # print out the relevant channel tree
        # 3/6/06 wregglej 183213 Don't print out the end-of-service message if
        # mgr-inter-sync is running with the --mount-point (-m) option. If it
        # did, it would incorrectly list channels as end-of-service if they had been
        # synced already but aren't in the channel dump.
        self._printChannelTree(doEOSYN=doEOSYN)

        if self.listChannelsYN:
            # We're done here
            return

        requested_channels = self._channel_req.get_requested_channels()
        try:
            importer = sync_handlers.import_channels(requested_channels,
                                                     orgid=OPTIONS.orgid or None,
                                                     master=OPTIONS.master or None)
            for label in requested_channels:
                timestamp = self._channel_collection.get_channel_timestamp(label)
                ch = self._channel_collection.get_channel(label, timestamp)
                if 'comps_last_modified' in ch and ch['comps_last_modified'] is not None:
                    self._process_comps(importer.backend, label, sync_handlers._to_timestamp(ch['comps_last_modified']))
                if 'modules_last_modified' in ch and ch['modules_last_modified'] is not None:
                    self._process_modules(importer.backend, label, \
                        sync_handlers._to_timestamp(ch['modules_last_modified']))

        except InvalidChannelFamilyError:
            usix.raise_with_tb(RhnSyncException(messages.invalid_channel_family_error %
                                                ''.join(requested_channels)), sys.exc_info()[2])
        except MissingParentChannelError:
            raise

        rhnSQL.commit()

        log(1, _("Channel data complete"))

    @staticmethod
    def _formatChannelExportType(channel):
        """returns pretty formated text with type of channel export"""
        if 'export-type' not in channel or channel['export-type'] is None:
            return ''
        else:
            export_type = channel['export-type']
        if 'export-start-date' in channel and channel['export-start-date'] is not None:
            start_date = channel['export-start-date']
        else:
            start_date = ''
        if 'export-end-date' in channel and channel['export-end-date'] is not None:
            end_date = channel['export-end-date']
        else:
            end_date = ''
        if end_date and not start_date:
            return _("%10s import from %s") % (export_type,
                                               formatDateTime(end_date))
        elif end_date and start_date:
            return _("%10s import from %s - %s") % (export_type,
                                                    formatDateTime(start_date),
                                                    formatDateTime(end_date))
        else:
            return _("%10s") % export_type

    def _printChannel(self, label, channel_object, log_format, is_imported):
        assert channel_object is not None
        all_pkgs = channel_object['all-packages'] or channel_object['packages']
        pkgs_count = len(all_pkgs)
        if is_imported:
            status = _('p')
        else:
            status = _('.')
        log(1, log_format % (status, label, pkgs_count, self._formatChannelExportType(channel_object)))

    def _printChannelTree(self, doEOSYN=1, doTyposYN=1):
        "pretty prints a tree of channel information"

        log(1, _('   p = previously imported/synced channel'))
        log(1, _('   . = channel not yet imported/synced'))
        ch_end_of_service = self._channel_req.get_end_of_service()
        ch_typos = self._channel_req.get_typos()
        ch_requested_imported = self._channel_req.get_requested_imported()
        relevant = self._channel_req.get_requested_channels()
        if doEOSYN and ch_end_of_service:
            log(1, _('   e = channel no longer supported (end-of-service)'))
        if doTyposYN and ch_typos:
            log(1, _('   ? = channel label invalid --- typo?'))

        pc_labels = sorted(self._channel_collection.get_parent_channel_labels())

        t_format = _('   %s:')
        p_format = _('      %s %-40s %4s %s')
        log(1, t_format % _('base-channels'))
        # Relevant parent channels
        no_base_channel = True
        for plabel in pc_labels:
            if plabel not in relevant:
                continue

            no_base_channel = False
            timestamp = self._channel_collection.get_channel_timestamp(plabel)
            channel_object = self._channel_collection.get_channel(plabel,
                                                                  timestamp)
            self._printChannel(plabel, channel_object, p_format, (plabel in ch_requested_imported))
        if no_base_channel:
            log(1, p_format % (' ', _('NONE RELEVANT'), '', ''))

        # Relevant parent channels
        for plabel in pc_labels:
            cchannels = self._channel_collection.get_child_channels(plabel)
            # chns has only the channels we are interested in
            # (and that's all the channels if we list them)
            chns = []
            for clabel, ctimestamp in cchannels:
                if clabel in relevant:
                    chns.append((clabel, ctimestamp))
            if not chns:
                # No child channels, skip
                continue
            log(1, t_format % plabel)
            for clabel, ctimestamp in sorted(chns):
                channel_object = self._channel_collection.get_channel(clabel,
                                                                      ctimestamp)
                self._printChannel(clabel, channel_object, p_format, (clabel in ch_requested_imported))
        log(2, '')

        if doEOSYN and ch_end_of_service:
            log(1, t_format % _('end-of-service'))
            status = _('e')
            for chn in ch_end_of_service:
                log(1, p_format % (status, chn, '', ''))
            log(2, '')

        if doTyposYN and ch_typos:
            log(1, _('   typos:'))
            status = _('?')
            for chn in ch_typos:
                log(1, p_format % (status, chn, '', ''))
            log(2, '')
        log(1, '')

    def _compute_channel_request(self):
        """ channels request is verify and categorized.

            NOTE: self.channel_req *will be* initialized by this method
        """

        # channels already imported, and all channels
        importedChannels = _getImportedChannels()
        availableChannels = self._channel_collection.get_channel_labels()
        log(6, _('XXX: imported channels: %s') % importedChannels, 1)
        log(6, _('XXX:   cached channels: %s') % availableChannels, 1)

        # if requested a channel list, we are requesting all channels
        if self.listChannelsYN:
            requested_channels = availableChannels
            log(6, _('XXX: list channels called'), 1)
        else:
            requested_channels = set()
            for channel in self._requested_channels:
                match_channels = set(fnmatch.filter(importedChannels, channel))
                match_channels = match_channels.union(fnmatch.filter(availableChannels, channel))
                if not match_channels:
                    match_channels = [channel,]
                requested_channels = requested_channels.union(match_channels)

        rc = req_channels.RequestedChannels(list(requested_channels))
        rc.set_available(availableChannels)
        rc.set_imported(importedChannels)
        # rc does all the logic of doing intersections and stuff
        rc.compute()

        typos = rc.get_typos()
        if typos:
            log(-1, _("ERROR: these channels either do not exist or "
                      "are not available:"))
            for chn in typos:
                log(-1, "       %s" % chn)
            log(-1, _("       (to see a list of channel labels: %s --list-channels)") % sys.argv[0])
            sys.exit(12)
        self._channel_req = rc
        return rc

    def _get_channel_timestamp(self, channel):
        try:
            timestamp = self._channel_collection.get_channel_timestamp(channel)
        except KeyError:
            # XXX Do something with this exception
            raise
        return timestamp

    def _compute_unique_packages(self):
        """ process package metadata for one channel at a time """
        relevant = sorted(self._channel_req.get_requested_channels())
        self._channel_packages = {}
        self._channel_packages_full = {}
        self._avail_channel_packages = {}
        already_seen_ids = set()
        for chn in relevant:
            timestamp = self._get_channel_timestamp(chn)

            channel_obj = self._channel_collection.get_channel(chn, timestamp)
            avail_package_ids = sorted(set(channel_obj['packages'] or []))
            package_full_ids = sorted(set(channel_obj['all-packages'] or [])) or avail_package_ids
            package_ids = sorted(set(package_full_ids) - already_seen_ids)

            self._channel_packages[chn] = package_ids
            self._channel_packages_full[chn] = package_full_ids
            self._avail_channel_packages[chn] = avail_package_ids
            already_seen_ids.update(package_ids)

    def processShortPackages(self):
        log(1, ["", "Retrieving short package metadata (used for indexing)"])

        # Compute the unique packages and populate self._channel_packages
        self._compute_unique_packages()

        stream_loader = StreamProducer(
            sync_handlers.get_short_package_handler(),
            self.xmlDataServer, 'getChannelShortPackagesXmlStream')

        sorted_channels = sorted(list(self._channel_packages.items()), key=lambda x: x[0])  # sort by channel_label
        for channel_label, package_ids in sorted_channels:
            log(1, _("   Retrieving / parsing short package metadata: %s (%s)") %
                (channel_label, len(package_ids)))

            if package_ids:
                lm = self._channel_collection.get_channel_timestamp(channel_label)
                channel_last_modified = int(rhnLib.timestamp(lm))

                stream_loader.set_args(channel_label, channel_last_modified)
                stream_loader.process(package_ids)

        stream_loader.close()

        self._diff_packages()

    _query_compare_packages = """
        select p.id, c.checksum_type, c.checksum, p.path, p.package_size,
               TO_CHAR(p.last_modified, 'YYYYMMDDHH24MISS') last_modified
          from rhnPackage p, rhnChecksumView c
         where p.name_id = lookup_package_name(:name)
           and p.evr_id = lookup_evr(:epoch, :version, :release)
           and p.package_arch_id = lookup_package_arch(:arch)
           and (p.org_id = :org_id or
               (p.org_id is null and :org_id is null))
           and p.checksum_id = c.id
    """

    def _diff_packages_process(self, chunk, channel_label):
        package_collection = sync_handlers.ShortPackageCollection()

        h = rhnSQL.prepare(self._query_compare_packages)
        for pid in chunk:
            package = package_collection.get_package(pid)
            assert package is not None
            l_timestamp = rhnLib.timestamp(package['last_modified'])

            if package['org_id'] is not None:
                package['org_id'] = OPTIONS.orgid or DEFAULT_ORG
            nevra = get_nevra_dict(package)
            nevra['org_id'] = package['org_id']

            h.execute(**nevra)
            row = None
            for r in (h.fetchall_dict() or []):
                # let's check which checksum we have in database
                if (r['checksum_type'] in package['checksums']
                        and package['checksums'][r['checksum_type']] == r['checksum']):
                    row = r
                    break

            self._process_package(pid, package, l_timestamp, row,
                                  self._missing_channel_packages[channel_label],
                                  self._missing_fs_packages[channel_label],
                                  check_rpms=self.check_rpms)

    # XXX the "is null" condition will have to change in multiorg satellites
    def _diff_packages(self):
        self._missing_channel_packages = {}
        self._missing_fs_packages = {}

        sorted_channels = sorted(list(self._channel_packages.items()), key=lambda x: x[0])  # sort by channel_label
        for channel_label, upids in sorted_channels:
            log(1, _("Diffing package metadata (what's missing locally?): %s") %
                channel_label)
            self._missing_channel_packages[channel_label] = []
            self._missing_fs_packages[channel_label] = []
            self._process_batch(channel_label, upids[:], None,
                                self._diff_packages_process,
                                _('Diffing:    '),
                                [channel_label])

        self._verify_missing_channel_packages(self._missing_channel_packages)

    def _verify_missing_channel_packages(self, missing_channel_packages, sources=0):
        """Verify if all the missing packages are actually available somehow.
        In an incremental approach, one may request packages that are actually
        not available in the current dump, probably because of applying an
        incremental to the wrong base"""
        for channel_label, pids in list(missing_channel_packages.items()):
            if sources:
                avail_pids = [x[0] for x in self._avail_channel_source_packages[channel_label]]
            else:
                avail_pids = self._avail_channel_packages[channel_label]

            if set(pids or []) > set(avail_pids or []):
                raise RhnSyncException(_('ERROR: incremental dump skipped'))

    @staticmethod
    def _get_rel_package_path(nevra, org_id, source, checksum_type, checksum):
        return get_package_path(nevra, org_id, prepend=CFG.PREPENDED_DIR,
                                source=source, checksum_type=checksum_type, checksum=checksum)

    @staticmethod
    def _verify_file(path, mtime, size, checksum_type, checksum):
        """
        Verifies if the file is on the filesystem and matches the mtime and checksum.
        Computing the checksum is costly, that's why we rely on mtime comparisons.
        Returns errcode:
            0   - file is ok, it has either the specified mtime and size
                          or checksum matches (then function sets mtime)
            1   - file does not exist at all
            2   - file has a different checksum
        """
        if not path:
            return 1
        abs_path = os.path.join(CFG.MOUNT_POINT, path)
        try:
            stat_info = os.stat(abs_path)
        except OSError:
            # File is missing completely
            return 1

        l_mtime = stat_info[stat.ST_MTIME]
        l_size = stat_info[stat.ST_SIZE]
        if l_mtime == mtime and l_size == size:
            # Same mtime, and size, assume identity
            return 0

        # Have to check checksum
        l_checksum = getFileChecksum(checksum_type, filename=abs_path)
        if l_checksum != checksum:
            return 2

        # Set the mtime
        os.utime(abs_path, (mtime, mtime))
        return 0

    def _process_package(self, package_id, package, l_timestamp, row,
                         m_channel_packages, m_fs_packages, check_rpms=1):
        path = None
        channel_package = None
        fs_package = None
        if row:
            # package found in the DB
            checksum_type = row['checksum_type']
            if checksum_type in package['checksums']:
                checksum = package['checksums'][row['checksum_type']]
                package_size = package['package_size']

                db_timestamp = int(rhnLib.timestamp(row['last_modified']))
                db_checksum = row['checksum']
                db_package_size = row['package_size']
                db_path = row['path']

                if not (l_timestamp <= db_timestamp and
                        checksum == db_checksum and
                        package_size == db_package_size):
                    # package doesn't match
                    channel_package = package_id

                if check_rpms:
                    if db_path:
                        # check the filesystem
                        errcode = self._verify_file(db_path, l_timestamp,
                                                    package_size, checksum_type, checksum)
                        if errcode:
                            # file doesn't match
                            fs_package = package_id
                            channel_package = package_id
                        path = db_path
                    else:
                        # upload package and reimport metadata
                        channel_package = package_id
                        fs_package = package_id
        else:
            # package is missing from the DB
            channel_package = package_id
            fs_package = package_id

        if channel_package:
            m_channel_packages.append(channel_package)
        if fs_package:
            m_fs_packages.append((fs_package, path))
        return

    def download_rpms(self):
        log(1, ["", _("Downloading rpm packages")])
        # Lets go fetch the packages and push them to their proper location:
        sorted_channels = sorted(list(self._missing_fs_packages.items()), key=lambda x: x[0])  # sort by channel
        for channel, missing_fs_packages in sorted_channels:
            missing_packages_count = len(missing_fs_packages)
            log(1, _("   Fetching any missing RPMs: %s (%s)") %
                (channel, missing_packages_count or _('NONE MISSING')))
            if missing_packages_count == 0:
                continue

            # Fetch all RPMs whose meta-data is marked for need to be imported
            # (ie. high chance of not being there)
            self._fetch_packages(channel, missing_fs_packages)
            continue

        log(1, _("Processing rpm packages complete"))

    def _missing_not_cached_packages(self):
        missing_packages = {}

        # First, determine what has to be downloaded
        short_package_collection = sync_handlers.ShortPackageCollection()
        package_collection = sync_handlers.PackageCollection()
        for channel, pids in list(self._missing_channel_packages.items()):
            missing_packages[channel] = mp = []

            if not pids:
                # Nothing to see here
                continue

            for pid in pids:
                # XXX Catch errors
                if (not package_collection.has_package(pid) or not package_collection.get_package(pid)
                        or package_collection.get_package(pid)['last_modified']
                        != short_package_collection.get_package(pid)['last_modified']
                        or 'extra_tags' not in package_collection.get_package(pid)):
                    # not in the cache or cache outdated
                    mp.append(pid)

        return missing_packages

    def download_package_metadata(self):
        log(1, ["", _("Downloading package metadata")])
        # Get the missing but uncached packages
        missing_packages = self._missing_not_cached_packages()

        stream_loader = StreamProducer(
            sync_handlers.get_package_handler(),
            self.xmlDataServer, 'getPackageXmlStream')

        sorted_channels = sorted(list(missing_packages.items()), key=lambda x: x[0])  # sort by channel
        for channel, pids in sorted_channels:
            self._process_batch(channel, pids[:], messages.package_parsing,
                                stream_loader.process, is_slow=True)
        stream_loader.close()

        # Double-check that we got all the packages
        missing_packages = self._missing_not_cached_packages()
        for channel, pids in list(missing_packages.items()):
            if pids:
                # Something may have changed from the moment we started to
                # download the packages till now
                raise ReprocessingNeeded

    def download_srpms(self):
        self._compute_unique_source_packages()
        self._diff_source_packages()
        log(1, ["", _("Downloading srpm packages")])
        # Lets go fetch the source packages and push them to their proper location:
        # sort by channel_label
        sorted_channels = sorted(list(self._missing_fs_source_packages.items()), key=lambda x: x[0])
        for channel, missing_fs_source_packages in sorted_channels:
            missing_source_packages_count = len(missing_fs_source_packages)
            log(1, _("   Fetching any missing SRPMs: %s (%s)") %
                (channel, missing_source_packages_count or _('NONE MISSING')))
            if missing_source_packages_count == 0:
                continue

            # Fetch all SRPMs whose meta-data is marked for need to be imported
            # (ie. high chance of not being there)
            self._fetch_packages(channel, missing_fs_source_packages, sources=1)
            continue

        log(1, "Processing srpm packages complete")

    def _compute_unique_source_packages(self):
        """ process package metadata for one channel at a time"""
        relevant = self._channel_req.get_requested_channels()
        self._channel_source_packages = {}
        self._channel_source_packages_full = {}
        self._avail_channel_source_packages = {}

        already_seen_ids = set()
        for chn in relevant:
            timestamp = self._get_channel_timestamp(chn)

            channel_obj = self._channel_collection.get_channel(chn, timestamp)
            sps = set(channel_obj['source_packages'])
            if not sps:
                # No source package info
                continue
            ret_sps = []
            for sp in sps:
                if isinstance(sp, usix.StringType):
                    # Old style
                    ret_sps.append((sp, None))
                else:
                    ret_sps.append((sp['id'], sp['last_modified']))
            del sps
            ret_sps.sort()
            self._channel_source_packages[chn] = sorted(set(ret_sps) - already_seen_ids)
            self._channel_source_packages_full[chn] = ret_sps
            self._avail_channel_source_packages[chn] = ret_sps
            already_seen_ids.update(ret_sps)

    def _compute_not_cached_source_packages(self):
        missing_sps = {}

        # First, determine what has to be downloaded
        sp_collection = sync_handlers.SourcePackageCollection()
        for channel, sps in list(self._channel_source_packages.items()):
            missing_sps[channel] = []
            if not sps:
                # Nothing to see here
                continue
            missing_sps[channel] = [sp_id for (sp_id, _timestamp) in sps
                                    if not sp_collection.has_package(sp_id)]
        return missing_sps

    _query_compare_source_packages = """
        select ps.id, c.checksum_type, c.checksum, ps.path, ps.package_size,
               TO_CHAR(ps.last_modified, 'YYYYMMDDHH24MISS') last_modified
          from rhnPackageSource ps, rhnChecksumView c
         where ps.source_rpm_id = lookup_source_name(:package_id)
           and (ps.org_id = :org_id or
               (ps.org_id is null and :org_id is null))
           and ps.checksum_id = c.id
           and c.checksum = :checksum
           and c.checksum_type = :checksum_type
    """

    def _diff_source_packages_process(self, chunk, channel_label):
        package_collection = sync_handlers.SourcePackageCollection()
        sql_params = ['package_id', 'checksum', 'checksum_type']
        h = rhnSQL.prepare(self._query_compare_source_packages)
        for pid, _timestamp in chunk:
            package = package_collection.get_package(pid)
            assert package is not None

            params = {}
            for t in sql_params:
                params[t] = package[t] or ""

            if package['org_id'] is not None:
                params['org_id'] = OPTIONS.orgid or DEFAULT_ORG
                package['org_id'] = OPTIONS.orgid or DEFAULT_ORG
            else:
                params['org_id'] = package['org_id']

            h.execute(**params)
            row = h.fetchone_dict()
            self._process_package(pid, package, None, row,
                                  self._missing_channel_src_packages[channel_label],
                                  self._missing_fs_source_packages[channel_label])

    # XXX the "is null" condition will have to change in multiorg satellites
    def _diff_source_packages(self):
        self._missing_channel_src_packages = {}
        self._missing_fs_source_packages = {}
        for channel_label, upids in list(self._channel_source_packages.items()):
            log(1, _("Diffing source package metadata (what's missing locally?): %s") % channel_label)
            self._missing_channel_src_packages[channel_label] = []
            self._missing_fs_source_packages[channel_label] = []
            self._process_batch(channel_label, upids[:], None,
                                self._diff_source_packages_process,
                                _('Diffing:    '),
                                [channel_label])

        self._verify_missing_channel_packages(self._missing_channel_src_packages, sources=1)

    def download_source_package_metadata(self):
        log(1, ["", _("Downloading source package metadata")])

        # Get the missing but uncached packages
        missing_packages = self._compute_not_cached_source_packages()

        stream_loader = StreamProducer(
            sync_handlers.get_source_package_handler(),
            self.xmlDataServer, 'getSourcePackageXmlStream')

        for channel, pids in list(missing_packages.items()):
            self._process_batch(channel, pids[:], messages.package_parsing,
                                stream_loader.process, is_slow=True)
        stream_loader.close()

        # Double-check that we got all the packages
        missing_packages = self._compute_not_cached_source_packages()
        for channel, pids in list(missing_packages.items()):
            if pids:
                # Something may have changed from the moment we started to
                # download the packages till now
                raise ReprocessingNeeded

    def _compute_unique_kickstarts(self):
        """ process package metadata for one channel at a time"""
        relevant = self._channel_req.get_requested_channels()
        self._channel_kickstarts = {}
        already_seen_kickstarts = set()
        for chn in relevant:
            timestamp = self._get_channel_timestamp(chn)

            channel_obj = self._channel_collection.get_channel(chn, timestamp)
            self._channel_kickstarts[chn] = \
                sorted(set(channel_obj['kickstartable_trees'])
                       - already_seen_kickstarts)
            already_seen_kickstarts.update(self._channel_kickstarts[chn])

    def _compute_missing_kickstarts(self):
        """ process package metadata for one channel at a time"""
        relevant = self._channel_req.get_requested_channels()
        coll = sync_handlers.KickstartableTreesCollection()
        missing_kickstarts = {}
        for chn in relevant:
            timestamp = self._get_channel_timestamp(chn)

            channel_obj = self._channel_collection.get_channel(chn, timestamp)
            kickstart_trees = channel_obj['kickstartable_trees']

            for ktid in kickstart_trees:
                # No timestamp for kickstartable trees
                kt = coll.get_item(ktid, timestamp=None)
                assert kt is not None
                kt_label = kt['label']

                # XXX rhnKickstartableTree does not have a last_modified
                # Once we add it, we should be able to do more meaningful
                # diffs
                missing_kickstarts[kt_label] = None

        ret = list(missing_kickstarts.items())
        ret.sort()
        return ret

    def _download_kickstarts_file(self, chunk, channel_label):
        cfg = config.initUp2dateConfig()
        assert len(chunk) == 1
        item = chunk[0]
        label, base_path, relative_path, timestamp, file_size = item
        path = os.path.join(base_path, relative_path)
        f = FileManip(path, timestamp=timestamp, file_size=file_size)
        # Retry a number of times, we may have network errors
        for _try in range(cfg['networkRetries']):
            stream = self._get_ks_file_stream(channel_label, label, relative_path)
            try:
                f.write_file(stream)
                break  # inner for
            except FileCreationError:
                e = sys.exc_info()[1]
                msg = e.args[0]
                log2disk(-1, _("Unable to save file %s: %s") % (path,
                                                                msg))
                # Try again
                continue
        else:  # for
            # Retried a number of times and it still failed; log the
            # file as being failed and move on
            log2disk(-1, _("Failed to fetch file %s") % path)

    def download_kickstarts(self):
        """Downloads all the kickstart-related information"""

        log(1, ["", _("Downloading kickstartable trees metadata")])

        self._compute_unique_kickstarts()

        stream_loader = StreamProducer(
            sync_handlers.get_kickstarts_handler(),
            self.xmlDataServer, 'getKickstartsXmlStream')

        for channel, ktids in list(self._channel_kickstarts.items()):
            self._process_batch(channel, ktids[:], messages.kickstart_parsing,
                                stream_loader.process)
        stream_loader.close()

        missing_ks_files = self._compute_missing_ks_files()

        log(1, ["", _("Downloading kickstartable trees files")])
        sorted_channels = sorted(list(missing_ks_files.items()), key=lambda x: x[0])  # sort by channel
        for channel, files in sorted_channels:
            self._process_batch(channel, files[:], messages.kickstart_downloading,
                                self._download_kickstarts_file,
                                nevermorethan=1,
                                process_function_args=[channel])

    def _get_ks_file_stream(self, channel, kstree_label, relative_path):
        if self.mountpoint:
            s = xmlDiskSource.KickstartFileDiskSource(self.mountpoint)
            s.setID(kstree_label)
            s.set_relative_path(relative_path)
            return s.load()

        if CFG.ISS_PARENT:
            return self.xmlDataServer.getKickstartFile(kstree_label, relative_path)
        else:
            srv = xmlWireSource.RPCGetWireSource(self.systemid, self.sslYN,
                                                 self.xml_dump_version)
            return srv.getKickstartFileStream(channel, kstree_label, relative_path)

    def _compute_missing_ks_files(self):
        coll = sync_handlers.KickstartableTreesCollection()

        missing_ks_files = {}
        # download files for the ks trees
        for channel, ktids in list(self._channel_kickstarts.items()):
            missing_ks_files[channel] = missing = []
            for ktid in ktids:
                # No timestamp for kickstartable trees
                kt = coll.get_item(ktid, timestamp=None)
                assert kt is not None
                kt_label = kt['label']
                base_path = kt['base_path']
                files = kt['files']
                for f in files:
                    relative_path = f['relative_path']
                    dest_path = os.path.join(base_path, relative_path)
                    timestamp = rhnLib.timestamp(f['last_modified'])
                    file_size = f['file_size']
                    errcode = self._verify_file(dest_path,
                                                timestamp, file_size, f['checksum_type'], f['checksum'])
                    if errcode != 0:
                        # Have to download it
                        val = (kt_label, base_path, relative_path,
                               timestamp, file_size)
                        missing.append(val)
        return missing_ks_files

    def import_kickstarts(self):
        """Imports the kickstart-related information"""

        missing_kickstarts = self._compute_missing_kickstarts()

        if not missing_kickstarts:
            log(1, messages.kickstart_import_nothing_to_do)
            return

        ks_count = len(missing_kickstarts)
        log(1, messages.kickstart_importing % ks_count)

        coll = sync_handlers.KickstartableTreesCollection()
        batch = []
        for ks, timestamp in missing_kickstarts:
            ksobj = coll.get_item(ks, timestamp=timestamp)
            assert ksobj is not None

            if ksobj['org_id'] is not None:
                ksobj['org_id'] = OPTIONS.orgid or DEFAULT_ORG
            batch.append(ksobj)

        _importer = sync_handlers.import_kickstarts(batch)
        log(1, messages.kickstart_imported % ks_count)

    def _compute_not_cached_errata(self):
        missing_errata = {}

        # First, determine what has to be downloaded
        errata_collection = sync_handlers.ErrataCollection()
        for channel, errata in list(self._channel_errata.items()):
            missing_errata[channel] = []
            if not errata:
                # Nothing to see here
                continue
            missing_errata[channel] = [eid for (eid, timestamp, _advisory_name) in errata
                                       if not errata_collection.has_erratum(eid, timestamp)
                                       or self.forceAllErrata]
        return missing_errata

    _query_get_db_errata = rhnSQL.Statement("""
        select e.id, e.advisory_name,
               TO_CHAR(e.last_modified, 'YYYYMMDDHH24MISS') last_modified
          from rhnChannelErrata ce, rhnErrata e, rhnChannel c
         where c.label = :channel
           and ce.channel_id = c.id
           and ce.errata_id = e.id
    """)

    def _get_db_channel_errata(self):
        """
        Fetch the errata stored in the local satellite's database. Returned
        as a hash of channel to another hash of advisory names to a tuple of
        errata id and last modified date.
        """
        db_channel_errata = {}
        relevant = self._channel_req.get_requested_channels()
        h = rhnSQL.prepare(self._query_get_db_errata)
        for channel in relevant:
            db_channel_errata[channel] = ce = {}
            h.execute(channel=channel)
            while 1:
                row = h.fetchone_dict()
                if not row:
                    break
                advisory_name = row['advisory_name']
                erratum_id = row['id']
                last_modified = rhnLib.timestamp(row['last_modified'])
                ce[advisory_name] = (erratum_id, last_modified)
        return db_channel_errata

    def _diff_errata(self):
        """ Fetch the errata for this channel"""
        db_channel_errata = self._get_db_channel_errata()

        relevant = self._channel_req.get_requested_channels()

        # Now get the channel's errata
        channel_errata = {}
        for chn in relevant:
            db_ce = db_channel_errata[chn]
            timestamp = self._get_channel_timestamp(chn)

            channel_obj = self._channel_collection.get_channel(chn, timestamp)
            errata_timestamps = channel_obj['errata_timestamps']
            if errata_timestamps is None or self.forceAllErrata:
                # No unique key information, so assume we need all errata
                erratum_ids = channel_obj['errata']
                errata = [(x, None, None) for x in erratum_ids]
                log(2, _("Grabbing all patches for channel %s") % chn)
            else:
                errata = []
                # Check the advisory name and last modification
                for erratum in errata_timestamps:
                    erratum_id = erratum['id']
                    last_modified = erratum['last_modified']
                    last_modified = rhnLib.timestamp(last_modified)
                    advisory_name = erratum['advisory_name']
                    if advisory_name in db_ce:
                        _foo, db_last_modified = db_ce[advisory_name]
                        if last_modified == db_last_modified:
                            # We already have this erratum
                            continue
                    errata.append((erratum_id, last_modified, advisory_name))
            errata.sort()
            channel_errata[chn] = errata

        # Uniquify the errata
        already_seen_errata = set()
        for channel, errata in list(channel_errata.items()):
            uq_errata = set(errata) - already_seen_errata
            self._channel_errata[channel] = sorted(uq_errata)
            already_seen_errata.update(uq_errata)

    def _diff_db_errata(self):
        """ Compute errata that are missing from the satellite
            Kind of similar to diff_errata, if we had the timestamp and advisory
            information available
        """
        errata_collection = sync_handlers.ErrataCollection()
        self._missing_channel_errata = missing_channel_errata = {}
        db_channel_errata = self._get_db_channel_errata()
        for channel, errata in list(self._channel_errata.items()):
            ch_erratum_ids = missing_channel_errata[channel] = []
            for eid, timestamp, advisory_name in errata:
                if timestamp is not None:
                    # Should have been caught by diff_errata
                    ch_erratum_ids.append((eid, timestamp, advisory_name))
                    continue
                # timestamp is None, grab the erratum from the cache
                erratum = errata_collection.get_erratum(eid, timestamp)
                timestamp = rhnLib.timestamp(erratum['last_modified'])
                advisory_name = erratum['advisory_name']
                db_erratum = db_channel_errata[channel].get(advisory_name)
                if db_erratum is None or db_erratum[1] != timestamp or \
                        self.forceAllErrata:
                    ch_erratum_ids.append((eid, timestamp, advisory_name))

    def download_errata(self):
        log(1, ["", _("Downloading patch data")])
        if self.forceAllErrata:
            log(2, _("Forcing download of all patch data for requested channels."))
        self._diff_errata()
        not_cached_errata = self._compute_not_cached_errata()
        stream_loader = StreamProducer(
            sync_handlers.get_errata_handler(),
            self.xmlDataServer, 'getErrataXmlStream')

        sorted_channels = sorted(list(not_cached_errata.items()), key=lambda x: x[0])  # sort by channel
        for channel, erratum_ids in sorted_channels:
            self._process_batch(channel, erratum_ids[:], messages.erratum_parsing,
                                stream_loader.process)
        stream_loader.close()
        # XXX This step should go away once the channel info contains the
        # errata timestamps and advisory names
        self._diff_db_errata()
        log(1, _("Downloading patch data complete"))

    # __private methods__
    def _processWithProgressBar(self, batch, size,
                                process_function,
                                prompt=_('Downloading:'),
                                nevermorethan=None,
                                process_function_args=()):
        pb = ProgressBar(prompt=prompt, endTag=_(' - complete'),
                         finalSize=size, finalBarLength=40, stream=sys.stdout)
        if CFG.DEBUG > 2:
            pb.redrawYN = 0
        pb.printAll(1)

        ss = SequenceServer(batch, nevermorethan=(nevermorethan or self._batch_size))
        while not ss.doneYN():
            chunk = ss.getChunk()
            item_count = len(chunk)
            process_function(chunk, *process_function_args)
            ss.clearChunk()
            pb.addTo(item_count)
            pb.printIncrement()
        pb.printComplete()

    def _process_batch(self, channel, batch, log_msg,
                       process_function,
                       prompt=_('Downloading:'),
                       process_function_args=(),
                       nevermorethan=None,
                       is_slow=False):
        count = len(batch)
        if log_msg:
            log(1, log_msg % (channel, count or _('NONE RELEVANT')))
        if not count:
            return
        if is_slow:
            log(1, messages.warning_slow)
        self._processWithProgressBar(batch, count, process_function,
                                     prompt, nevermorethan, process_function_args)

    def _import_packages_process(self, chunk, sources):
        batch = self._get_cached_package_batch(chunk, sources)
        # check to make sure the orgs exported are valid
        _validate_package_org(batch)
        try:
            sync_handlers.import_packages(batch, sources)
        except (SQLError, SQLSchemaError, SQLConnectError):
            e = sys.exc_info()[1]
            # an SQL error is fatal... crash and burn
            exitWithTraceback(e, 'Exception caught during import', 13)

    def import_packages(self, sources=0):
        if sources:
            log(1, ["", _("Importing source package metadata")])
            missing_channel_items = self._missing_channel_src_packages
        else:
            log(1, ["", _("Importing package metadata")])
            missing_channel_items = self._missing_channel_packages

        sorted_channels = sorted(list(missing_channel_items.items()), key=lambda x: x[0])  # sort by channel
        for channel, packages in sorted_channels:
            self._process_batch(channel, packages[:],
                                messages.package_importing,
                                self._import_packages_process,
                                _('Importing:  '),
                                [sources])
        return self._link_channel_packages()

    def _link_channel_packages(self):
        log(1, ["", messages.link_channel_packages])
        short_package_collection = sync_handlers.ShortPackageCollection()
        _package_collection = sync_handlers.PackageCollection()
        uq_packages = {}
        for chn, package_ids in list(self._channel_packages_full.items()):
            for pid in package_ids:
                package = short_package_collection.get_package(pid)
                if not package:
                    continue
                assert package is not None
                channel_obj = {'label': chn}
                if pid in uq_packages:
                    # We've seen this package before - just add this channel
                    # to it
                    uq_packages[pid]['channels'].append(channel_obj)
                else:
                    package['channels'] = [channel_obj]
                    uq_packages[pid] = package

        uq_pkg_data = list(uq_packages.values())
        # check to make sure the orgs exported are valid
        _validate_package_org(uq_pkg_data)
        try:
            if OPTIONS.mount_point:  # if OPTIONS.consider_full is not set interpret dump as incremental
                importer = sync_handlers.link_channel_packages(uq_pkg_data, strict=OPTIONS.consider_full)
            else:
                importer = sync_handlers.link_channel_packages(uq_pkg_data)
            if self.reporegen:
                h = rhnSQL.prepare("""select channel_label from rhnRepoRegenQueue""")
                h.execute()
                result = h.fetchall_dict()
                if result:
                    for regenerating in result:
                        if regenerating['channel_label'] in self.reporegen:
                            self.reporegen.remove(regenerating['channel_label'])
                for channel in self.reporegen:
                    h = rhnSQL.prepare("""insert into rhnRepoRegenQueue
                            (channel_label) values (:clabel)""")
                    h.execute(clabel=channel)
                    rhnSQL.commit()
        except (SQLError, SQLSchemaError, SQLConnectError):
            e = sys.exc_info()[1]
            # an SQL error is fatal... crash and burn
            exitWithTraceback(e, 'Exception caught during import', 14)
        return importer.affected_channels

    @staticmethod
    def _get_cached_package_batch(chunk, sources=0):
        """ short-circuit the most common case"""
        if not chunk:
            return []
        short_package_collection = sync_handlers.ShortPackageCollection()
        if sources:
            package_collection = sync_handlers.SourcePackageCollection()
        else:
            package_collection = sync_handlers.PackageCollection()
        batch = []
        for pid in chunk:
            package = package_collection.get_package(pid)
            if (package is None or package['last_modified']
                    != short_package_collection.get_package(pid)
                    ['last_modified']):
                # not in the cache
                raise Exception(_("Package Not Found in Cache, Clear the Cache to \
                                 Regenerate it."))
            batch.append(package)
        return batch

    def import_errata(self):
        log(1, ["", _("Importing channel patches")])
        errata_collection = sync_handlers.ErrataCollection()
        # sort by channel_label
        sorted_channels = sorted(list(self._missing_channel_errata.items()), key=lambda x: x[0])
        for chn, errata in sorted_channels:
            log(2, _("Importing %s patches for channel %s.") % (len(errata), chn))
            batch = []
            for eid, timestamp, _advisory_name in errata:
                erratum = errata_collection.get_erratum(eid, timestamp)
                # bug 161144: it seems that incremental dumps can create an
                # errata collection None
                if erratum is not None:
                    self._fix_erratum(erratum)
                    batch.append(erratum)

            self._process_batch(chn, batch, messages.errata_importing,
                                sync_handlers.import_errata)

    @staticmethod
    def _fix_erratum(erratum):
        """ Replace the list of packages with references to short packages"""
        if erratum['org_id'] is not None:
            erratum['org_id'] = OPTIONS.orgid or DEFAULT_ORG

        sp_coll = sync_handlers.ShortPackageCollection()
        pids = set(erratum['packages'] or [])
        # map all the pkgs objects to the erratum
        packages = []
        # remove packages which are not in the export (e.g. archs we are not syncing)
        for pid in pids:
            if not sp_coll.has_package(pid):
                # Package not found, go on - may be part of a channel we don't
                # sync
                continue
            package = sp_coll.get_package(pid)
            if package['org_id'] is not None:
                package['org_id'] = erratum['org_id']

            packages.append(package)

        # rewrite package org to where they got imported
        _validate_package_org(packages)
        erratum['packages'] = packages

        if OPTIONS.channel:
            # If we are syncing only selected channels, do not link
            # to channels that do not have this erratum, they may not
            # have all related packages synced
            imported_channels = _getImportedChannels(withAdvisory=erratum)
            # Import erratum to channels that are being synced
            imported_channels += OPTIONS.channel
        else:
            # Associate errata to channels that are synced already
            imported_channels = _getImportedChannels()

        erratum['channels'] = [c for c in erratum['channels']
                               if c['label'] in imported_channels]

        # Now fix the files
        for errata_file in (erratum['files'] or []):
            errata_file_package = errata_file.get('package')
            errata_file_source_package = errata_file.get('source-package')
            if errata_file['file_type'] == 'RPM' and \
                    errata_file_package is not None:
                package = None
                if sp_coll.has_package(errata_file_package):
                    package = sp_coll.get_package(errata_file_package)
                errata_file['pkgobj'] = package
            elif errata_file['file_type'] == 'SRPM' and \
                    errata_file_source_package is not None:
                # XXX misa: deal with source rpms
                errata_file['pkgobj'] = None

    def _fetch_packages(self, channel, missing_fs_packages, sources=0):
        short_package_collection = sync_handlers.ShortPackageCollection()
        if sources:
            #    acronym = "SRPM"
            package_collection = sync_handlers.SourcePackageCollection()
        else:
            #    acronym = "RPM"
            package_collection = sync_handlers.PackageCollection()

        self._failed_fs_packages = Queue.Queue()
        self._extinct_packages = Queue.Queue()
        pkgs_total = len(missing_fs_packages)
        pkg_current = 0
        total_size = 0
        queue = Queue.Queue()
        out_queue = Queue.Queue()
        lock = threading.Lock()

        # count size of missing packages
        for package_id, path in missing_fs_packages:
            package = package_collection.get_package(package_id)
            total_size = total_size + package['package_size']
            queue.put((package_id, path))

        log(1, messages.package_fetch_total_size %
            (self._bytes_to_fuzzy(total_size)))
        real_processed_size = processed_size = 0
        real_total_size = total_size
        start_time = round(time.time())

        all_threads = []
        for _thread in range(4):
            t = ThreadDownload(lock, queue, out_queue, short_package_collection, package_collection,
                               self, self._failed_fs_packages, self._extinct_packages, sources, channel)
            t.setDaemon(True)
            t.start()
            all_threads.append(t)

        while ([x for x in all_threads if x.isAlive()]
               and pkg_current < pkgs_total):
            try:
                (rpmManip, package, is_done) = out_queue.get(False, 0.1)
            except Queue.Empty:
                continue
            pkg_current = pkg_current + 1

            if not is_done:  # package failed to download or already exist on disk
                real_total_size -= package['package_size']
                processed_size += package['package_size']
                try:
                    out_queue.task_done()
                except AttributeError:
                    pass
                continue
            # Package successfully saved
            filename = os.path.basename(rpmManip.relative_path)

            # Determine downloaded size and remaining time
            size = package['package_size']
            real_processed_size += size
            processed_size += size
            current_time = round(time.time())
            # timedalta could not be multiplicated by float
            remain_time = (datetime.timedelta(seconds=current_time - start_time)) * \
                          ((real_total_size * 10000) / real_processed_size - 10000) / 10000
            # cut off miliseconds
            remain_time = datetime.timedelta(remain_time.days, remain_time.seconds)
            log(1, messages.package_fetch_remain_size_time %
                (self._bytes_to_fuzzy(processed_size), self._bytes_to_fuzzy(total_size), remain_time))

            log(1, messages.package_fetch_successful %
                (pkg_current, pkgs_total, filename, size))
            try:
                out_queue.task_done()
            except AttributeError:
                pass

        extinct_count = self._extinct_packages.qsize()
        failed_count = self._failed_fs_packages.qsize()

        # Printing summary
        log(2, messages.package_fetch_summary % channel, notimeYN=1)
        log(2, messages.package_fetch_summary_success %
            (pkgs_total - extinct_count - failed_count), notimeYN=1)
        log(2, messages.package_fetch_summary_failed % failed_count,
            notimeYN=1)
        log(2, messages.package_fetch_summary_extinct % extinct_count,
            notimeYN=1)

    # Translate x bytes to string "x MB", "x GB" or "x kB"
    @staticmethod
    def _bytes_to_fuzzy(b):
        units = ['bytes', 'kiB', 'MiB', 'GiB', 'TiB', 'PiB']
        base = 1024
        fuzzy = b
        for unit in units:
            if fuzzy >= base:
                fuzzy = float(fuzzy) / base
            else:
                break
        int_len = len("%d" % fuzzy)
        fract_len = 3 - int_len
        # pylint: disable=W0631
        return "%*.*f %s" % (int_len, fract_len, fuzzy, unit)

    def _get_package_stream(self, channel, package_id, nvrea, sources, checksum):
        """ returns (filepath, stream), so in the case of a "wire source",
            the return value is, of course, (None, stream)
        """

        # Returns a package stream from disk
        if self.mountpoint:
            rpmFile = rpmsPath(package_id, self.mountpoint, sources)
            try:
                stream = open(rpmFile)
            except IOError:
                e = sys.exc_info()[1]
                if e.errno != 2:  # No such file or directory
                    raise
                return (rpmFile, None)

            return (rpmFile, stream)

        # Wire stream
        if CFG.ISS_PARENT:
            stream = self.xmlDataServer.getRpm(nvrea, channel, checksum)
        else:
            rpmServer = xmlWireSource.RPCGetWireSource(self.systemid, self.sslYN,
                                                       self.xml_dump_version)
            stream = rpmServer.getPackageStream(channel, nvrea, checksum)

        return (None, stream)

    def import_supportinfo(self):
        """Imports the support-related information"""
        self._process_simple("getSupportInformationXmlStream", "supportinfo")

    def import_suse_products(self):
        """Imports SUSE Products"""
        self._process_simple("getSuseProductsXmlStream", "suse_products")

    def import_suse_product_channels(self):
        """Imports SUSE Product Channels"""
        self._process_simple("getSuseProductChannelsXmlStream", "suse_product_channels")

    def import_suse_upgrade_paths(self):
        """Imports Upgrade Paths"""
        self._process_simple("getSuseUpgradePathsXmlStream", "suse_upgrade_paths")

    def import_suse_product_extensions(self):
        """Imports SUSE Product Extensions"""
        self._process_simple("getSuseProductExtensionsXmlStream", "suse_product_extensions")

    def import_suse_product_repositories(self):
        """Imports SUSE Product Repositories"""
        self._process_simple("getSuseProductRepositoriesXmlStream", "suse_product_repositories")

    def import_scc_repositories(self):
        """Imports SCC Repositories"""
        self._process_simple("getSCCRepositoriesXmlStream", "scc_repositories")

    def import_suse_subscriptions(self):
        """Imports Subscriptions"""
        self._process_simple("getSuseSubscriptionsXmlStream", "suse_subscriptions")

    def import_cloned_channels(self):
        """Imports Cloned Channels"""
        self._process_simple("getClonedChannelsXmlStream", "cloned_channels")

class ThreadDownload(threading.Thread):

    def __init__(self, lock, queue, out_queue, short_package_collection, package_collection, syncer,
                 failed_fs_packages, extinct_packages, sources, channel):
        threading.Thread.__init__(self)
        self.queue = queue
        self.out_queue = out_queue
        self.short_package_collection = short_package_collection
        self.package_collection = package_collection
        self.syncer = syncer
        self.failed_fs_packages = failed_fs_packages
        self.extinct_packages = extinct_packages
        self.sources = sources
        self.channel = channel
        self.lock = lock

    def run(self):
        while not self.queue.empty():
            # grabs host from queue
            (package_id, path) = self.queue.get()
            package = self.package_collection.get_package(package_id)
            last_modified = package['last_modified']
            checksum_type = package['checksum_type']
            checksum = package['checksum']
            package_size = package['package_size']
            if not path:
                nevra = get_nevra(package)
                orgid = None
                if package['org_id']:
                    orgid = OPTIONS.orgid or DEFAULT_ORG
                path = self.syncer._get_rel_package_path(nevra, orgid, self.sources,
                                                         checksum_type, checksum)

            # update package path
            package['path'] = path
            self.package_collection.add_item(package)

            errcode = self.syncer._verify_file(path, rhnLib.timestamp(last_modified),
                                               package_size, checksum_type, checksum)
            if errcode == 0:
                # file is already there
                # do not count this size to time estimate
                try:
                    self.queue.task_done()
                except AttributeError:
                    pass
                self.out_queue.put((None, package, False))
                continue

            cfg = config.initUp2dateConfig()
            rpmManip = RpmManip(package, path)
            nvrea = rpmManip.nvrea()

            # Retry a number of times, we may have network errors
            for _try in range(cfg['networkRetries']):
                self.lock.acquire()
                try:
                    rpmFile, stream = self.syncer._get_package_stream(self.channel,
                                                                      package_id, nvrea, self.sources, checksum)
                except:
                    self.lock.release()
                    raise
                self.lock.release()
                if stream is None:
                    # Mark the package as extinct
                    self.extinct_packages.put(package_id)
                    log(1, messages.package_fetch_extinct %
                        (os.path.basename(path)))
                    break  # inner for

                try:
                    rpmManip.write_file(stream)
                    break  # inner for
                except FileCreationError:
                    e = sys.exc_info()[1]
                    msg = e.args[0]
                    log2disk(-1, _("Unable to save file %s: %s") % (
                        rpmManip.full_path, msg))
                    # Try again
                    continue  # inner for

            else:  # for
                # Ran out of iterations
                # Mark the package as failed and move on
                self.failed_fs_packages.put(package_id)
                log(1, messages.package_fetch_failed %
                    (os.path.basename(path)))
                # Move to the next package
                try:
                    self.queue.task_done()
                except AttributeError:
                    pass
                self.out_queue.put((rpmManip, package, False))
                continue

            if stream is None:
                # Package is extinct. Move on
                try:
                    self.queue.task_done()
                except AttributeError:
                    pass
                self.out_queue.put((rpmManip, package, False))
                continue

            if self.syncer.mountpoint and not self.syncer.keep_rpms:
                # Channel dumps import; try to unlink to preserve disk space
                # rpmFile is always returned by _get_package_stream for
                # disk-based imports
                assert(rpmFile is not None)
                try:
                    os.unlink(rpmFile)
                except (OSError, IOError):
                    pass

            # signals to queue job is done
            try:
                self.queue.task_done()
            except AttributeError:
                pass
            self.out_queue.put((rpmManip, package, True))


class StreamProducer:

    def __init__(self, handler, data_source_class, source_func):
        self.handler = handler
        self.is_disk_loader = data_source_class.is_disk_loader()
        if self.is_disk_loader:
            self.loader = getattr(data_source_class, source_func)()
        else:
            self.loader = getattr(data_source_class, source_func)
        self._args = ()

    def set_args(self, *args):
        self._args = args

    def close(self):
        self.handler.close()

    def process(self, batch):
        if self.is_disk_loader:
            for oid in batch:
                self.loader.setID(oid)
                stream = self.loader.load()
                self.handler.process(stream)
        else:
            # Only use the extra arguments if needed, for now
            args = self._args or (batch, )
            stream = self.loader(*args)
            self.handler.process(stream)


def _verifyPkgRepMountPoint():
    """ Checks the base package repository directory tree for
        existance and permissions.

        Creates base dir if need be, and chowns to apache.root (required
        for rhnpush).
    """

    if not CFG.MOUNT_POINT:
        # Incomplete configuration
        log(-1, _("ERROR: server.mount_point not set in the configuration file"))
        sys.exit(16)

    if not os.path.exists(fileutils.cleanupAbsPath(CFG.MOUNT_POINT)):
        log(-1, _("ERROR: server.mount_point %s do not exist")
            % fileutils.cleanupAbsPath(CFG.MOUNT_POINT))
        sys.exit(26)

    if not os.path.exists(fileutils.cleanupAbsPath(CFG.MOUNT_POINT + '/' + CFG.PREPENDED_DIR)):
        log(-1, _("ERROR: path under server.mount_point (%s)  do not exist")
            % fileutils.cleanupAbsPath(CFG.MOUNT_POINT + '/' + CFG.PREPENDED_DIR))
        sys.exit(26)


def _validate_package_org(batch):
    """Validate the orgids associated with packages.
     If its redhat channel default to Null org
     If custom channel and org is specified use that.
     If custom and package org is not valid default to org 1
    """
    orgid = OPTIONS.orgid or None
    for pkg in batch:
        if not pkg['org_id'] or pkg['org_id'] == 'None':
            # default to Null so do nothing
            pkg['org_id'] = None
        elif orgid:
            # if options.orgid specified use it
            pkg['org_id'] = orgid
        else:
            # org from server is not valid
            pkg['org_id'] = DEFAULT_ORG


def _getImportedChannels(withAdvisory=None):
    "Retrieves the channels already imported in the satellite's database"

    query = "select distinct c.label from rhnChannel c"
    query_args={}

    if withAdvisory:
        query += """
            inner join rhnChannelErrata ce on c.id = ce.channel_id
            inner join rhnErrata e on ce.errata_id = e.id
                    and e.advisory_name = :advisory
                    and e.org_id = :org_id
        """
        query_args={"advisory": withAdvisory["advisory_name"],
                    "org_id": withAdvisory["org_id"]}

    if not OPTIONS.include_custom_channels:
        query += " where c.org_id is null"

    try:
        h = rhnSQL.prepare(query)
        h.execute(**query_args)
        return [x['label'] for x in h.fetchall_dict() or []]
    except (SQLError, SQLSchemaError, SQLConnectError):
        e = sys.exc_info()[1]
        # An SQL error is fatal... crash and burn
        exitWithTraceback(e, 'SQL ERROR during xml processing', 17)
    return []


def getDbIssParent():
    sql = "select label from rhnISSMaster where is_current_master = 'Y'"
    h = rhnSQL.prepare(sql)
    h.execute()
    row = h.fetchone_dict()
    if not row:
        return None
    return row['label']


def getDbCaChain(master):
    sql = "select ca_cert from rhnISSMaster where label = :label"
    h = rhnSQL.prepare(sql)
    h.execute(label=master)
    row = h.fetchone_dict()
    if not row:
        return None
    return row['ca_cert']


def processCommandline():
    "process the commandline, setting the OPTIONS object"

    log2disk(-1, _("Commandline: %s") % repr(sys.argv))
    optionsTable = [
        Option('--batch-size',          action='store',
               help=_('DEBUG ONLY: max. batch-size for XML/database-import processing (1..%s).'
                      + '"man mgr-inter-sync" for more information.') % SequenceServer.NEVER_MORE_THAN),
        Option('--ca-cert',             action='store',
               help=_('alternative SSL CA Cert (fullpath to cert file)')),
        Option('-c', '--channel',             action='append',
               help=_('process data for this channel only')),
        Option('--consider-full',       action='store_true',
               help=_('disk dump will be considered to be a full export; '
                      'see "man mgr-inter-sync" for more information.')),
        Option('--include-custom-channels',       action='store_true',
               help=_('existing custom channels will also be synced (unless -c is used)')),
        Option('--debug-level',         action='store',
               help=_('override debug level set in /etc/rhn/rhn.conf (which is currently set at %s).') % CFG.DEBUG),
        Option('--dump-version',        action='store',
               help=_("requested version of XML dump (default: %s)") % constants.PROTOCOL_VERSION),
        Option('--email',               action='store_true',
               help=_('e-mail a report of what was synced/imported')),
        Option('--force-all-errata',    action='store_true',
               help=_('forcibly process all (not a diff of) patch metadata')),
        Option('--ignore-proxy',          action='store_true',
               help=_('Do not use an http proxy under any circumstances.')),
        Option('--http-proxy',          action='store',
               help=_('alternative http proxy (hostname:port)')),
        Option('--http-proxy-username', action='store',
               help=_('alternative http proxy username')),
        Option('--http-proxy-password', action='store',
               help=_('alternative http proxy password')),
        Option('--iss-parent',          action='store',
               help=_('parent SUSE Manager to import content from')),
        Option('-l', '--list-channels', action='store_true',
               help=_('list all available channels and exit')),
        Option('--list-error-codes',    action='store_true',
               help=_("help on all error codes mgr-inter-sync returns")),
        Option('-m', '--mount-point',   action='store',
               help=_('source mount point for import - disk update only')),
        Option('--no-errata',           action='store_true',
               help=_('do not process patch data')),
        Option('--no-kickstarts',       action='store_true',
               help=_('do not process kickstart data (provisioning only)')),
        Option('--no-packages',         action='store_true',
               help=_('do not process full package metadata')),
        Option('--no-rpms',             action='store_true',
               help=_('do not download, or process any RPMs')),
        Option('--no-ssl',              action='store_true',
               help=_('turn off SSL (not recommended)')),
        Option('--orgid',               action='store',
               help=_('org to which the sync imports data. defaults to the admin account')),
        Option('-p', '--print-configuration', action='store_true',
               help=_('print the configuration and exit')),
        Option('-s', '--server',        action='store',
               help=_('alternative server with which to connect (hostname)')),
        Option('--step',                action='store',
               help=_('synchronize to this step (man mgr-inter-sync for more info)')),
        Option('--sync-to-temp',        action='store_true',
               help=_('write complete data to tempfile before streaming to remainder of app')),
        Option('--systemid',            action='store',
               help=_("DEBUG ONLY: alternative path to digital system id")),
        Option('--traceback-mail',      action='store',
               help=_('alternative email address(es) for sync output (--email option)')),
        Option('--keep-rpms',           action='store_true',
               help=_('do not remove rpms when importing from local dump')),
        Option('--master',              action='store',
               help=_('the fully qualified domain name of the master Satellite. '
                      'Valid with --mount-point only. '
                      'Required if you want to import org data and channel permissions.')),
    ]
    optionParser = OptionParser(option_list=optionsTable)
    global OPTIONS
    OPTIONS, args = optionParser.parse_args()

    # we take extra commandline arguments that are not linked to an option
    if args:
        msg = _("ERROR: these arguments make no sense in this context (try --help): %s") % repr(args)
        log2stderr(-1, msg, 1, 1)
        sys.exit(19)

    #
    # process anything CFG related (db, debug, server, and print)
    #
    try:
        rhnSQL.initDB()
    except (SQLError, SQLSchemaError, SQLConnectError):
        e = sys.exc_info()[1]
        # An SQL error is fatal... crash and burn
        log(-1, _("ERROR: Can't connect to the database: %s") % e, stream=sys.stderr)
        log(-1, _("ERROR: Check if your database is running."), stream=sys.stderr)
        sys.exit(20)

    CFG.set("ISS_Parent", getDbIssParent())
    CFG.set("TRACEBACK_MAIL", OPTIONS.traceback_mail or CFG.TRACEBACK_MAIL)
    CFG.set("RHN_PARENT", idn_ascii_to_puny(OPTIONS.iss_parent or OPTIONS.server or
                                            CFG.ISS_PARENT or CFG.RHN_PARENT))
    if OPTIONS.server and not OPTIONS.iss_parent:
        # server option on comman line should override ISS parent from config
        CFG.set("ISS_PARENT", None)
    else:
        CFG.set("ISS_PARENT", idn_ascii_to_puny(OPTIONS.iss_parent or CFG.ISS_PARENT))
        CFG.set("ISS_CA_CHAIN", OPTIONS.ca_cert or getDbCaChain(CFG.RHN_PARENT)
                or CFG.CA_CHAIN)

    if not OPTIONS.ignore_proxy:
        CFG.set("HTTP_PROXY", idn_ascii_to_puny(OPTIONS.http_proxy or CFG.HTTP_PROXY))
        CFG.set("HTTP_PROXY_USERNAME", OPTIONS.http_proxy_username or CFG.HTTP_PROXY_USERNAME)
        CFG.set("HTTP_PROXY_PASSWORD", OPTIONS.http_proxy_password or CFG.HTTP_PROXY_PASSWORD)
        CFG.set("CA_CHAIN", OPTIONS.ca_cert or CFG.CA_CHAIN)

    CFG.set("SYNC_TO_TEMP", OPTIONS.sync_to_temp or CFG.SYNC_TO_TEMP)

    # check the validity of the debug level
    if OPTIONS.debug_level:
        debugRange = 6
        try:
            debugLevel = int(OPTIONS.debug_level)
            if not (0 <= debugLevel <= debugRange):
                usix.raise_with_tb(RhnSyncException("exception will be caught"), sys.exc_info()[2])
        except KeyboardInterrupt:
            e = sys.exc_info()[1]
            raise
        # pylint: disable=E0012, W0703
        except Exception:
            msg = [_("ERROR: --debug-level takes an in integer value within the range %s.")
                   % repr(tuple(range(debugRange + 1))),
                   _("  0  - little logging/messaging."),
                   _("  1  - minimal logging/messaging."),
                   _("  2  - normal level of logging/messaging."),
                   _("  3  - lots of logging/messaging."),
                   _("  4+ - excessive logging/messaging.")]
            log(-1, msg, 1, 1, sys.stderr)
            sys.exit(21)
        else:
            CFG.set('DEBUG', debugLevel)
            initLOG(CFG.LOG_FILE, debugLevel)

    if OPTIONS.print_configuration:
        CFG.show()
        sys.exit(0)

    if OPTIONS.master:
        if not OPTIONS.mount_point:
            msg = _("ERROR: The --master option is only valid with the --mount-point option")
            log2stderr(-1, msg, cleanYN=1)
            sys.exit(28)
    elif CFG.ISS_PARENT:
        OPTIONS.master = CFG.ISS_PARENT

    if OPTIONS.orgid:
        # verify if its a valid org
        orgs = [a['id'] for a in satCerts.get_all_orgs()]
        if int(OPTIONS.orgid) not in orgs:
            msg = _("ERROR: Unable to lookup Org Id %s") % OPTIONS.orgid
            log2stderr(-1, msg, cleanYN=1)
            sys.exit(27)

    # the action dictionary used throughout
    actionDict = {}

    if OPTIONS.list_channels:
        if OPTIONS.step:
            log(-1, _("WARNING: --list-channels option overrides any --step option. --step ignored."))
        OPTIONS.step = 'channels'
        actionDict['list-channels'] = 1
    else:
        actionDict['list-channels'] = 0

    #
    # validate the --step option and set up the hierarchy of sync process steps.
    #
    stepHierarchy = Runner.step_hierarchy
    # if no step stated... we do all steps.
    if not OPTIONS.step:
        OPTIONS.step = stepHierarchy[-1]

    if OPTIONS.step not in stepHierarchy:
        log2stderr(-1, _("ERROR: '%s' is not a valid step. See 'man mgr-inter-sync' for more detail.")
                   % OPTIONS.step, 1, 1)
        sys.exit(22)

    # XXX: --source is deferred for the time being
    #OPTIONS.source = OPTIONS.step in sourceSteps

    # populate the action dictionary
    for step in stepHierarchy:
        actionDict[step] = 1
        if step == OPTIONS.step:
            break

    # make sure *all* steps in the actionDict are handled.
    for step in stepHierarchy:
        actionDict[step] = step in actionDict

    channels = OPTIONS.channel or []
    if OPTIONS.list_channels:
        actionDict['channels'] = 1
        actionDict['arches'] = 0
        actionDict['channel-families'] = 1
        channels = []

    # Cleanup selected channels.
    # if no channels selected, the default is to "freshen", or select the
    # already existing channels in the local database.
    if not channels:
        channels = _getImportedChannels()

    if not channels:
        if actionDict['channels'] and not actionDict['list-channels']:
            msg = _("ERROR: No channels currently imported; try mgr-inter-sync --list-channels; "
                  + "then mgr-inter-sync -c chn0 -c chn1...")
            log2disk(-1, msg)
            log2stderr(-1, msg, cleanYN=1)
            sys.exit(0)

    # add all the "other" actions specified.
    otherActions = {"no_rpms": 'no-rpms',
                    #"no_srpms"           : 'no-srpms',
                    "no_packages": 'no-packages',
                    #"no_source_packages" : 'no-source-packages',
                    "no_errata": 'no-errata',
                    "no_kickstarts": 'no-kickstarts',
                    "force_all_errata": 'force-all-errata',
                    'no_ssl': 'no-ssl'}

    for oa in otherActions:
        if getattr(OPTIONS, oa):
            actionDict[otherActions[oa]] = 1
        else:
            actionDict[otherActions[oa]] = 0

    if actionDict['no-kickstarts']:
        actionDict['kickstarts'] = 0

    if actionDict['no-errata']:
        actionDict['errata'] = 0

    # if actionDict['no-source-packages']:
    actionDict['source-packages'] = 0

    if actionDict['no-packages']:
        actionDict['packages'] = 0
        actionDict['short'] = 0
        actionDict['download-packages'] = 0
        actionDict['rpms'] = 0

    if actionDict['no-rpms']:
        actionDict['rpms'] = 0

    # if actionDict['no-srpms']:
    actionDict['srpms'] = 0

    if not OPTIONS.master:
        actionDict['orgs'] = 0

    if OPTIONS.batch_size:
        try:
            OPTIONS.batch_size = int(OPTIONS.batch_size)
            if OPTIONS.batch_size not in list(range(1, 51)):
                raise ValueError(_("ERROR: --batch-size must have a value within the range: 1..50"))
        except (ValueError, TypeError):
            # int(None) --> TypeError
            # int('a')  --> ValueError
            usix.raise_with_tb(ValueError(_("ERROR: --batch-size must have a value within the range: 1..50")),
                               sys.exc_info()[2])

    OPTIONS.mount_point = fileutils.cleanupAbsPath(OPTIONS.mount_point)
    OPTIONS.systemid = fileutils.cleanupAbsPath(OPTIONS.systemid)

    if OPTIONS.mount_point:
        if not os.path.isdir(OPTIONS.mount_point):
            msg = _("ERROR: no such directory %s") % OPTIONS.mount_point
            log2stderr(-1, msg, cleanYN=1)
            sys.exit(25)

    if OPTIONS.list_error_codes:
        msg = [_("Error Codes: Returned codes means:"),
               _(" -1  - Could not lock file or KeyboardInterrupt or SystemExit"),
               _("  0  - User interrupted or intentional exit"),
               _("  1  - attempting to run more than one instance of mgr-inter-sync."),
               _("  2  - Unable to find synchronization tools."),
               _("  3  - a general socket exception occurred"),
               _("  4  - an SSL error occurred. Recheck your SSL settings."),
               _("  5  - ISS error"),
               _("  6  - unhandled exception occurred"),
               _("  7  - unknown sync error"),
               _("  8  - ERROR: must be root to execute"),
               _("  9  - rpclib fault during synchronization init"),
               _("  10 - synchronization init error"),
               _("  11 - Error parsing XML stream"),
               _("  12 - Channel do not exist"),
               _("  13 - SQL error during importing package metadata"),
               _("  14 - SQL error during linking channel packages"),
               _("  15 - SQL error during xml processing"),
               _("  16 - server.mount_point not set in the configuration file"),
               _("  17 - SQL error during retrieving the channels already imported in the SUSE Manager database"),
               _("  18 - Wrong db connection string in rhn.conf"),
               _("  19 - Bad arguments"),
               _("  20 - Could not connect to db."),
               _("  21 - Bad debug level"),
               _("  22 - Not valid step"),
               _("  24 - no such file"),
               _("  25 - no such directory"),
               _("  26 - mount_point does not exist"),
               _("  27 - No such org"),
               _("  28 - error: --master is only valid with --mount-point"), ]
        log(-1, msg, 1, 1, sys.stderr)
        sys.exit(0)

    if OPTIONS.dump_version:
        OPTIONS.dump_version = str(OPTIONS.dump_version)
        if OPTIONS.dump_version not in constants.ALLOWED_SYNC_PROTOCOL_VERSIONS:
            msg = _("ERROR: unknown dump version, try one of %s") % \
                constants.ALLOWED_SYNC_PROTOCOL_VERSIONS
            log2stderr(-1, msg, cleanYN=1)
            sys.exit(19)

    # return the dictionary of actions, channels
    return actionDict, channels


def formatDateTime(dtstring=None, dt=None):
    """ Format the date time using your locale settings. This assume that your setlocale has been alread called. """
    if not dt:
        dt = time.strptime(dtstring, '%Y%m%d%H%M%S')
    return time.strftime("%c", dt)


if __name__ == '__main__':
    sys.stderr.write("!!! running this directly is advisable *ONLY* for testing"
                     " purposes !!!\n")
    try:
        sys.exit(Runner().main() or 0)
    except (KeyboardInterrupt, SystemExit):
        ex = sys.exc_info()[1]
        sys.exit(ex)
    except Exception:  # pylint: disable=E0012, W0703
        tb = 'TRACEBACK: ' + fetchTraceback(with_locals=1)
        log2disk(-1, tb)
        log2email(-1, tb)
        sendMail()
        sys.exit(-1)
 070701000000F4000081FD0000000000000000000000015FBBE8EE00003C37000000000000000000000000000000000000003600000000spacewalk-backend/satellite_tools/spacewalk-data-fsck #!/usr/bin/python3
# -*- coding: utf-8 -*-

import sys
import os
import stat
import shutil
from optparse import Option, OptionParser
import tempfile

try:
    from uyuni.common import checksum
    from spacewalk.common.rhnLog import initLOG, log_debug
    from spacewalk.common.rhnConfig import CFG, initCFG
    from spacewalk.server import rhnSQL
    from spacewalk.server.rhnPackage import unlink_package_file
except:
    _LIBPATH = "/usr/share/rhn"
    # add to the path if need be
    if _LIBPATH not in sys.path:
        sys.path.append(_LIBPATH)
    from common import CFG, initCFG, initLOG, log_debug
    from server import rhnSQL
    from server.rhnPackage import unlink_package_file

LOG_FILE = '/var/log/rhn/spacewalk-data-fsck.log'

report_msg = {
    'file': "%5d files scanned",
    'exists': "ERROR: %5d files missing on disk",
    'dbexists': "ERROR: %5d files missing in database",
    'srpmexists': "ERROR: %5d SRPMs without matching RPM in db",
    'restore': "ERROR: %5d file paths could not be restored",
    'size': "ERROR: %5d file size mismatch(es)",
    'checksum': "ERROR: %5d file checksum mismatch(es)",
    'nevrao': "ERROR: %5d file NEVRAO mismatch(es)",
}
report = {}


def is_sha256_capable():
    import rpm
    ts = rpm.TransactionSet()
    mi = ts.dbMatch('Providename', 'spacewalk-schema')
    cmp = -1
    try:
        h = next(mi)
        cmp = rpm.labelCompare([h['name'].decode("utf-8"), h['version'].decode("utf-8"), h['release'].decode("utf-8")],
                               [h['name'].decode("utf-8"), '0.8.1', '1'])
    except StopIteration:
        pass
    return (cmp > 0)


def db_init():
    initCFG('server')
    rhnSQL.initDB()


def src_package_query():
    query = """select p.id
                 from rhnPackage p
                where p.path like :filename"""
    return query

def package_query(options, bind_path=False):
    query = """select %s
                 from %s
                     """
    columns = "p.id, p.org_id, p.package_size, p.path"
    tables = "rhnPackage p"
    if options.checksum or options.nevrao:
        if is_sha256_capable():
            columns += ", c.checksum, c.checksum_type"
            tables += " join rhnChecksumView c on p.checksum_id = c.id"
        else:
            columns += ", p.md5sum as checksum, 'md5sum' as checksum_type"
    if options.nevrao:
        columns += ", n.name, evr.epoch, evr.version, evr.release, a.label as arch"
        tables += " join rhnPackageName n on p.name_id = n.id"
        tables += " join rhnPackageEVR evr on p.evr_id = evr.id"
        tables += " join rhnPackageArch a on p.package_arch_id = a.id"
    if bind_path:
        query += "where p.path = :path"
    return query % (columns, tables)


def check_db_vs_disk(options):
    for k in list(report_msg.keys()):
        report[k] = 0
    query = package_query(options)
    h = rhnSQL.prepare(query)

    path_prefix = CFG.MOUNT_POINT

    h.execute()

    while 1:
        row = h.fetchone_dict()
        if not row:
            break

        if row['path']:
            abs_path = os.path.join(path_prefix, row['path'])
            log(3, abs_path)
            report['file'] += 1

            if check_disk_exists(abs_path) == 1:
                report['exists'] += 1
                not_on_disk(row, abs_path, options)
            elif options.restore:
                report['restore'] += check_disk_nevrao(abs_path, row.copy(), True)
            else:
                if options.size:
                    report['size'] += check_disk_size(abs_path, row['package_size'])
                if options.nevrao:
                    report['nevrao'] += check_disk_nevrao(abs_path, row.copy())
                if options.checksum:
                    report['checksum'] += check_disk_checksum(abs_path,
                                                              row['checksum_type'], row['checksum'])
        elif options.restore:
            abs_path = "unknown"
            report['restore'] += check_disk_nevrao(abs_path, row.copy(), True)

    h.close()
    error_found = 0
    for i in ['file', 'exists', 'restore', 'size', 'nevrao', 'checksum']:
        if report[i] > 0:
            log(1, report_msg[i] % report[i])
            if i != 'file':
                error_found = 1
    return error_found


def check_disk_exists(abs_path):
    return not os.path.isfile(abs_path)


def not_on_disk(row, abs_path, options):
    if options.remove:
        log(0, "Removed package path from db: %s" % row['path'])
        rhnSQL.execute('update rhnPackage set path = NULL where id = :id', id=row['id'])
        rhnSQL.commit()
    else:
        log(0, "File missing: %s" % abs_path)


def check_disk_size(abs_path, size):
    file_size = os.stat(abs_path)[stat.ST_SIZE]
    ret = 0
    if file_size != size:
        log(0, "File size mismatch: %s (%s vs. %s)" % (abs_path, size, file_size))
        ret = 1
    return ret


def check_disk_nevrao(abs_path, row, restore=None):
    file = {}
    try:
        (_redhat_,
        file['org_id'],
        file['checksum_prefix'],
        file['name'],
        file['evr'],
        file['arch'],
        file['checksum'],
        file['basename']) = row['path'].split('/')
    except ValueError:
        log(0, "File path %s mismatch structure" % row['path'])
        return 1
    except AttributeError:
        if not restore:
            log(0, "File path missing in DB")
            return 1
        file['org_id'] = ""
        file['checksum_prefix'] = ""
        file['name'] = ""
        file['evr'] = ""
        file['arch'] = ""
        file['checksum'] = ""
        file['basename'] = ""

    if not row['org_id']:
        row['org_id'] = 'NULL'
    else:
        row['org_id'] = str(row['org_id'])
    row['checksum_prefix'] = row['checksum'][:3]
    if row['epoch']:
        row['evr'] = row['epoch'] + ':'
    else:
        row['evr'] = ''
    row['evr'] += row['version'] + '-' + row['release']
    row['basename'] = "%s-%s-%s.%s.%s" % (
        row['name'], row['version'], row['release'],
        row['arch'], (row.get('path') or "rpm")[-3:])
    ret = 0
    for key in ('org_id', 'checksum_prefix', 'name', 'evr', 'arch', 'checksum',
                'basename'):
        if file[key] != row[key]:
            log(0, "File path mismatch: %s (%s: %s vs. %s)" % (abs_path, key, row[key],
                                                               file[key]))
            if restore:
                log(2, "Beginning file path restoration: %s" % abs_path)
                return restore_file_path(file, row)
            ret = 1
    return ret


def restore_file_path(file, row):
    prefix = CFG.MOUNT_POINT + '/'
    new_path = 'packages/' + row['org_id'] + '/' + row['checksum_prefix'] + '/' + row['name'] + \
        '/' + row['evr'] + '/' + row['arch'] + '/' + row['checksum'] + '/' + row['basename']
    query = "update rhnPackage set path=\'" + new_path + "\' where id=" + str(row['id'])
    new_path = prefix + new_path

    if row['path']:
        backup_path = prefix + row['path']
    if (os.path.isfile(new_path) and
       check_disk_checksum(new_path, row['checksum_type'], row['checksum']) == 0):
            backup_path = tempfile.mkdtemp() + new_path
            os.makedirs(backup_path.rsplit('/', 1)[0])
            log(0, "Target file path exists, moving to: %s" % backup_path)
            shutil.move(new_path, backup_path)
    elif not row['path']:
        # path is empty - unable to restore
        return delete_package_entry(row)

    cleanup = True
    try:  # 1st, make dirs needed
        os.makedirs(new_path.rsplit('/', 1)[0])
    except OSError as e:
        if e.errno != 17:  # something broke up
            log(0, "File path restoration failed: %s" % row['path'])
            return 1
        else:
            cleanup = False  # dir already exists, do not cleanup
    try:  # 2nd, create hardlink; os.link and os.makedirs in 1 dir would be problem due to checking of errno 17...
        if not os.path.isfile(new_path):
            shutil.move(backup_path, new_path)
    except OSError:
        log(0, "File path restoration failed, rolling back: %s" % row['path'])
        if cleanup == True:
            try:
                os.removedirs(new_path.rsplit('/', 1)[0])
            except OSError as e:
                if e.errno != 39:
                    log(0, "Could not rollback file path restoration: %s" % row['path'] or '')
                    return 1
        return
    h = rhnSQL.prepare(query)
    h.execute()
    rhnSQL.commit()
    try:
        if backup_path:
            if os.path.isfile(backup_path):
                os.remove(backup_path)
            os.removedirs(backup_path.rsplit('/', 1)[0])
    except OSError as e:
        if e.errno == 2:
            log(2, "File %s%s was removed by someone else but transaction has been successfully completed" %
                (prefix, row['path']))
        elif e.errno != 39:
            log(4, "Unexpected error, computer is going to self destruct")
    log(0, "File successfully restored, new file path: %s" % new_path)
    return 0

def delete_package_entry(row):
    query1 = "delete from rhnChannelPackage where package_id=" + str(row['id'])
    query2 = "delete from rhnPackage where id=" + str(row['id'])
    try:
        h = rhnSQL.prepare(query1)
        h.execute()
        h = rhnSQL.prepare(query2)
        h.execute()
        rhnSQL.commit()
        log(0, "Successfully removed DB package entry without path")
    except Exception as e:
        log(0, "Failed to remove DB package entry: ", e)
        return 1
    return 0

def check_disk_checksum(abs_path, checksum_type, db_checksum):
    file_checksum = None
    ret = 0
    try:
        fp = open(abs_path, 'rb')
        h = checksum.getHashlibInstance(checksum_type, False)
        h.update(fp.read())
        file_checksum = h.hexdigest()
        fp.close()
    except Exception as exc:
        log(0, "Unable to calculate checksum: {}".format(str(exc)))
        ret = 1

    if file_checksum is not None and file_checksum != db_checksum:
        log(0, "File checksum mismatch: %s (%s: %s vs. %s)" % (abs_path, checksum_type, db_checksum, file_checksum))
        if options.remove_mismatch:
            remove_mismatch(abs_path, options)
        ret = 1

    return ret


def check_disk_vs_db(disk_content=None, db_content=None):
    for k in list(report_msg.keys()):
        report[k] = 0
    query = package_query(options, bind_path=True)
    h = rhnSQL.prepare(query)
    for root, dirs, files in os.walk(os.path.join(CFG.MOUNT_POINT, 'packages')):
        rel_root = root[len(CFG.MOUNT_POINT) + 1:]
        for f in files:
            abs_path = os.path.join(root, f)
            rel_path = os.path.join(rel_root, f)
            log(3, abs_path)
            report['file'] += 1

            h.execute(path=rel_path)
            row = h.fetchone_dict()

            if not row:
                if (not is_srpm(f)) or is_orphaned_srpm(abs_path, f):
                    if is_srpm(f):
                        report['srpmexists'] += 1
                    else:
                        report['dbexists'] += 1
                    not_in_db(abs_path, options)
                continue

            if options.size and options.fs_only:
                report['size'] += check_disk_size(abs_path, row['package_size'])
            if options.nevrao and options.fs_only:
                report['nevrao'] += check_disk_nevrao(abs_path, row.copy())
            if options.checksum and options.fs_only:
                report['checksum'] += check_disk_checksum(abs_path,
                                                          row['checksum_type'], row['checksum'])
    h.close()
    error_found = 0
    for i in ['file', 'dbexists', 'srpmexists', 'size', 'nevrao', 'checksum']:
        if report[i] > 0:
            log(1, report_msg[i] % report[i])
            if i != 'file':
                error_found = 1
    return error_found

def is_srpm(file):
    if file.find("src.rpm") != -1:
        return True
    else:
        return False

def is_orphaned_srpm(path, file):
    if is_srpm(file):
        query = src_package_query()
        h = rhnSQL.prepare(query)
        wildcard_filename = "%/" + file.replace('src','%')
        h.execute(filename=wildcard_filename)
        row = h.fetchone_dict()
        if not row:
            log(0, "SRPM without matching RPM in db: %s" % (path))
            return True

    return False

def not_in_db(path, options):
    if options.remove:
        if is_srpm(path):
            log(0, "Removed SRPM without matching RPM in db: %s" % (path))
        else:
            log(0, "Removed file missing in db: %s" % (path))
        unlink_package_file(path)
    else:
        if not is_srpm(path):
            log(0, "File missing in db: %s" % (path))

def remove_mismatch(path, options):
    log(0, "Removed file because checksum does not match: %s" % (path))
    unlink_package_file(path)

def log(level, *args):
    log_debug(level, *args)
    verbose = options.verbose
    if not verbose:
        verbose = 0
    if verbose >= level:
        print((', '.join([str(i) for i in args])))

if __name__ == '__main__':

    options_table = [
        Option("-v", "--verbose",       action="count",
               help="Increase verbosity"),
        Option("-S", "--no-size",       action="store_false", dest="size", default=True,
               help="Don't check package size"),
        Option("-C", "--no-checksum",   action="store_false", dest="checksum", default=True,
               help="Don't check package checksum"),
        Option("-O", "--no-nevrao",     action="store_false", dest="nevrao", default=True,
               help="Don't check package name, epoch, version, release, arch, org"),
        Option("-d", "--db-only",       action="store_true",
               help="Check only if packages from database are present on filesystem"),
        Option("-f", "--fs-only",       action="store_true",
               help="Check only if packages from filesystem are in the database"),
        Option("-r", "--remove",        action="store_true",
               help="Automatically remove packages from filesystem not present in database"),
        Option("-R", "--remove-mismatch", action="store_true", dest="remove_mismatch", default=False,
               help="Automatically remove packages from filesystem that does not match the checksum stored in database. (not valid with --db-only)"),
        Option("-F", "--fix-file-path", action="store_true", dest="restore", default=False,
               help="Restores file paths, try this when you have NEVRAO mismatches. Do not run this command with another commands"),
    ]
    parser = OptionParser(option_list=options_table)
    (options, args) = parser.parse_args()

    initLOG(LOG_FILE, options.verbose or 0)

    db_init()

    exit_value = 0
    if options.remove_mismatch:
        if options.db_only or not options.checksum:
            log(0, "Syntax error: The option --remove-mismatch cannot be used with --db-only or --no-checksum")
            sys.exit(1)
    if not options.fs_only:
        log(1, "Checking if packages from database are present on filesystem")
        exit_value += check_db_vs_disk(options)
    if not options.db_only:
        log(1, "Checking if packages from filesystem are present in database")
        exit_value += check_disk_vs_db(options)

    sys.exit(exit_value)
 070701000000F5000081B40000000000000000000000015FBBE8EE00001217000000000000000000000000000000000000003B00000000spacewalk-backend/satellite_tools/spacewalk-data-fsck.sgml    <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [
<!ENTITY THECOMMAND "spacewalk-data-fsck">
]>

<refentry>

<RefMeta>
<RefEntryTitle>spacewalk-data-fsck</RefEntryTitle><manvolnum>8</manvolnum>
</RefMeta>

<RefNameDiv>
<RefName><command>spacewalk-data-fsck</command></RefName>
<RefPurpose>
Helper utility to manage and compare packages on filesystem vs database.
</RefPurpose>
</RefNameDiv>

<RefSynopsisDiv>
<Synopsis>
    <cmdsynopsis>
        <command>spacewalk-data-fsck [ -v | -S | -C | -O | -d | -f | -r | F ] </command>
    </cmdsynopsis>
</Synopsis>
</RefSynopsisDiv>

<RefSect1><Title>Description</Title>

<para>
    The <emphasis>spacewalk-data-fsck</emphasis> is a helper utility that allows you to verify the packages stored on the filesystem and compare them against the packages referenced on the database.  You can verify if the packages from the database are present on the filesystem or vice-versa.
</para>
<para>
    <emphasis>spacewalk-data-fsck</emphasis> also allows you to remove the packages from filesytem if that package is not being used by any channel.
</para>
<para>
    By default, <emphasis>spacewalk-data-fsck</emphasis> will verify if the checksum of the RPM package matches with the checksum stored on the database.
    You can fix the file path by adding the option <emphasis>--fix-file-path</emphasis>.
</para>
<para>
    All the operations performed by <emphasis>spacewalk-data-fsck</emphasis>  will be logged
    at <filename>/var/log/rhn/spacewalk-data-fsck.log</filename>.
</para>
<para>
    Consider running <emphasis>spacewalk-data-fsck</emphasis> on a non-production period. The system/database activity
    will increase considerabily.
</para>
</RefSect1>

<RefSect1><Title>Options</Title>
<variablelist>
    <varlistentry>
        <term>-h, --help</term>
        <listitem>
            <para>show this help message and exit</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-v, --verbose</term>
        <listitem>
            <para>Increase verbosity.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-S, --no-size</term>
        <listitem>
            <para>Don't check package size</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-C, --no-checksum</term>
        <listitem>
            <para>Don't check package checksum</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-O, --no-nevrao</term>
        <listitem>
            <para>Don't check package name, epoch, version, release, arch, org</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-d, --db-only</term>
        <listitem>
            <para>Check only if packages from database are present on filesystem.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-f, --fs-only</term>
        <listitem>
            <para>Check only if packages from filesystem are in the database.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-r, --remove</term>
        <listitem>
            <para>Automaticaly remove packages from filesystem not present in database.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-F, --fix-file-path</term>
        <listitem>
            <para>
            Restores file paths, try this when you have <emphasis>NEVRAO</emphasis> mismatches.
            Do not run this command with another commands.
            </para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-R, --remove-mismatch</term>
        <listitem>
            <para>
            Remove packages from filesystem that does not match the checksum stored in the database.
            This option is not valid when combined with options <emphasis>--db-only</emphasis> or <emphasis>--no-checksum</emphasis>.
            After removing the packages from the filesystem, remember to run <emphasis>satellite-sync</emphasis> or <emphasis>spacewalk-repo-sync</emphasis> to download the RPM file.
            </para>
        </listitem>
    </varlistentry>
</variablelist>
</RefSect1>

<RefSect1><Title>Example</Title>
<simplelist>
    <member><command>&THECOMMAND; -f -r</command> Delete all the packages from filesystem are not in the database.</member>
    <member><command>&THECOMMAND; -F</command> Restore the file paths when <emphasis>NEVRAO</emphasis> mismatches.</member>
</simplelist>
</RefSect1>


<RefSect1><Title>Authors</Title>
<simplelist>
    <member>Marcelo Moreira de Mello <email>mmello@redhat.com</email></member>
</simplelist>
</RefSect1>
</RefEntry>
 070701000000F6000081FD0000000000000000000000015FBBE8EE00003B38000000000000000000000000000000000000003200000000spacewalk-backend/satellite_tools/spacewalk-debug #!/bin/sh
#
# Debug utility: packages log files, and relevant debug information
#                needed for full diagnosis of Spacewalk Server issues.
#
# Copyright (c) 2008--2018 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#


if [ "$(id -u)" != "0" ] ; then
  echo "This script must be run as root."
  exit
fi

BASE_DIR=/tmp
IS_SUSE=0
NO_REPORTS=0
NO_COMPRESSION=0
MAX_LOG_AGE=10
if [ -f /etc/SuSE-release ]; then
    IS_SUSE=1
fi
if [ "$SPACEWALK_DEBUG_NO_REPORTS" == 1 ]; then
    NO_REPORTS=1
fi

usage() {
    echo "Usage:"
    echo "$0 [OPTIONS]"
    echo "Debug utility that packages log files and other information"
    echo
    echo "  OPTIONS:"
    echo "    --help                Display usage and exit"
    echo "    --dir                 Destination directory ($BASE_DIR)"
    echo "    --log-age             Set the maximum age (in days) for extracted logs ($MAX_LOG_AGE)"
    echo "    --no-reports          Do not run spacewalk-report. Useful if spacewalk-debug takes too long"
    echo "    --no-compression      Do not compress spacewalk-debug destination folder"
    exit $1
}

while [ ${#} -ne 0 ]; do
    arg="$1"
    case "$arg" in
        --help)
            usage 0
            ;;
        --dir)
            shift
            BASE_DIR=$1
            ;;
        --log-age)
            shift
            MAX_LOG_AGE=$1
            ;;
        --no-reports)
            NO_REPORTS=1
            ;;
        --no-compression)
            NO_COMPRESSION=1
            ;;
        --*)
            echo "Unknown option $arg (use --help)"
            exit 1
            ;;
        *)
            echo "Too many arguments (use --help)"
            exit 1
            ;;
    esac
    shift
done

if [ ! -d "$BASE_DIR" ]; then
    mkdir -p "$BASE_DIR"
    [ $? != 0 ] && echo "Unable to create directory $BASE_DIR" && exit 1
fi

# clean any previous run
rm -rf $BASE_DIR/spacewalk-debug/*

# Make sure BASE_DIR is not relative
BASE_DIR=$(cd $BASE_DIR && pwd)

DIR=$BASE_DIR/spacewalk-debug
TARBALL=$BASE_DIR/spacewalk-debug.tar.bz2

/bin/mkdir -p $DIR
if [ $? != 0 ] ; then
  echo "Unable to create directory $DIR"
  exit
fi

chmod 700 $DIR
cd $DIR

echo "Collecting and packaging relevant diagnostic information."
if [ $NO_REPORTS -eq 1 ] ; then
    echo "NOTE: Running with '--no-reports' means 'spacewalk-report' won't be executed."
fi
echo "Warning: this may take some time..."

mkdir -p $DIR/conf/httpd
mkdir -p $DIR/conf/tomcat
mkdir -p $DIR/conf/cobbler
mkdir -p $DIR/conf/rhn/sysconfig
mkdir -p $DIR/httpd-logs
mkdir -p $DIR/tomcat-logs
mkdir -p $DIR/cobbler-logs
mkdir -p $DIR/rhn-logs/rhn
mkdir -p $DIR/config-defaults
mkdir -p $DIR/kickstarts
mkdir -p $DIR/database/trc
mkdir -p $DIR/cobbler-lib
mkdir -p $DIR/tasko
mkdir -p $DIR/salt-states
if [ -f /usr/bin/journalctl ]; then
  mkdir -p $DIR/systemd
fi

echo "    * copying configuration information"
if [ -d /etc/httpd ]; then
    cp -fapRd /etc/httpd/conf* $DIR/conf/httpd
elif [ -d /etc/apache2 ]; then
    cp -fapRd /etc/apache2/conf* $DIR/conf/httpd
    cp -fapRd /etc/apache2/vhosts* $DIR/conf/httpd
fi
cp -fapRd /etc/rhn $DIR/conf/rhn
cp -fapRd /etc/sysconfig/rhn $DIR/conf/rhn/sysconfig
# exclude schema upgrade files, as they are packaged
rm -r $DIR/conf/rhn/sysconfig/rhn/schema-upgrade

# there might be backups of rhn.conf so clean them up as well (bsc#1146419)
find $DIR/conf/rhn -name rhn.conf -exec sed -i 's/^server.susemanager.mirrcred_pass.*/server.susemanager.mirrcred_pass = <replaced_by_debug_tool>/' {} \;
find $DIR/conf/rhn -name rhn.conf -exec sed -i 's/^server.secret_key.*/server.secret_key = <replaced_by_debug_tool>/' {} \;
find $DIR/conf/rhn -name rhn.conf -exec sed -i 's/^session_secret_.*/session_secret_N = <replaced_by_debug_tool>/' {} \;
find $DIR/conf/rhn -name rhn.conf -exec sed -i 's/^web.session_swap_secret_.*/web.session_swap_secret_N = <replaced_by_debug_tool>/' {} \;
find $DIR/conf/rhn -name rhn.conf -exec sed -i 's/^db_password.*/db_password = <replaced_by_debug_tool>/' {} \;
find $DIR/conf/rhn -name rhn.conf -exec sed -i 's/^server.satellite.http_proxy_password.*/server.satellite.http_proxy_password = <replaced_by_debug_tool>/' {} \;

if [ -f /etc/tnsnames.ora ] ; then
    cp -fad /etc/tnsnames.ora $DIR/conf
fi

# Copy generated and existing SLS files
echo "    * copying Salt state files"
D_IFS=$IFS
IFS=","
for sls_dir in "/usr/share/susemanager/salt/","static-sls","static SLS" \
               "/srv/susemanager/salt/","generated-sls","generated SLS"; do
    set $sls_dir
    if [ -d $1 ] && [ "$(ls -A $1)" ]; then
	    echo -e "    \t- copying $3"
	    cp -fa $1 $DIR/salt-states/$2
    fi
done
IFS=$D_IFS
mkdir -p $DIR/salt-states/custom-sls/
for i in $(find /srv/salt/ -type f); do
    echo -e "    \t- copying custom SLS"
    if [[ $(file $i) = *"text"* ]];  then
	    cp --parents -fa $i $DIR/salt-states/custom-sls/
    else
      echo "$i" >> $DIR/salt-states/custom-sls/other_files
    fi
done

MATCHER_DATA_DIR=/var/lib/spacewalk/subscription-matcher
if [ -d $MATCHER_DATA_DIR ]; then
  echo "    * copying Subscription Matcher files"
  cp -fa $MATCHER_DATA_DIR $DIR/
fi

echo "    * copying logs"
if [ -f /usr/bin/journalctl ]; then
  /usr/bin/journalctl -m > $DIR/systemd/journalctl.log
fi

if [ -d /var/log/httpd ]; then
    cp -fapRd /var/log/httpd $DIR/httpd-logs
elif [ -d /var/log/apache2 ]; then
    cp -fapRd /var/log/apache2 $DIR/httpd-logs
fi

# copy rhn logs
if [ -d /var/log/rhn ]; then
    cp -fapd  /var/log/rhn/*.log* $DIR/rhn-logs/rhn

    # check for reposync dir
    if [ -d /var/log/rhn/reposync ]; then
        cp -fapRd /var/log/rhn/reposync $DIR/rhn-logs/rhn
    fi

    # check for search dir
    if [ -d /var/log/rhn/search ]; then
        cp -fapRd /var/log/rhn/search $DIR/rhn-logs/rhn
    fi
fi

DB_INSTALL_LOG=/var/log/rhn/rhn-database-installation.log
if [ -f "$DB_INSTALL_LOG" ] ; then
    mkdir -p $DIR/tmp
    cp -fa "$DB_INSTALL_LOG" $DIR/tmp/
fi

if [ $IS_SUSE -eq 1 ]; then
    cp -fa /var/log/susemanager* $DIR/rhn-logs
fi

if [ -d /var/log/salt ]; then
    mkdir -p $DIR/salt-logs
    cp -fa /var/log/salt $DIR/salt-logs
fi

# grab jabberd info if it exists (it should)
if [ -d /etc/jabberd ]; then
    mkdir -p $DIR/jabberd
    cp -fa /etc/jabberd $DIR/jabberd
fi

# tomcat for spacewalk 400+
for tomcat in tomcat tomcat5 tomcat6 ; do
  if [ -d /etc/$tomcat ]; then
    cp -fa /etc/$tomcat $DIR/conf/tomcat
  fi
  if [ -d /var/log/$tomcat ]; then
    cp -fa /var/log/$tomcat $DIR/tomcat-logs
  fi
done

# copying the /usr/share/rhn/config-defaults
echo "    * copying config-defaults files"
if [ -d /usr/share/rhn/config-defaults ]; then
    cp -fa /usr/share/rhn/config-defaults/* $DIR/config-defaults
fi

#cobbler stuff
echo "    * copying cobbler files"
if [ -d /etc/cobbler ]; then
    cp -fa /etc/cobbler/* $DIR/conf/cobbler
fi
if [ -d /var/log/cobbler ]; then
   cp -fa /var/log/cobbler/* $DIR/cobbler-logs
fi
if [ -d /var/lib/cobbler ]; then
   cp -fa /var/lib/cobbler/snippets $DIR/cobbler-lib/
   cp -fa /var/lib/cobbler/config $DIR/cobbler-lib/
   cp -fa /var/lib/cobbler/kickstarts $DIR/cobbler-lib/
   cp -fa /var/lib/cobbler/triggers $DIR/cobbler-lib/
fi
if [ -d /var/lib/rhn/kickstarts ]; then
   cp -fa /var/lib/rhn/kickstarts/* $DIR/kickstarts/
fi

# ssl-build
if [ -d /root/ssl-build ] ; then
    echo "    * copying ssl-build"
    mkdir -p $DIR/ssl-build
    # NOTE: cp -a == cp -pRd
    ls -lR /root/ssl-build/ > $DIR/ssl-build/ls-lR.txt 2> /dev/null
fi

# /etc/sudoers
if [ -f /etc/sudoers -o -d /etc/sudoers.d ] ; then
	echo "    * copying /etc/sudoers*"
	cp -fa /etc/sudoers* $DIR/conf
fi

# /etc/passwd
if [ -f /etc/passwd ] ; then
	echo "    * copying apache, postgres, tomcat entries from /etc/passwd"
	getent passwd apache wwwrun tomcat postgres > $DIR/conf/passwd
fi

# /etc/group
if [ -f /etc/group ] ; then
	echo "    * copying apache, postgres, tomcat entries from /etc/group"
	getent group apache www tomcat postgres > $DIR/conf/group
fi

echo "    * querying RPM database (versioning of Spacewalk, etc.)"
rpm -qa --last > $DIR/rpm-manifest
rpm -qa | sort > $DIR/rpm-manifest-clean

echo "    * querying schema version, database charactersets and database"
/usr/bin/rhn-schema-version > $DIR/database-schema-version
/usr/bin/rhn-charsets > $DIR/database-character-sets
if [ -f /usr/bin/smdba ] ; then
    /usr/bin/smdba space-overview > $DIR/db-control-report
elif [ -f /usr/bin/db-control ] && [ "$(spacewalk-cfg-get db_backend)" = "postgresql" ] ; then
    /usr/bin/db-control report > $DIR/db-control-report
fi

if [ -f /usr/bin/spacewalk-sql ] ; then
    USERS_TZ_LC_SQL="""
        SELECT w.login as login,
               tz.display_name as timezone,
               ui.preferred_locale as locale
          FROM web_contact w
               inner join rhnuserinfo ui on ui.user_id = w.id
               left outer join rhntimezone tz on ui.timezone_id = tz.id
        ORDER BY login;
    """
    echo "    * querying users timezone and localization preferences"
    echo $USERS_TZ_LC_SQL | /usr/bin/spacewalk-sql --select-mode - > $DIR/users-preferences
fi

echo "    * get diskspace available"
df -h > $DIR/diskinfo

echo "    * get database statistics"
/usr/bin/rhn-db-stats $DIR/database/db-stats.log

echo "    * get schema statistics"
/usr/bin/rhn-schema-stats $DIR/database/schema-stats.log

# alert.log
if [ -f /rhnsat/admin/rhnsat/bdump/alert_rhnsat.log ] ; then
	echo "    * copying alert_rhnsat.log"
	cp -fa /rhnsat/admin/rhnsat/bdump/alert_rhnsat.log $DIR/database
	ls /rhnsat/admin/rhnsat/bdump/*.trc 2>/dev/null | xargs -I file cp -fa file $DIR/database/trc
	ls /rhnsat/admin/rhnsat/logs/*.log 2>/dev/null | xargs -I file cp -fa file $DIR/database
fi

PGSQL_ROOT=""
MAX_PGSQL_LOGS_SIZE="6291456" #6 GB
rpm -q postgresql92-postgresql > /dev/null
if [ $? == 0 ]; then
	PGSQL_ROOT="/opt/rh/postgresql92/root"
fi

PGMAJOR=`psql --version | cut -f 3 -d" " | cut -b 1`

if [ "$PGMAJOR" = 9 ]; then
    PGLOGDIR="pg_log"
else
    PGLOGDIR="log"
fi

# PostgreSQL configuration
if [ -f $PGSQL_ROOT/var/lib/pgsql/postgresql.conf ] ; then
  echo "    * copying postgresql.conf"
	cp -fa $PGSQL_ROOT/var/lib/pgsql/data/postgresql.conf $DIR/database
fi
if [ -f $PGSQL_ROOT/var/lib/pgsql/pg_hba.conf ] ; then
  echo "    * copying pg_hba.conf"
	cp -fa $PGSQL_ROOT/var/lib/pgsql/data/pg_hba.conf $DIR/database
fi

# PostgreSQL logs
if [ -f $PGSQL_ROOT/var/lib/pgsql/pgstartup.log ] ; then
	echo "    * copying pgstartup.log"
	cp -fa $PGSQL_ROOT/var/lib/pgsql/pgstartup.log $DIR/database
fi
if [ -f /var/lib/pgsql/initlog ] ; then
       echo "    * copying initlog"
       cp -fa /var/lib/pgsql/initlog $DIR/database
fi
ls $PGSQL_ROOT/var/lib/pgsql/data/*.conf 2>/dev/null | xargs -I file cp -fa file $DIR/database

# compress postgres logs
if [ -d $PGSQL_ROOT/var/lib/pgsql/data/$PGLOGDIR ]; then

    PGSQL_LOGS_SIZE=$(du -s $PGSQL_ROOT/var/lib/pgsql/data/$PGLOGDIR | cut -d'/' -f1)
    if [ $PGSQL_LOGS_SIZE -gt $MAX_PGSQL_LOGS_SIZE ]; then
        echo "    * $PGSQL_ROOT/var/lib/pgsql/data/$PGLOGDIR exceeded the maximum size allowed. Please copy it separately."
        echo "PostgreSQL logs exceeded the maximum size of $MAX_PGSQL_LOGS_SIZE bytes" >> $DIR/database/warning
    else
        echo "    * copying logfiles"
        for pg_log in $(ls $PGSQL_ROOT/var/lib/pgsql/data/$PGLOGDIR/* 2>/dev/null); do
            cat $pg_log | gzip > $DIR/database/$(basename $pg_log).gz
        done
    fi
fi

if [ -d /var/log/spacewalk/schema-upgrade ] ; then
	echo "    * copying schema upgrade logs"
	mkdir -p $DIR/schema-upgrade-logs
	cp -pr /var/log/spacewalk/schema-upgrade/* $DIR/schema-upgrade-logs
fi

if [ "$(spacewalk-cfg-get db_backend)" = "postgresql" ] ; then
    echo "    * copying Postgresql procedures information"
    echo "select proname, prosrc from pg_catalog.pg_proc;" | /usr/bin/spacewalk-sql --select-mode - &> $DIR/database/pg_catalog.pg_proc.log
fi

if [ -f /var/log/audit/audit.log ] ; then
	echo "    * copying audit.log"
	mkdir -p $DIR/audit-log
	cp -fa /var/log/audit/audit.log $DIR/audit-log
fi

if [ -d /var/log/rhn/tasko/sat ] ; then
	echo "    * copying tasko/sat"
	cp -fa /var/log/rhn/tasko/sat $DIR/tasko
fi

if [ $IS_SUSE -eq 1 ]; then
    if [ -d "/var/lib/spacewalk/scc/scc-data" ]; then
        echo  "    * copying SCC data"
        mkdir -p $DIR/sccdata
        IFS=$(echo -en "\n\b")
        for i in $(ls -A /var/lib/spacewalk/scc/scc-data); do
            cp -fa /var/lib/spacewalk/scc/scc-data/$i $DIR/sccdata/
        done
    fi

    if [ -x /usr/bin/spacewalk-report ] && [ $NO_REPORTS -eq 0 ]; then
        # get some inventory info
        echo "    * running spacewalk-report to create reports."
        /usr/bin/spacewalk-report inventory > $DIR/inventory-report.csv
        /usr/bin/spacewalk-report channels > $DIR/channels-report.csv
        /usr/bin/spacewalk-report activation-keys > $DIR/activation-keys-report.csv
    fi

    ls -laR /srv/www/htdocs/pub > $DIR/ls-laR-htdocs
fi

echo "    * timestamping"
echo "Spacewalk debug created on $(date)" > $DIR/timestamp

# Skip if MAX_LOG_AGE is not a number
if [ "$MAX_LOG_AGE" -eq "$MAX_LOG_AGE" 2>/dev/null ]; then
    # Remove all logs older than MAX_LOG_AGE to reduce the size of the tarball
    find $DIR/* -regextype sed \( -iregex ".*log\.[0-9]\{1,\}.*" -or -iregex ".*[0-9]\{8\}.*" \
        -or -iregex ".*[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\(\.\|_[0-9]\{6\}\(_sync\)\?\.\).*" \) \
        -daystart -mtime +"$MAX_LOG_AGE" -not -ipath "*schema*" -delete

        # tasko and .trc files need to be parsed separately to find old ones
        for dir in database/trc rhn-logs/rhn/tasko tasko/sat; do
            if [ -d $dir ]; then
                for file in $(find $DIR/$dir); do
                    if [ -f "$file" ]; then
                        if [ -n "$(find $file -daystart -mtime +$MAX_LOG_AGE)" ]; then
                            rm $file
                        fi
                    fi
                done
            fi
        done
fi

# exclude private keys
find $DIR -name "*PRIVATE*" -delete
find $DIR -name "server.key*" -delete
find $DIR -name "server.pem*" -delete
find $DIR -name "rhn-org-httpd-ssl*" -delete

# fix permissions
chmod -R 700 $DIR

if [ $NO_COMPRESSION -eq 1 ] ; then
  echo
  echo "Debug dump created, stored in $DIR"
else
  echo "    * creating tarball (may take some time): $TARBALL"
  # set tarball premissions *before* writing data
  install -m 600 /dev/null $TARBALL
  tar -cjf $TARBALL \
      -C $(dirname $DIR) \
      $(basename $DIR)

  echo "    * removing temporary debug tree"
  rm -Rf echo $DIR
  echo "Debug dump created, stored in $TARBALL"
fi
070701000000F7000081B40000000000000000000000015FBBE8EE00000389000000000000000000000000000000000000003400000000spacewalk-backend/satellite_tools/spacewalk-debug.8   .\\" auto-generated by docbook2man-spec $Revision: 1.1 $
.TH "SPACEWALK-DEBUG" "8" "29 July 2009" "Version 3.6" ""
.SH NAME
spacewalk-debug \- Debug utility that packages log files and relevant debug information needed for full diagnosis of Spacewalk Server issues.
.SH SYNOPSIS
.sp
.nf
    
.sp
\fBspacewalk-debug\fR
.sp
.fi
.SH "DESCRIPTION"
.PP
The Spacewalk Diagnostic Info-Gathering Utility (\fBspacewalk-debug\fR) is a
debug utility that packages log files, and relevant debug information
needed for full diagnosis of Spacewalk Server issues.
.SH "OPTIONS"
.TP
\fB--help\fR
Display usage and exit.
.TP
\fB--dir\fR
Destination directory for the tar archive.
.SH "SEE ALSO"

db-control(1) - embedded database environment only!

rhn-charsets(8)

rhnpush(8)

rhn-schema-version(8)

rhn-ssl-dbstore(8)

satellite-sync(8)
.SH "AUTHORS"

Todd Warner <taw@redhat.com>

Pradeep Kilambi <pkilambi@redhat.com>
   070701000000F8000081B40000000000000000000000015FBBE8EE000008F2000000000000000000000000000000000000003700000000spacewalk-backend/satellite_tools/spacewalk-debug.sgml    <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [
<!ENTITY RHNSAT "Spacewalk Server" >
<!ENTITY RHNSATDEBUG "Spacewalk Diagnostic Info-Gathering Utility">

]>
<refentry>

<RefMeta>
<RefEntryTitle>spacewalk-debug</RefEntryTitle><manvolnum>8</manvolnum>
<RefMiscInfo>Version 3.6</RefMiscInfo>
</RefMeta>

<RefNameDiv>
<RefName><command>spacewalk-debug</command></RefName>
<RefPurpose>
Debug utility that packages log files and relevant debug information needed for full diagnosis of Spacewalk Server issues.
</RefPurpose>
</RefNameDiv>

<RefSynopsisDiv>
<Synopsis>
    <cmdsynopsis>
        <command>spacewalk-debug</command>
    </cmdsynopsis>
</Synopsis>
</RefSynopsisDiv>

<RefSect1><Title>Description</Title>

<para>
    The &RHNSATDEBUG; (<emphasis>spacewalk-debug</emphasis>) is a
    debug utility that packages log files, and relevant debug information
    needed for full diagnosis of &RHNSAT; issues.
</para>
<para>
    For a better understanding of the whole environment, spacewalk-debug
    put also an inventory report and a channel report into the tar archive.
</para>
</RefSect1>

<RefSect1><Title>Options</Title>
<variablelist>
    <varlistentry>
        <term>--help</term>
        <listitem>
            <para>Display usage and exit.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--dir</term>
        <listitem>
            <para>Destination directory for the tar archive.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--log-age</term>
        <listitem>
            <para>The maximum age for log files to get extracted.</para>
        </listitem>
    </varlistentry>
</variablelist>
</RefSect1>

<RefSect1><Title>See Also</Title>
<simplelist>
    <member>db-control(1) - embedded database environment only!</member>
    <member>rhn-charsets(8)</member>
    <member>rhnpush(8)</member>
    <member>rhn-schema-version(8)</member>
    <member>rhn-ssl-dbstore(8)</member>
    <member>satellite-sync(8)</member>
    <member>spacewalk-report(8)</member>
</simplelist>
</RefSect1>

<RefSect1><Title>Authors</Title>
<simplelist>
    <member>Todd Warner <email>taw@redhat.com</email></member>
    <member>Pradeep Kilambi <email>pkilambi@redhat.com</email></member>
</simplelist>
</RefSect1>
</RefEntry>
  070701000000F9000081FD0000000000000000000000015FBBE8EE00001096000000000000000000000000000000000000003600000000spacewalk-backend/satellite_tools/spacewalk-diskcheck #!/bin/bash

systemctl status spacewalk.target > /dev/null 2>&1
if [ $? != 0 ]; then
    logger  "SPACECHECK: spacewalk services are not running - skipping disk check."
    exit 0
fi

EMAIL_ADDRESS=`grep ^[[:blank:]]*traceback_mail /etc/rhn/rhn.conf | sed -e "s/.*=[[:blank:]]*//"`
SPACECHECKDIRS=`grep ^[[:blank:]]*spacecheck_dirs /etc/rhn/rhn.conf | sed -e "s/.*=[[:blank:]]*//"`
SPACECHECKALERT=`grep ^[[:blank:]]*spacecheck_free_alert /etc/rhn/rhn.conf | sed -e "s/.*=[[:blank:]]*//"`
SPACECHECKCRIT=`grep ^[[:blank:]]*spacecheck_free_critical /etc/rhn/rhn.conf | sed -e "s/.*=[[:blank:]]*//"`
SPACECHECKSHUTDOWN=`grep ^[[:blank:]]*spacecheck_shutdown /etc/rhn/rhn.conf | sed -e "s/.*=[[:blank:]]*//"`

if [ "x$EMAIL_ADDRESS" = "x" ]; then
    EMAIL_ADDRESS="root@localhost"
fi
if [ "x$SPACECHECKDIRS" = "x" ]; then
    SPACECHECKDIRS="/var/lib/pgsql /var/spacewalk /var/cache /srv"
fi
if [ "x$SPACECHECKALERT" = "x" ] || [ "$SPACECHECKALERT" -gt 90 ]; then
    SPACECHECKALERT=10
fi
if [ "x$SPACECHECKCRIT" = "x" ] || [ "$SPACECHECKCRIT" -ge "$SPACECHECKALERT" ]; then
    SPACECHECKCRIT=$(($SPACECHECKALERT / 2))
fi
if [ "x$SPACECHECKSHUTDOWN" = "x" ]; then
    SPACECHECKSHUTDOWN="true"
fi

STOPCHECK=0

for DIR in $SPACECHECKDIRS
do
    if [ ! -d $DIR ]; then
        logger "SPACECHECK: Directory $DIR does not exist!"
        echo "SPACECHECK: Directory $DIR does not exist!" | mail -Ssendwait -s "SPACECHECK: Directory $DIR does not exist!" $EMAIL_ADDRESS
        continue
    fi
    USEDSPACE=`df -PH $DIR | tail -1 | awk '{print $5}' | sed -e"s/\%//"`
    FREESPACE=$((100 - $USEDSPACE))
    if [ $FREESPACE -lt $SPACECHECKCRIT ] && [ "$STOPCHECK" = "0" ]; then
        if [ "$SPACECHECKSHUTDOWN" = "true" ]; then
            logger "SPACECHECK CRITICAL: Less than $SPACECHECKCRIT% of space available on $DIR - shutting down!"
            cat << EOF | mail -Ssendwait -s "SPACECHECK CRITICAL: Less than $SPACECHECKCRIT% of space available on $DIR" $EMAIL_ADDRESS
WARNING!
Available space on $DIR is less than $SPACECHECKCRIT%.
Some services have been shut down to avoid running out of disk space.
EOF
        else
            logger "SPACECHECK CRITICAL: Less than $SPACECHECKCRIT% of space available on $DIR - NOT shutting down!"
            cat << EOF | mail -Ssendwait -s "SPACECHECK CRITICAL: Less than $SPACECHECKCRIT% of space available on $DIR" $EMAIL_ADDRESS
WARNING!
Available space on $DIR is less than $SPACECHECKCRIT%.
Automatic shutdown of services is disabled.
You must shut down services to avoid running out of disk space.
EOF
        fi
        STOPCHECK=1
        break
    elif [ $FREESPACE -lt $SPACECHECKALERT ] && [ "$STOPCHECK" = "0" ]; then
        logger "SPACECHECK ALERT: Less than $SPACECHECKALERT% of space available on $DIR"
        cat << EOF | mail -Ssendwait -s "SPACECHECK ALERT: Less than $SPACECHECKALERT% of space available on $DIR" $EMAIL_ADDRESS
IMPORTANT

If you run out of disk space, SUSE Manager will stop running, and this could lead to a loss of data.
To avoid this, when the available space on $DIR drops below $SPACECHECKCRIT%, SUSE Manager will shut
down services automatically.

You can adjust when this happens by editing the values in the /etc/rhn/rhn.conf configuration file.
Changes will happen immediately, without restarting services.

==========================================================================================================
# The directories to monitor for available space. Separate multiple directories with a space:
spacecheck_dirs = $SPACECHECKDIRS

# A warning email is triggered when free space in a monitored directory reaches this level (as a percentage):
spacecheck_free_alert = $SPACECHECKALERT

# A critical alert is triggered when free space in a monitored directory reaches this level (as a percentage):
spacecheck_free_critical = $SPACECHECKCRIT

# Allow spacewalk services to be automatically shut down when free space reaches critical level:
spacecheck_shutdown = $SPACECHECKSHUTDOWN
==========================================================================================================
EOF
    fi
done

if [ "$STOPCHECK" = "1" ] && [ "$SPACECHECKSHUTDOWN" = "true" ]; then
    spacewalk-service stop ; systemctl stop postgresql.service
fi
  070701000000FA000081B40000000000000000000000015FBBE8EE00000093000000000000000000000000000000000000003E00000000spacewalk-backend/satellite_tools/spacewalk-diskcheck.service [Unit]
Description=Check available disk space on vital filesystems

[Service]
Type=oneshot
KillMode=process
ExecStart=/usr/bin/spacewalk-diskcheck
 070701000000FB000081B40000000000000000000000015FBBE8EE00000081000000000000000000000000000000000000003C00000000spacewalk-backend/satellite_tools/spacewalk-diskcheck.timer   [Unit]
Description=Check available disk space on vital filesystems

[Timer]
OnCalendar=hourly

[Install]
WantedBy=timers.target

   070701000000FC000081FD0000000000000000000000015FBBE8EE00000696000000000000000000000000000000000000003F00000000spacewalk-backend/satellite_tools/spacewalk-extra-http-headers    #!/usr/bin/env python

import sys
import os
import re
import traceback
import configparser

try:
    from urllib import unquote
except:
    from urllib.parse import unquote

from zypp_plugin import Plugin

REPOSYNC_EXTRA_HTTP_HEADERS_CONF = '/etc/rhn/spacewalk-repo-sync/extra_headers.conf'


class SpacewalkExtraHTTPHeaders(Plugin):
    """
    Plugin to add extra HTTP Headers to Zypper requests
    """
    def RESOLVEURL(self, headers, body):
        """
        Resolve URL.

        :returns: None
        """
        try:
            self.http_headers = {}
            # Get extra HTTP headers configuration from /etc/rhn/spacewalk-repo-sync/extra_headers.conf
            if os.path.isfile(REPOSYNC_EXTRA_HTTP_HEADERS_CONF):
                http_headers_cfg = configparser.ConfigParser()
                http_headers_cfg.read_file(open(REPOSYNC_EXTRA_HTTP_HEADERS_CONF))
                section_name = None

                if http_headers_cfg.has_section(headers['repo_name']):
                    section_name = headers['repo_name']
                elif http_headers_cfg.has_section(headers['channel_label']):
                    section_name = headers['channel_label']
                elif http_headers_cfg.has_section('main'):
                    section_name = 'main'

                if section_name:
                    for hdr in http_headers_cfg[section_name]:
                        self.http_headers[hdr] = http_headers_cfg.get(section_name, option=hdr)

        except Exception as exc:
            self.answer("ERROR", {}, str(exc))
        self.answer("RESOLVEDURL", self.http_headers, unquote(headers['url']))

plugin = SpacewalkExtraHTTPHeaders()
plugin.main()
  070701000000FD000081FD0000000000000000000000015FBBE8EE00002772000000000000000000000000000000000000003600000000spacewalk-backend/satellite_tools/spacewalk-fips-tool #!/usr/bin/python
#
# Copyright (c) 2014--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import csv
import getpass
from optparse import OptionParser
from uyuni.common import rhn_rpm
import sys
import time
try:
    #  python2
    import xmlrpclib
except ImportError:
    #  python3
    import xmlrpc.client as xmlrpclib # pylint: disable=F0401
from socket import gethostname


def parse_args():
    parser = OptionParser()
    parser.set_usage("spacewalk-fips-tool -i|-c [options] systemid01 [systemid02 ...]")
    parser.add_option("-i", action="store_true", dest="install_packages", default=False,
                      help="schedule installation of packages required for certificate update")
    parser.add_option("-c", action="store_true", dest="update_certificates", default=False,
                      help="schedule update of client certificates for specified systems")
    parser.add_option("-u", action="store", type="string", dest="username",
                      help="username (organizational administrator)")
    parser.add_option("-p", action="store", type="string", dest="password",
                      help="password")
    parser.add_option("-s", action="store", type="string", dest="hostname",
                      help="server hostname to use, defaults to local hostname",
                      default=gethostname())
    parser.add_option("-d", action="store", type="string", dest="date",
                      help="date to schedule the conversion for, defaults to now, " +
                           "format: %Y-%m-%d %H:%M:%S (e.g. 2014-10-30 19:30:00)")
    parser.add_option("-o", action="store", type="string", dest="output",
                      help="output file in csv format to store the details about all " +
                           "scheduled actions, use '-' for stdout")

    return parser.parse_args()


def read_username():
    tty = open("/dev/tty", "r+")
    tty.write('Username: ')
    tty.close()

    try:
        username = sys.stdin.readline().rstrip('\n')
    except KeyboardInterrupt:
        print()
        sys.exit(0)
    if username is None:
        # EOF
        print()
        sys.exit(0)
    return username.strip()


strftime_format = "%Y-%m-%d %H:%M:%S"

description = """
spacewalk-fips-tool is a helper script aiming to help in the process
of converting certificates of registered systems from using MD5
digest to certificates with a SHA-256 digest.

SHA-256 client certificate on your registered systems is required for your
Spacewalk / Red Hat Satellite to be able to operate in FIPS mode.

The certificate conversion is a two-step process:
1. installation of 'spacewalk-client-cert' package on given systems, which is
   required for the certificate conversion
2. after the package installation finishes successfully, a certificate update
   for given systems can be scheduled

You need to specify one or more system ids for which you want to schedule
the package installation and certificate conversion. The list of system ids
potentially requiring certificate update can be retrieved for example from
system-md5-certificates report.

Please use the --help option or consult the tool's manual page for full usage
information.
"""

broken_systems_msg01 = """
The following systems do not have 'spacewalk-client-cert' package installed,
nor can the package be installed on those systems:

"""

broken_systems_msg02 = """
The following systems do not have 'spacewalk-client-cert' package installed:

"""

broken_systems_msg03 = """
The package installation process cannot continue.

For these systems, you need to either:
  1. Install the package manually
  2. Subscribe the systems to correct channels and re-run this tool
  3. Re-run this tool without the problematic system ids

"""

broken_systems_msg04 = """
The certificate conversion process cannot continue. Please re-run this tool
with -i (package installation) option.
"""

if __name__ == '__main__':
    (options, args) = parse_args()

    if len(args) == 0:
        print(description)
        sys.exit(1)

    if not options.install_packages and not options.update_certificates:
        sys.stderr.write("You need to specifiy either -i or -c switch.\n")
        sys.exit(1)

    if options.install_packages and options.update_certificates:
        sys.stderr.write("-i and -c switches are mutually exclusive.\n")
        sys.exit(1)

    if not options.output:
        sys.stderr.write("You need to specify CSV output file\n")
        sys.exit(1)

    if not options.username:
        options.username = read_username()

    if not options.password:
        options.password = getpass.getpass()

    if not options.date:
        options.date = time.strftime(strftime_format)

    scheduled_date = None
    try:
        scheduled_date = xmlrpclib.DateTime(time.strptime(options.date, strftime_format))
    except ValueError as e:
        sys.stderr.write("Error processing the specified date: %s\n" % e)
        sys.exit(1)

    if len(args) == 0:
        sys.stderr.write("You need to specify at least one system id\n")
        sys.exit(1)

    (client, key) = (None, None)
    client = xmlrpclib.Server("https://%s/rpc/api" % options.hostname, verbose=0)

    try:
        key = client.auth.login(options.username, options.password)
    except xmlrpclib.Fault as e:
        if hasattr(e, "faultCode") and e.faultCode == 2950:
            sys.stderr.write("Incorrect user name or password\n")
            sys.exit(1)
        else:
            raise

    systems = [int(i) for i in args]
    systems.sort()

    scc_pkg = 'spacewalk-client-cert'
    broken_systems = systems[:]

    installed_packages = {}
    try:
        for system_id in systems:
            for package in client.system.list_packages(key, system_id):
                if package['name'] == scc_pkg:
                    installed_packages[system_id] = package
                    # Systems which already have spacewalk-client-cert installed are not broken
                    broken_systems.remove(system_id)
                    break
    except xmlrpclib.Fault as e:
        sys.stderr.write(e.faultString + '\n')
        sys.exit(1)

    latest_available_packages = client.system.list_latest_available_package(key, systems, scc_pkg)

    for i in latest_available_packages:
        # Systems which can install / update spacewalk-client-cert are not broken
        if i['id'] in broken_systems:
            broken_systems.remove(i['id'])

        if i['id'] in installed_packages:

            if installed_packages[i['id']]['epoch'] == ' ':
                installed_packages[i['id']]['epoch'] = ''

            # What's installed matches or is more recent than what's available
            if rhn_rpm.hdrLabelCompare(i['package'], installed_packages[i['id']]) <= 0:
                latest_available_packages.remove(i)

    if len(broken_systems) > 0:
        if options.install_packages:
            sys.stderr.write(broken_systems_msg01)
        elif options.update_certificates:
            sys.stderr.write(broken_systems_msg02)

        for system_id in broken_systems:
            sys.stderr.write("\t%s\n" % system_id)

        if options.install_packages:
            sys.stderr.write(broken_systems_msg03)
        elif options.update_certificates:
            sys.stderr.write(broken_systems_msg04)

        sys.exit(1)

    (csv_writer, csv_file) = (None, None)

    if options.output == '-':
        csv_file = sys.stdout
    else:
        csv_file = open(options.output, "w+")

    csv_writer = csv.writer(csv_file, lineterminator="\n")
    csv_writer.writerow(['action_id', 'system_id', 'action_description', 'scheduled_date'])

    # Install / update spacewalk-client-cert on the selected systems
    if options.install_packages:
        for i in latest_available_packages:
            pkg = i['package']
            action_id = client.system.schedule_package_install(key,
                                                               i['id'],            # system id
                                                               pkg['id'],          # package id
                                                               scheduled_date)     # earliest date

            pkg_string = None
            if pkg['epoch']:
                pkg_string = "%s-%s:%s-%s.%s" % (pkg['name'], pkg['epoch'], pkg['version'],
                                                 pkg['release'], pkg['arch'])
            else:
                pkg_string = "%s-%s-%s.%s" % (pkg['name'], pkg['version'],
                                              pkg['release'], pkg['arch'])

            csv_writer.writerow([action_id,
                                 i['id'],
                                 "Installation of %s package on system %s" % (pkg_string, i['id']),
                                 options.date])

    # Schedule the certificate update
    if options.update_certificates:
        for system_id in systems:
            try:
                action_id = client.system.schedule_certificate_update(key, system_id, scheduled_date)
            except xmlrpclib.Fault as e:
                sys.stderr.write("Error scheduling certificate update on %s: %s\n" %
                                 (system_id, e.faultString))
                sys.exit(1)
            # write the actions to csv
            csv_writer.writerow([action_id,
                                 system_id,
                                 "Certificate update on %s" % system_id,
                                 options.date])

    if options.output != "-":
        csv_file.close()
  070701000000FE000081B40000000000000000000000015FBBE8EE0000182A000000000000000000000000000000000000003B00000000spacewalk-backend/satellite_tools/spacewalk-fips-tool.sgml    <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [
<!ENTITY RHNSAT "Spacewalk Server">

]>
<refentry>

<RefMeta>
<RefEntryTitle>spacewalk-fips-tool</RefEntryTitle><manvolnum>8</manvolnum>
</RefMeta>

<RefNameDiv>
<RefName><command>spacewalk-fips-tool</command></RefName>
<RefPurpose>
A tool to help in the process of converting certificates of registered
 systems from using MD5 digest to certificates with SHA-256 digest.
</RefPurpose>
</RefNameDiv>

<RefSynopsisDiv>
<Synopsis>
    <cmdsynopsis>
        <command>spacewalk-fips-tool</command>
        <arg choice="req">-i|-c</arg>
        <arg choice="req">-o output.csv</arg>
        <arg choice="opt">options</arg>
        <arg choice="req">systemid01 systemid02 <replaceable>...</replaceable></arg>
    </cmdsynopsis>
</Synopsis>
</RefSynopsisDiv>

<RefSect1><Title>Description</Title>
    <para>
        <emphasis>spacewalk-fips-tool</emphasis> is a helper script aiming to
        help in the process of converting certificates of registered systems
        from using MD5 digest to SHA-256 digest.
    </para>
    <para>
	Ordinarily, conversion of client certificates of your registered systems
        from MD5 digest to SHA-256 is not required.
    </para>
    <para>
        Updating the digest of client certificates is needed if you plan to
        run your &RHNSAT; in FIPS mode, which does not allow MD5 algorithm
        for authentication.
    </para>
    <para>
        Client certificate conversion is a two step process:
        <simplelist>
            <member>
                1. Installation of <emphasis>spacewalk-client-cert</emphasis> package
                on given client systems (<emphasis>-i</emphasis> command line option).
                This package implements client side logic (action) allowing to download
                and update client certificate.
            </member>
            <member>
                2. Once <emphasis>spacewalk-client-cert</emphasis> packages are successfully
                installed on client systems, certificate update for the given systems
                can be scheduled (<emphasis>-c</emphasis> command line option).
            </member>
        </simplelist>
    </para>
    <para>
        Both the package installation and certificate update are client side actions, which
        will be picked up and executed by <emphasis>rhn_check</emphasis> utility on
        the specified systems.
    </para>
    <para>
        The tool uses &RHNSAT; XML-RPC API to schedule both the package installations and
        certificate updates. Therefore, the tool requires user credentials able to
        perform both types of actions, ideally an organization administrator.
    </para>
    <para>
        For tracking purposes, all successfully scheduled client side actions are recorded
        in a file in CSV format (-o command line option).
    </para>
    <para>
        The tool requires several mandatory command line options to operate:
        <simplelist>
            <member>
                * Action to schedule: installation (-i option) or certificate update (-c option).
            </member>
            <member>
                * Output CSV (-o option).
            </member>
            <member>
                * List of system identifiers to schedule the given action for.
            </member>
        </simplelist>
    </para>
    <para>
        List of systems currently using MD5 certificate can be easily obtained with
        <emphasis>spacewalk-report</emphasis> tool:
    </para>
    <para>
        <command>$ spacewalk-report system-md5-certificates > systems-md5.csv</command>
    </para>
</RefSect1>

<RefSect1><Title>Options</Title>
<variablelist>
    <varlistentry>
        <term>-h, --help</term>
        <listitem>
            <para>Display usage message and exit.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-i</term>
        <listitem>
            <para>
                Schedule installation of <emphasis>spacewalk-client-cert</emphasis> package.
            </para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-c</term>
        <listitem>
            <para>
                Schedule update of client certificates.
            </para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-o <replaceable>output.csv</replaceable></term>
        <listitem>
            <para>
                The output file in CSV format to record the details of scheduled actions in.
            </para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-u <replaceable>username</replaceable></term>
        <listitem>
            <para>
                User name to use for scheduling the actions. If not specified, will be prompted for.
            </para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-p <replaceable>password</replaceable></term>
        <listitem>
            <para>
                Password for the user name. If not specified, will be prompted for.
            </para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-s <replaceable>hostname</replaceable></term>
        <listitem>
            <para>
                Hostname of your &RHNSAT;, local hostname by default.
            </para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-d <replaceable>date</replaceable></term>
        <listitem>
            <para>
                Date in %Y-%m-%d %H-%M-%S format (e.g. 2014-10-30 19:35:00) to schedule the given
                actions for. Defaults to "now".
            </para>
        </listitem>
    </varlistentry>


</variablelist>
</RefSect1>


<RefSect1><Title>Files</Title>
<simplelist>
    <member><emphasis>/etc/sysconfig/rhn/systemid</emphasis> - client side certificate</member>
</simplelist>
</RefSect1>

<RefSect1><Title>See Also</Title>
<simplelist>
    <member>spacewalk-report(8)</member>
    <member>rhn_check(8)</member>
</simplelist>
</RefSect1>

<RefSect1><Title>Authors</Title>
<simplelist>
    <member>Milan Zazrivec <email>mzazrivec@redhat.com</email></member>
</simplelist>
</RefSect1>
</RefEntry>
  070701000000FF000081FD0000000000000000000000015FBBE8EE0000216A000000000000000000000000000000000000003B00000000spacewalk-backend/satellite_tools/spacewalk-remove-channel    #!/usr/bin/python
#
# Module that removes channels from an installed satellite
#
#
# Copyright (c) 2008--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import sys
import os
import fnmatch
import getpass
from optparse import Option, OptionParser

# quick check to see if you are a super-user.
if os.getuid() != 0:
    sys.stderr.write('ERROR: must be root to execute\n')
    sys.exit(8)

try:
    from rhn import rhnLockfile  # new place for rhnLockfile
except:
    from spacewalk.common import rhnLockfile  # old place for rhnLockfile

from spacewalk.common.rhnLog import initLOG
from spacewalk.common.rhnConfig import initCFG
from spacewalk.server import rhnSQL

from spacewalk.satellite_tools.contentRemove import __listChannels, __serverCheck, \
    __kickstartCheck, delete_channels, UserError, __getMinionsByChannel, __applyChannelState, \
    __clonnedChannels

options_table = [
    Option("-v", "--verbose",       action="count",
           help="Increase verbosity"),
    Option("-l", "--list",          action="store_true",
           help="List defined channels and exit"),
    Option("-c", "--channel",       action="append", default=[],
           help="Delete this channel (can be present multiple times)"),
    Option("-a", "--channel-with-children",       action="append", default=[],
           help="Delete this channel and its child channels (can be present multiple times)"),
    Option("-u", "--unsubscribe",   action="store_true",
           help="Unsubscribe systems registered to the specified channels. Note: Credentials are needed in case of minions"),
    Option("--justdb",        action="store_true",
           help="Delete only from the database, do not remove files from disk"),
    Option("--force",         action="store_true",
           help="Remove the channel packages from any other channels too (Not Recommended)"),
    Option("-p", "--skip-packages", action="store_true",
           help="Do not remove package metadata or packages from the filesystem (Not Recommended)"),
    Option("--skip-kickstart-trees", action="store_true",
           help="Do not remove kickstart trees from the filesystem (Not Recommended)."),
    Option("--just-kickstart-trees", action="store_true",
           help="Remove only the kickstart trees for the channels specified."),
    Option("--skip-channels", action="store_true",
           help="Remove only packages from channel not the channel itself."),
    Option("--username", help="Username"),
    Option("--password", help="Password"),
]

LOCK = []
LOCK_DIR = '/var/run'


def main():

    global LOCK
    global options_table
    parser = OptionParser(option_list=options_table)

    (options, args) = parser.parse_args()

    if args:
        for arg in args:
            sys.stderr.write("Not a valid option ('%s'), try --help\n" % arg)
        sys.exit(-1)

    if not (options.channel or options.list or options.channel_with_children):
        sys.stderr.write("Nothing to do\n")
        sys.exit(0)

    if not options.list:
        for command in ['spacewalk-remove-channel', 'satellite-sync',
                        'spacewalk-repo-sync']:
            try:
                LOCK.append(rhnLockfile.Lockfile(
                    os.path.join(LOCK_DIR, "%s.pid" % command)))
            except rhnLockfile.LockfileLockedException:
                print("ERROR: An instance of %s is running, exiting." % command)
                sys.exit(-1)

    initCFG('server')
    initLOG("stdout", options.verbose or 0)

    rhnSQL.initDB()

    dict_label, dict_parents = __listChannels()
    if options.list:
        keys = list(dict_parents.keys())
        keys.sort()
        for c in keys:
            print(c)
            for sub in dict_parents[c]:
                print("\t" + sub)
        sys.exit(0)

    # Verify if the channel is valid
    base_channel = ""
    channels = {}
    for channel in options.channel:
        channels[channel] = None
        if channel in dict_parents:
            base_channel = channel

    for parent in options.channel_with_children:
        matchs = fnmatch.filter(dict_parents, parent)
        for parent in matchs:
            if parent in dict_parents:
                channels[parent] = None
                base_channel = parent
                for ch in dict_parents[parent]:
                    channels[ch] = None
        if not matchs:
            print("Unknown parent channel %s" % parent)
            sys.exit(-1)

    child_test_fail = False
    for channel in list(channels.keys()):
        if channel not in dict_label:
            print("Unknown channel %s" % channel)
            sys.exit(-1)
        if not options.skip_channels and not options.just_kickstart_trees:
            # Sanity check: verify subchannels are deleted as well if base
            # channels are selected
            if channel not in dict_parents:
                continue
            # this channel is a parent channel?
            children = []
            for subch in dict_parents[channel]:
                if subch not in channels:
                    child_test_fail = True
                    children.append(subch)
            if children:
                print("Error: cannot remove channel %s: subchannel(s) exist: " % (
                    channel))
                for child in children:
                    print("\t\t\t" + child)

    clone_test_fail = False
    for channel in list(channels.keys()):
        clones_not_deleted=[]
        for clone in __clonnedChannels(channel):
            # the clones channels will also be deleted?
            if clone not in channels:
                clone_test_fail = True
                clones_not_deleted.append(clone)
        if clones_not_deleted:
            print("Error: cannot remove channel %s: clone channel(s) exist: " % (
                channel))
            for clone_channel_error in clones_not_deleted:
                print("\t\t\t" + clone_channel_error)

    if child_test_fail or clone_test_fail:
        sys.exit(-1)
    if options.unsubscribe:
        if not options.username:
            raise UserError("Username not specified")
        if not options.password:
            options.password= getpass.getpass()
        affected_minions =  __getMinionsByChannel(list(channels.keys()))

    if not options.skip_channels and not options.just_kickstart_trees:
        if __serverCheck(list(channels.keys()), options.unsubscribe):
            sys.exit(-1)

        if __kickstartCheck(list(channels.keys())):
            sys.exit(-1)

    try:
        delete_channels(list(channels.keys()), force=options.force,
                                      justdb=options.justdb, skip_packages=options.skip_packages,
                                      skip_channels=options.skip_channels,
                                      skip_kickstart_trees=options.skip_kickstart_trees,
                                      just_kickstart_trees=options.just_kickstart_trees)
    except:
        rhnSQL.rollback()
        raise
    rhnSQL.commit()
    if options.unsubscribe:
        __applyChannelState(affected_minions, options.username, options.password)
    releaseLOCK()
    return 0


def releaseLOCK():
    global LOCK
    for lock in LOCK:
        lock.release()

def systemExit(code, msgs=None):
    if msgs:
        if type(msgs) not in [type([]), type(())]:
            msgs = (msgs, )
        for msg in msgs:
            sys.stderr.write(str(msg) + '\n')
    sys.exit(code)

if __name__ == '__main__':
    try:
        sys.exit(main() or 0)
    except KeyboardInterrupt:
        sys.stderr.write("\nUser interrupted process.\n")
        releaseLOCK()
        sys.exit(0)
    except UserError as error:
        systemExit(-1, "\n%s" % error)
    except SystemExit:
        # Normal exit
        raise
    except Exception:
        e = sys.exc_info()[1]
        releaseLOCK()
        sys.stderr.write("\nERROR: unhandled exception occurred: (%s).\n" % e)
        import traceback
        traceback.print_exc()
        sys.exit(-1)
  07070100000100000081B40000000000000000000000015FBBE8EE00001512000000000000000000000000000000000000004000000000spacewalk-backend/satellite_tools/spacewalk-remove-channel.sgml   <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V3.1//EN">
<refentry>

<RefMeta>
<RefEntryTitle>spacewalk-remove-channel</RefEntryTitle><manvolnum>8</manvolnum>
<RefMiscInfo>Version 3.5.0</RefMiscInfo>
</RefMeta>

<RefNameDiv>
<RefName><command>spacewalk-remove-channel</command></RefName>
<RefPurpose>
Removes a channel from a SUSE Manager server.
</RefPurpose>
</RefNameDiv>

<RefSynopsisDiv>
<Synopsis>
    <cmdsynopsis>
        <command>spacewalk-remove-channel</command>
        <arg>options <replaceable>...</replaceable></arg>
        <arg>-c<replaceable>CHANNEL_LABEL</replaceable></arg>
        <arg>-a<replaceable>PARENT_LABEL</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
         <arg>-c</arg> <arg>--channel</arg>
    </cmdsynopsis>
    <cmdsynopsis>
         <arg>-a</arg> <arg>--channel-with-children</arg>
    </cmdsynopsis>
    <cmdsynopsis>
         <arg>-u</arg> <arg>--unsubscribe</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-l</arg>
        <arg>--list</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--justdb</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-v</arg> <arg>--verbose</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--force</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-p</arg> <arg>--skip-packages</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--skip-kickstart-trees</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--just-kickstart-trees</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>--skip-channels</arg>
    </cmdsynopsis>
</Synopsis>
</RefSynopsisDiv>

<RefSect1><Title>Description</Title>
<para>
    The <emphasis>spacewalk-channel-remove</emphasis> completely removes
    channels from a SUSE Manager server.
</para>
<para>
    By default systems are not unsubscribed from the specified channel(s).  If systems
    are currently subcribed, they will be listed.  To unsubscribe these systems, simply
    use the --unsubscribe option.
</para>
</RefSect1>

<RefSect1><Title>Options</Title>
<variablelist>
    <varlistentry>
        <term>-h, --help</term>
        <listitem>
            <para>Display the help screen with a list of options.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-l, --list</term>
        <listitem>
            <para>List all channels on the satellite.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-u, --unsubscribe</term>
        <listitem>
            <para>Unsubscribe any systems subscribed to the specified channels.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--justdb</term>
        <listitem>
            <para>Don't remove any files from the file system.  Instead only delete metadata from the database.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-c<replaceable>CHANNEL</replaceable>, --channel=<replaceable>CHANNEL</replaceable></term>
        <listitem>
            <para>Delete the channel with the specified label.  May be used multiple times to specify multiple channels.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-a<replaceable>PARENT</replaceable>, --channel-with-children=<replaceable>PARENT</replaceable></term>
        <listitem>
            <para>Delete the channel with the specified label and its child channels.  May be used multiple times to specify multiple parent channels.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--force</term>
        <listitem>
            <para>Delete packages from the satellite even if the package is in more channels than what is specified. (Not Recommended)</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-p, --skip-packages</term>
        <listitem>
            <para>Do not remove the package metadata or the files from the filesystem. (Not Recommended)</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--skip-kickstart-trees</term>
        <listitem>
            <para>Do not remove kickstart trees from the filesystem.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--just-kickstart-trees</term>
        <listitem>
            <para>Remove only the kickstart trees for the channels specified from the database and the filesystem. This option can be used only in combination with --skip-kickstart-trees. Any other options will be discarded.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--skip-channels</term>
        <listitem>
            <para>Remove only packages from channel not the channel itself.</para>
        </listitem>
    </varlistentry>
</variablelist>
</RefSect1>

<RefSect1><Title>Examples</Title>
<simplelist>
        <member><command>spacewalk-remove-channel --list</command></member>
        <member><command>spacewalk-remove-channel --channel=rhel-i386-as-3</command></member>
        <member><command>spacewalk-remove-channel --channel-with-children=rhel-i386-as-3</command></member>
</simplelist>
</RefSect1>

<RefSect1><Title>Authors</Title>
<simplelist>
    <member>Todd Warner <email>taw@redhat.com</email></member>
    <member>Mihai Ibanescu <email>misa@redhat.com</email></member>
    <member>Justin Sherrill <email>jsherril@redhat.com</email></member>
</simplelist>
</RefSect1>
</RefEntry>

<!--
vim: sw=4
-->
  07070100000101000081FD0000000000000000000000015FBBE8EE00002FA3000000000000000000000000000000000000003600000000spacewalk-backend/satellite_tools/spacewalk-repo-sync #!/usr/bin/python -u
#
# Copyright (c) 2008--2017 Red Hat, Inc.
# Copyright (c) 2011 SUSE LLC
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import re
try:
    #  python2
    import StringIO as StringIO
except ImportError:
    #  python3
    import io as StringIO
import simplejson as json
import shutil
import sys
import os
from optparse import OptionParser
import datetime

from spacewalk.satellite_tools.syncLib import initEMAIL_LOG

LOCK = None

log_path = '/var/log/rhn/reposync.log'


def systemExit(code, msg=None):
    "Exit with a code and optional message(s). Saved a few lines of code."
    sys.stderr.write(str(msg)+'\n')
    sys.exit(code)

try:
    from rhn import rhnLockfile
    from spacewalk.common import rhnLog
    from spacewalk.common.rhnConfig import CFG, initCFG
    from spacewalk.satellite_tools import reposync
    from spacewalk.satellite_tools.syncLib import log, log2disk
except KeyboardInterrupt:
    systemExit(0, "\nUser interrupted process.")
except ImportError:
    systemExit(1, "Unable to find code tree.\n"
               "Path not correct? " + str(sys.path))


def releaseLOCK():
    global LOCK
    if LOCK:
        LOCK.release()
        LOCK = None


def main():

    # quick check to see if you are a super-user.
    if os.getuid() != 0:
        systemExit(8, 'ERROR: must be root to execute.')

    global LOCK
    try:
        LOCK = rhnLockfile.Lockfile('/var/run/spacewalk-repo-sync.pid')
    except rhnLockfile.LockfileLockedException:
        systemExit(1, "ERROR: attempting to run more than one instance of "
                      "spacewalk-repo-sync Exiting.")

    parser = OptionParser()
    parser.add_option('-l', '--list', action='store_true', dest='list',
                      help='List the custom channels with the associated repositories.')
    parser.add_option('-s', '--show-packages', action='store_true', dest='show_packages',
                      help='List all packages in a specified channel.')
    parser.add_option('-u', '--url', action='append', dest='url',
                      default=[], help='The url of the repository. Can be used multiple times.')
    parser.add_option('-c', '--channel', action='append',
                      dest='channel_label',
                      help='The label of the channel to sync packages to. Can be used multiple times.')
    parser.add_option('-p', '--parent-channel', action='append',
                      dest='parent_label', default=[],
                      help='Synchronize the parent channel and all its child channels.')
    parser.add_option('-d', '--dry-run', action='store_true',
                      dest='dry_run',
                      help='Test run. No sync takes place.')
    parser.add_option('--latest', action='store_true',
                      dest='latest',
                      help='Sync latest packages only. Use carefully - you might need to fix some dependencies on your own.')
    parser.add_option('-g', '--config', action='store', dest='config',
               help='Configuration file')
    parser.add_option('-t', '--type', action='store', dest='repo_type',
                      help='Force type of repository ("yum", "uln" and "deb" are supported)')
    parser.add_option('-f', '--fail', action='store_true', dest='fail',
                      default=False,
                      help="If a package import fails, fail the entire operation")
    parser.add_option('-n', '--non-interactive', action='store_true',
                      dest='noninteractive', default=False,
                      help="Do not ask anything, use default answers")
    parser.add_option('-i', '--include', action='callback',
                      callback=reposync.set_filter_opt, type='str', nargs=1,
                      dest='filters', default=[],
                      help="Comma or space separated list of included packages or package groups.")
    parser.add_option('-e', '--exclude', action='callback',
                      callback=reposync.set_filter_opt,
                      type='str', nargs=1, dest='filters', default=[],
                      help="Comma or space separated list of excluded packages or package groups.")
    parser.add_option('', '--email', action="store_true", help="e-mail a report of what was synced/imported")
    parser.add_option('', '--traceback-mail', action="store",
                      help="alternative email address(es) for sync output (--email option)")
    parser.add_option('', '--no-errata', action='store_true', dest='no_errata',
                      default=False, help="Do not sync errata")
    parser.add_option('', '--no-packages', action='store_true', dest='no_packages',
                      default=False, help="Do not sync packages")
    parser.add_option('', '--sync-kickstart', action='store_true', dest='sync_kickstart',
                      default=False, help="Sync kickstartable tree")
    parser.add_option('', '--force-all-errata', action='store_true', dest='force_all_errata',
                      default=False, help="Process metadata of all errata, not only missing.")
    parser.add_option('', '--batch-size', action='store', help="max. batch size for package import (debug only)")
    parser.add_option('-Y', '--deep-verify', action='store_true',
                      dest='deep_verify', default=False,
                      help='Do not use cached package checksums')
    parser.add_option('-v', '--verbose', action='count',
                      help="Verbose output. Possible to accumulate: -vvv")
    (options, args) = parser.parse_args()

    log_level = options.verbose
    if log_level is None:
        log_level = 0

    initCFG('server.satellite')
    CFG.set('DEBUG', log_level)
    CFG.set("TRACEBACK_MAIL", options.traceback_mail or CFG.TRACEBACK_MAIL)
    if options.email:
        initEMAIL_LOG()
    rhnLog.initLOG(log_path, log_level)
    log2disk(0, "Command: %s" % str(sys.argv))

    l_params=["no_errata", "sync_kickstart", "fail"]
    d_chan_repo=reposync.getChannelRepo()
    l_ch_custom=reposync.getCustomChannels()
    d_parent_child=reposync.getParentsChilds()
    d_ch_repo_sync={}
    l_no_ch_repo_sync=[]

    if options.list:
        log(0, "======================================")
        log(0, "|   Channel Label   |   Repository   |")
        log(0, "======================================")
        for ch in list(set(l_ch_custom) & set(d_chan_repo)):
            for repo in d_chan_repo[ch]:
                log(0, "%s | %s" %(ch,repo))
        for ch in list(set(l_ch_custom)-set(d_chan_repo)):
            log(0, "%s | No repository set" % ch)
        return 0

    if not options.channel_label and not options.parent_label and not options.config:
        systemExit(1, "--channel, --parent-channel or --config must be specifed.")

    if options.config:
        try:
            config_file = open(options.config).read()
            # strip  all whitespace
            config_file = re.sub(r'\s', '', config_file)
            config = json.load(StringIO.StringIO(config_file))

        except Exception as e:
            systemExit(1, "Configuration file is invalid, please check syntax. Error [%s]" % e )

        for key in l_params:
            if key in config and not getattr(options, key):
                setattr(options, key, config[key])

        # Channels
        if 'channel' in config:
            for ch,repo in config['channel'].items():
                 if not isinstance(repo, list):
                    systemExit(
                        1,
                        "Configuration file is invalid, "
                        "{0}'s value needs to be a list.".format(ch)
                    )
                 d_ch_repo_sync[ch]=repo

        if 'parent_channel' in config:
            options.parent_label+=config['parent_channel']

    if options.channel_label and len(options.channel_label)>0:
        for channel in options.channel_label:
            d_ch_repo_sync[channel]=options.url

    if options.parent_label:
        for pch in options.parent_label:
            if pch in d_parent_child:
               for ch in [pch]+d_parent_child[pch]:
                    if ch in l_ch_custom and ch not in d_ch_repo_sync:
                        d_ch_repo_sync[ch]=[]
            else:
                systemExit(1, "Channel %s is not custom base channel." % pch)

    for ch in d_ch_repo_sync:
        if ch not in l_ch_custom:
            systemExit(1, "Channel %s is not custom or does not exist." % ch)
        if not d_ch_repo_sync[ch] and not ch in d_chan_repo:
            log(0, "Channel %s Channel has no URL associated, skipping sync" % ch)
            l_no_ch_repo_sync.append(ch)

    for ch in l_no_ch_repo_sync:
        del d_ch_repo_sync[ch]

    if options.dry_run:
        log(0, "======================================")
        log(0, "|   Channel Label   |   Repository   |")
        log(0, "======================================")

        for ch,repo in list(d_ch_repo_sync.items()):
            if repo:
                log(0, " %s : %s" % (ch,", ".join(repo)))
            else:
                log(0, " %s : %s" % (ch,", ".join(d_chan_repo[ch])))

        log(0, "======================================")
        log(0, "|             Parameters             |")
        log(0, "======================================")
        for key in  l_params:
            log(0, " %s: %s" % (key,str(getattr(options, key))))
        return 0

    if options.batch_size:
        try:
            batch_size = int(options.batch_size)
            if batch_size <= 0:
                raise ValueError()
        except ValueError:
            systemExit(1, "Invalid batch size: %s" % options.batch_size)

    reposync.clear_ssl_cache()

    total_time = datetime.timedelta()
    ret_code = 0
    for ch,repo in list(d_ch_repo_sync.items()):

        log(0, "======================================")
        log(0, "| Channel: %s" % ch)
        log(0, "======================================")
        log(0, "Sync of channel started.")
        log2disk(0, "Please check 'reposync/%s.log' for sync log of this channel." % ch, notimeYN=True)
        sync = reposync.RepoSync(channel_label=ch,
                      repo_type=options.repo_type,
                      url=repo,
                      fail=options.fail,
                      noninteractive=options.noninteractive,
                      filters=options.filters,
                      deep_verify=options.deep_verify,
                      no_errata=options.no_errata,
                      no_packages=options.no_packages,
                      sync_kickstart=options.sync_kickstart,
                      latest=options.latest,
                      log_level=options.verbose,
                      force_all_errata=options.force_all_errata, show_packages_only=options.show_packages)
        if options.batch_size:
            sync.set_import_batch_size(options.batch_size)
        elapsed_time, channel_ret_code = sync.sync()
        if channel_ret_code != 0 and ret_code == 0:
            ret_code = channel_ret_code
        total_time += elapsed_time
        # Switch back to common log
        rhnLog.initLOG(log_path, log_level)
        log2disk(0, "Sync of channel completed.")

    log(0, "Total time: %s" % str(total_time).split('.')[0])
    if options.email:
        reposync.send_mail()
    releaseLOCK()
    return ret_code


if __name__ == '__main__':
    try:
        sys.exit(abs(main() or 0))
    except KeyboardInterrupt:
        systemExit(1, "\nProcess has been interrupted.")
    except SystemExit as e:
        releaseLOCK()
        sys.exit(e.code)
    except Exception as e:
        releaseLOCK()
        raise
 07070100000102000081B40000000000000000000000015FBBE8EE000034C7000000000000000000000000000000000000003B00000000spacewalk-backend/satellite_tools/spacewalk-repo-sync.sgml    <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.4//EN" [
<!ENTITY RHNSAT "SUSE Manager Server" >
<!ENTITY RHNCHANRM "SUSE Manager Server repository syncing tool" >

]>
<refentry>

<refmeta>
<refentrytitle>spacewalk-repo-sync</refentrytitle><manvolnum>8</manvolnum>
<refmiscinfo>Version 3.5.0</refmiscinfo>
</refmeta>

<refnamediv>
<refname><command>spacewalk-repo-sync</command></refname>
<refpurpose>
Syncs the content from yum repos into SUSE Manager channels.
</refpurpose>
</refnamediv>

<refsynopsisdiv>
<synopsis>
    <cmdsynopsis>
	<command>spacewalk-repo-sync</command>
	<arg>options <replaceable>...</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-c <replaceable>CHANNEL_LABEL</replaceable></arg>
	<arg>--channel=<replaceable>CHANNEL_LABEL</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-p <replaceable>CHANNEL_LABEL</replaceable></arg>
	<arg>--parent-channel=<replaceable>CHANNEL_LABEL</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-l</arg>
	<arg>--list</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-s</arg>
        <arg>--show-packages</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-u <replaceable>URL</replaceable></arg>
	<arg>--url=<replaceable>URL</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-g <replaceable>CONFIG</replaceable></arg>
        <arg>--config=<replaceable>CONFIG</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-n</arg>
	<arg>--latest</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-t <replaceable>TYPE</replaceable></arg>
	<arg>--type=<replaceable>TYPE</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-f</arg>
	<arg>--fail</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-i <replaceable>FILTERS</replaceable></arg>
	<arg>--include <replaceable>FILTERS</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-e <replaceable>FILTERS</replaceable></arg>
	<arg>--exclude <replaceable>FILTERS</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
	<arg>--email</arg>
    </cmdsynopsis>
    <cmdsynopsis>
	<arg>--traceback-mail=<replaceable>EMAIL_ADDESS(ES)</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
	<arg>--no-errata</arg>
    </cmdsynopsis>
    <cmdsynopsis>
	<arg>--sync-kickstart</arg>
    </cmdsynopsis>
    <cmdsynopsis>
	<arg>--force-all-errata</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-Y</arg>
        <arg>--deep-verify</arg>
        </group>
        <sbr>
        <group>
	<arg>--batch-size=<replaceable>BATCH_SIZE</replaceable></arg>
    </cmdsynopsis>
    <cmdsynopsis>
	<arg>--dry-run</arg>
    </cmdsynopsis>
    <cmdsynopsis>
        <arg>-n</arg>
        <arg>--non-interactive</arg>
        </group>
        <sbr>
        <group>
        <arg>-v</arg>
	<arg>--verbose</arg>
    </cmdsynopsis>
</synopsis>
</refsynopsisdiv>

<refsect1><title>Description</title>
<para>
    The <emphasis>spacewalk-repo-sync</emphasis> tool is used to sync packages from
    external or local yum repositories. All the packages within the specified repository
    will be added to the channel.
</para>

<para>
    Any url supported by yum is supported by this utility, including mirror lists.
    If the url is not supplied, the tool will look to see what repositories are associated
    with the specified channel and use those.
</para>
<para>
    Additional configuration options for yum_src plugin can be placed in
    <filename>/etc/rhn/spacewalk-repo-sync/yum.conf</filename>. You may configure per-channel
    options as documented in yum.conf(5) manual page. Don't forget to put [main] section there.
</para>

</refsect1>

<refsect1><title>Options</title>
<variablelist>
    <varlistentry>
        <term>-h, --help</term>
        <listitem>
            <para>Display the help screen with a list of options.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-c <replaceable>CHANNEL</replaceable>, --channel=<replaceable>CHANNEL</replaceable></term>
        <listitem>
            <para>The channel to sync the repository to.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-p <replaceable>CHANNEL</replaceable>, --parent-channel=<replaceable>CHANNEL</replaceable></term>
        <listitem>
            <para>Synchronize the parent channel and all its child channels.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-u <replaceable>URL</replaceable>, --url=<replaceable>URL</replaceable></term>
        <listitem>
            <para>The repository URL.  Any protocol supported by yum is supported including http://, nfs://, file://. Can be used multiple times in order for more than one repository to be assigned to a channel.(Optional)</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-l, --list</term>
        <listitem>
            <para>List the custom channels with the associated repositories.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-s, --show-packages</term>
        <listitem>
            <para>List all packages in a specified channel.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-g <replaceable>CONFIG</replaceable>, --config=<replaceable>CONFIG</replaceable></term>
        <listitem>
            <para>Configuration file where more than one channel can be specified for synchronization. See section Examples.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-n, --latest</term>
        <listitem>
            <para>Sync latest packages only. Use carefully - you might need to fix some dependencies on your own.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-t <replaceable>TYPE</replaceable>, --type=<replaceable>TYPE</replaceable></term>
        <listitem>
            <para>The type of repository to sync. Currently only yum, uln and deb are supported. The uln type is used to sync with the Oracle Unbreakable Linux Network. The deb type is used for Debian repositories. This option overrides type of repository stored in DB for given repository.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-f, --fail</term>
        <listitem>
            <para>By default if an error occurs with a single package, the rest of the sync continues.  When using this option, the entire sync will terminate upon any error.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-v, --verbose</term>
        <listitem>
            <para>Print verbose output. Possible to accumulate: -vvv</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-i <replaceable>FILTERS</replaceable>, --include <replaceable>FILTERS</replaceable></term>
        <listitem>
            <para>Comma or space separated list of included packages or package groups.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-e <replaceable>FILTERS</replaceable>, --exclude <replaceable>FILTERS</replaceable></term>
        <listitem>
            <para>Comma or space separated list of excluded packages or package groups.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--email</term>
        <listitem>
            <para>e-mail a report of what was synced/imported (sent to whomever
            is considered the receiver of "traceback_mail").</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--traceback-mail=<replaceable>EMAIL_ADDRESS(ES)</replaceable></term>
        <listitem>
            <para>alternative email address(es) for all sync correspondence.
            Example: --traceback-mail="user1@example.com, user2@example.com".</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--no-errata</term>
        <listitem>
            <para>Do not sync errata</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--sync-kickstart</term>
        <listitem>
            <para>Attempt to create kickstartable tree (distribution) if there is subdirectory images/pxeboot/ under repo's URL. The option is ignored for repositories set from CLI via option [-u|--url].</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--force-all-errata</term>
        <listitem>
            <para>process metadata of all errata, not only missing.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--batch-size=<replaceable>BATCH_SIZE</replaceable></term>
        <listitem>
            <para>maximum batch size for package import</para>
            <para>This option should not be used except for debugging
            purposes. The most useful case being --batch-size=1 where the
            database import process each piece of meta-data one at a time,
            isolating any issues.</para>
            <para>WARNING: --batch-size=1 will dramatically slow down the
            sync process.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--batch-size=<replaceable>BATCH_SIZE</replaceable></term>
        <listitem>
            <para>maximum batch size for package import</para>
            <para>This option should not be used except for debugging
            purposes. The most useful case being --batch-size=1 where the
            database import process each piece of meta-data one at a time,
            isolating any issues.</para>
            <para>WARNING: --batch-size=1 will dramatically slow down the
            sync process.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-Y, --deep-verify</term>
        <listitem>
            <para>Do not use cached package checksums.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--dry-run</term>
        <listitem>
            <para>Test run. No sync takes place.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-n, --non-interactive</term>
        <listitem>
            <para>Do not ask anything, use default answers.</para>
        </listitem>
    </varlistentry>
</variablelist>
</refsect1>

<RefSect1><Title>Configuration files</Title>
<variablelist>
    <varlistentry>
        <term>/etc/rhn/rhn.conf</term>
        <listitem>
            <variablelist>
                <varlistentry>
                    <term>server.satellite.reposync_download_threads = 5</term>
                    <listitem>
                        <para>Set maximum number of threads to be used for simultaneous downloads.</para>
                    </listitem>
                </varlistentry>
            </variablelist>
        </listitem>
    </varlistentry>
</variablelist>
</RefSect1>

<refsect1><title>Examples</title>
<simplelist>
    <member>List all custom channels and the repositories assigned to them.</member>
    <member><command>spacewalk-repo-sync --list </command></member>
    <member>Synchronize single channel to all repositories assigned to it via WebUI or API.</member>
    <member><command>spacewalk-repo-sync --channel custom-channel</command></member>
    <member>Synchronize single channel to a repository specified on the command line.</member>
    <member><command>spacewalk-repo-sync -c custom-channel --url=http://example.com/yum-repo/</command></member>
    <member>Synchronize single channel to a local repository specified on the command line.</member>
    <member><command>spacewalk-repo-sync -c custom-channel --url=file:///var/share/localrepo/</command></member>
    <member>Synchronize single channel to a repository(mirror list) specified on the command line.</member>
    <member><command>spacewalk-repo-sync -c custom-channel --url=http://example.com/mirrorlist.xml/</command></member>
    <member>Synchronize single channel to more than one repository specified on the command line.</member>
    <member><command>spacewalk-repo-sync -c custom-channel --url=http://example.com/yum-repo/ --url=http://example.com/yum-repo_2/</command></member>
    <member>Synchronize parent channel and all its child channels. All channels must have repository assigned via WebUI or API.</member>
    <member><command>spacewalk-repo-sync -p parent-channel </command></member>
    <member><command>spacewalk-repo-sync -c custom-channel --url=http://example.com/yum-repo/ -p parent-channel </command></member>
    <member>Synchronize channels specified in configuration file.</member>
    <member><command>spacewalk-repo-sync --config example.conf</command></member>
    <member><command>spacewalk-repo-sync --config example.conf -c custom-channel --url=http://example.com/yum-repo/ -p parent-channel --fail</command></member>
    <member>Example configuration file.</member>
    <member>
        <msgtext><programlisting>
{
 "no_errata":false,
 "sync_kickstart":false,
 "fail":true,
 "dry_run":false,
 "channel":{"chann_1":["http://example.com/repo1","http://example.com/repo2"],"chann_2":[]},
 "parent_channel":["parent_1","parent_2"]
}
        </programlisting></msgtext>
    </member>
    <member>In order just to test the configuration use option --dry-run.</member>
    <member><command>spacewalk-repo-sync --config example.conf --dry-run</command></member>
</simplelist>
</refsect1>

<refsect1><title>Authors</title>
<simplelist>
    <member>Justin Sherrill <email>jsherril@redhat.com</email></member>
</simplelist>
</refsect1>
</refentry>

<!--
vim: sw=4
-->
 07070100000103000081FD0000000000000000000000015FBBE8EE00000516000000000000000000000000000000000000003900000000spacewalk-backend/satellite_tools/spacewalk-uln-resolver  #!/usr/bin/env python

import sys
import os
import re
import logging
import traceback
import configparser
import urllib.parse

sys.path.append("/usr/share/rhn/")
from spacewalk.satellite_tools.ulnauth import ULNAuth

# for testing add the relative path to the load path
if "spacewalk-uln-resolver" in sys.argv[0]:
    sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), '../python'))

from zypp_plugin import Plugin


class SpacewalkULNPlugin(Plugin):
    """
    ULN authentication Plugin
    """
    def __init__(self):
        Plugin.__init__(self)
        self._uln_auth = ULNAuth()

    def RESOLVEURL(self, headers, body):
        """
        Resolve URL.

        :returns: None
        """
        try:
            self._uln_auth.authenticate(headers['url'])
            self.auth_headers = {
                "X-ULN-Api-User-Key": self._uln_auth.token
            }
        except Exception as exc:
            self.answer("ERROR", {}, str(exc))
        hostname, label = self._uln_auth.get_hostname(headers.pop('url'))
        url = self._uln_auth.url + "/XMLRPC/GET-REQ/" + label
        if headers:
           url += "?{}".format(urllib.parse.urlencode(headers))
        self.answer("RESOLVEDURL", self.auth_headers, url)

plugin = SpacewalkULNPlugin()
plugin.main()
  07070100000104000081B40000000000000000000000015FBBE8EE0000166F000000000000000000000000000000000000003E00000000spacewalk-backend/satellite_tools/spacewalk-update-signatures #!/usr/bin/python
#
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# Authors: Pradeep Kilambi
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

import sys
import os

from optparse import Option, OptionParser
from spacewalk.common.rhnLog import initLOG, log_debug
from spacewalk.common.rhnConfig import CFG, initCFG
from uyuni.common import rhn_rpm
from spacewalk.server import rhnSQL
from spacewalk.server.rhnServer import server_packages
from spacewalk.satellite_tools.progress_bar import ProgressBar

initCFG('server.satellite')
initLOG(CFG.LOG_FILE, CFG.DEBUG)

OPTIONS = None
debug = 0
verbose = 0

options_table = [
    Option("-v", "--verbose",       action="store_true",
        help="Increase verbosity"),
    Option("--debug",            action="store",
        help="logs the debug information to a log file"),
    Option("--clean-possible-wrong", action="store_true",
        help="clean possible wrong calculated keyids"),
]


def main():
    global options_table, debug, verbose, clean_wrong
    parser = OptionParser(option_list=options_table)

    (options, args) = parser.parse_args()

    if args:
        for arg in args:
            sys.stderr.write("Not a valid option ('%s'), try --help\n" % arg)
        sys.exit(-1)

    if options.verbose:
        initLOG(CFG.LOG_FILE, 1)
        verbose = 1

    if options.debug:
        initLOG(CFG.LOG_FILE, options.debug or 1)
        debug = 1

    rhnSQL.initDB()

    if options.clean_possible_wrong:
        clean_wrong()

    process_package_data()


_get_needed_pkgs_query = """
select P.id, P.path, CV.checksum_type, CV.checksum
  from rhnPackage P
       left join rhnPackageKeyAssociation PA on PA.package_id = P.id
      inner join rhnChecksumView CV on CV.id = P.checksum_id
      inner join rhnPackageKey pk on pa.key_id = pk.id
       left join rhnPackageProvider pp on pk.provider_id = pp.id
 where (PA.key_id is null
        and P.rpm_version is not null)
    or (P.org_id is NULL and pp.name is NULL)
"""

_get_possible_wrong_query = """
   select X.key_id from (
       select pa.key_id, count(pa.key_id) keycount, pk.provider_id
         from rhnpackagekeyassociation pa
         join rhnpackagekey pk on pk.id = pa.key_id
        where pk.provider_id is null
     group by pa.key_id, pk.provider_id
     order by keycount DESC
   ) X
   where X.keycount < 20
"""

_delete_key_association_query = """
  delete from rhnpackagekeyassociation
   where key_id = :id
"""

_delete_key_association_by_pkgid_query = """
  delete from rhnpackagekeyassociation
   where package_id = :id
"""

_delete_key_query = """
  delete from rhnpackagekey
   where id = :id
"""

def clean_wrong():
    query = rhnSQL.prepare(_get_possible_wrong_query)

    query.execute()
    keyids = query.fetchall_dict()

    if not keyids:
        # no possible wrong keyids found
        return

    del_keyass_query = rhnSQL.prepare(_delete_key_association_query)
    del_key_query = rhnSQL.prepare(_delete_key_query)
    if verbose: print ("Processing %s possible wrong keyids" % len(keyids))
    i = 0
    for K in keyids:
        del_keyass_query.execute(id=K['key_id'])
        del_key_query.execute(id=K['key_id'])
        i = i + 1
        # we need to break the transaction to smaller pieces
        if i % 1000 == 0:
            rhnSQL.commit()

    rhnSQL.commit()
    return

def process_package_data():
    global verbose, debug

    _get_path_sql = rhnSQL.prepare(_get_needed_pkgs_query)

    _get_path_sql.execute()
    pkgs = _get_path_sql.fetchall_dict()

    if not pkgs:
        # Nothing to change
        return
    if verbose:
        print ("Processing %s packages" % len(pkgs))
    pb = ProgressBar(prompt='standby: ', endTag=' - Complete!',
                     finalSize=len(pkgs), finalBarLength=40, stream=sys.stdout)
    pb.printAll(1)
    skip_list = []
    i = 0
    for pkg in pkgs:
        pb.addTo(1)
        pb.printIncrement()
        path = pkg['path']

        if path is None:
            continue
        full_path = os.path.join(CFG.MOUNT_POINT, path)
        checksum_type = pkg['checksum_type']
        checksum = pkg['checksum']

        if not os.path.exists(full_path):
            skip_list.append(full_path)
            if debug:
                log_debug(1, "File not %s found" % (full_path))
            continue

        try:
            hdr = rhn_rpm.get_package_header(filename=full_path)
        except:
            rhnSQL.commit()
            raise

        # delete possible wrong association
        del_keyass_query = rhnSQL.prepare(_delete_key_association_by_pkgid_query)
        del_keyass_query.execute(id=pkg['id'])

        # Process gpg key ids
        server_packages.processPackageKeyAssociations(hdr, checksum_type, checksum)
        if debug:
            log_debug(1, "gpg key info updated from %s" % full_path )
        i = i + 1
        # we need to break the transaction to smaller pieces
        if i % 1000 == 0:
            rhnSQL.commit()
    pb.printComplete()
    # All done, final commit
    rhnSQL.commit()
    sys.stderr.write("Transaction Committed! \n")
    if verbose:
        print (" Skipping %s packages, paths not found" % len(skip_list))
    return


if __name__ == '__main__':
    main()
 07070100000105000081B40000000000000000000000015FBBE8EE00000662000000000000000000000000000000000000004300000000spacewalk-backend/satellite_tools/spacewalk-update-signatures.sgml    <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V3.1//EN">
<refentry>

<RefMeta>
<RefEntryTitle>spacewalk-update-signatures</RefEntryTitle><manvolnum>8</manvolnum>
</RefMeta>

<RefNameDiv>
<RefName><command>spacewalk-update-signatures</command></RefName>
<RefPurpose>
Helper utility that update packages checksum.
</RefPurpose>
</RefNameDiv>

<RefSynopsisDiv>
<Synopsis>
    <cmdsynopsis>
        <command>spacewalk-update-signatures</command>
    </cmdsynopsis>
</Synopsis>
</RefSynopsisDiv>

<RefSect1><Title>Description</Title>

<para>
    The <emphasis>spacewalk-update-signatures</emphasis>) is a
    helper utility that recalculate checksum of packages in db. New
    checksum is calculated from files on disk.
</para>
<para>
    You should not run this utility unless you know what are you doing.
    This is not needed in normal day-to-day operations.
</para>
</RefSect1>

<RefSect1><Title>Options</Title>
<variablelist>
    <varlistentry>
        <term>--help</term>
        <listitem>
            <para>Display usage and exit.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-v, --verbose</term>
        <listitem>
            <para>Increase verbosity.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--debug</term>
        <listitem>
            <para>Logs the debug information to a log file /var/log/rhn/update-packages.log</para>
        </listitem>
    </varlistentry>
</variablelist>
</RefSect1>

<RefSect1><Title>Authors</Title>
<simplelist>
    <member>Pradeep Kilambi <email>pkilambi@redhat.com</email></member>
</simplelist>
</RefSect1>
</RefEntry>
  07070100000106000081B40000000000000000000000015FBBE8EE00000C31000000000000000000000000000000000000002F00000000spacewalk-backend/satellite_tools/syncCache.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# Mechanism to persistently cache sync info (mostly post-parsed(XML)
#    package objects).
#

# system imports:
import os

# rhn imports:
from spacewalk.common import rhnCache
from spacewalk.common.rhnConfig import CFG, initCFG
from uyuni.common.rhnLib import hash_object_id

# NOTE: this is a python 2.2-ism
__all__ = []


class BaseCache:
    _compressed = 1

    def __init__(self):
        # Kind of kludgy - this may have weird side-effects if called from
        # within the server code
        rhnCache.CACHEDIR = CFG.SYNC_CACHE_DIR

    def cache_get(self, object_id, timestamp=None):
        # Get the key
        key = self._get_key(object_id)
        return rhnCache.get(key, modified=timestamp, raw=0,
                            compressed=self._compressed)

    def cache_set(self, object_id, value, timestamp=None):
        # Get the key
        key = self._get_key(object_id)
        return rhnCache.set(key, value, modified=timestamp, raw=0,
                            compressed=self._compressed)

    def cache_has_key(self, object_id, timestamp=None):
        # Get the key
        key = self._get_key(object_id)
        return rhnCache.has_key(key, modified=timestamp)

    def _get_key(self, object_id):
        raise NotImplementedError()


class ChannelCache(BaseCache):

    def _get_key(self, object_id):
        return os.path.join("satsync", "channels", str(object_id))


class BasePackageCache(BaseCache):
    _subdir = "__unknown__"

    def _get_key(self, object_id):
        hash_val = hash_object_id(object_id, 2)
        return os.path.join("satsync", self._subdir, hash_val, str(object_id))


class ShortPackageCache(BasePackageCache):
    _subdir = "short-packages"
    _compressed = 0


class PackageCache(BasePackageCache):
    _subdir = "packages"


class SourcePackageCache(BasePackageCache):
    _subdir = "source-packages"


class ErratumCache(BaseCache):
    _subdir = "errata"

    def _get_key(self, object_id):
        hash_val = hash_object_id(object_id, 1)
        return os.path.join("satsync", self._subdir, hash_val, str(object_id))


class KickstartableTreesCache(BaseCache):
    _subdir = "kickstartable-trees"

    def _get_key(self, object_id):
        return os.path.normpath(os.path.join("satsync", self._subdir,
                                             object_id))

if __name__ == '__main__':
    initCFG("server.satellite")
    c = PackageCache()
    pid = 'package-12345'
    c.cache_set(pid, {'a': 1, 'b': 2})
    print((c.cache_get(pid)))
   07070100000107000081B40000000000000000000000015FBBE8EE000024A3000000000000000000000000000000000000002D00000000spacewalk-backend/satellite_tools/syncLib.py  #
# Copyright (c) 2008--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
from __future__ import unicode_literals

# system imports:
import os
import sys
import time

try:
    #  python 2
    from StringIO import StringIO
except ImportError:
    #  python3
    from io import StringIO

# rhn imports:
from uyuni.common.usix import raise_with_tb
from uyuni.common import rhnLib
from spacewalk.common.rhnConfig import CFG
from spacewalk.common.rhnLog import log_time, log_clean
from uyuni.common.fileutils import createPath, setPermsPath

from . import messages

EMAIL_LOG = None


def initEMAIL_LOG(reinit=0):
    global EMAIL_LOG
    if EMAIL_LOG is None or reinit:
        EMAIL_LOG = StringIO()


def dumpEMAIL_LOG():
    if EMAIL_LOG is not None:
        return EMAIL_LOG.getvalue()
    return None


class RhnSyncException(Exception):

    """General exception handler for all sync activity."""
    pass


class ReprocessingNeeded(Exception):

    """Exception raised when a contition has been hit that would require a new
    run of the sync process"""
    pass

# logging functions:
# log levels rule of thumb:
# 0  - no logging, yet no feedback either
# 1  - minimal logging/feedback
# 2  - normal level of logging/feedback
# 3  - a bit much
##  4+ - excessive


def _timeString1():
    """time string as: "2002/11/18 12:56:34" """
    return log_time()


def _timeString2():
    """time string as: "12:56:34" """
    return time.strftime("%H:%M:%S", time.localtime(time.time()))


def _prepLogMsg(msg, cleanYN=0, notimeYN=0, shortYN=0):
    """prepare formating of message for logging.

    cleanYN -  no extra info, period.
    notimeYN - spaced as if there were a time-stamp.
    shortYN -  no date (used for stdout/stderr really)
    """
    if not cleanYN:
        if shortYN:
            if notimeYN:
                msg = '%s %s' % (' ' * len(_timeString2()), msg)
            else:
                msg = '%s %s' % (_timeString2(), msg)
        else:
            if notimeYN:
                msg = '%s %s' % (' ' * len(_timeString1()), msg)
            else:
                msg = '%s %s' % (_timeString1(), msg)
    return msg


def log2disk(level, msg, cleanYN=0, notimeYN=0):
    """Log to a log file.
    Arguments: see def _prepLogMsg(...) above.
    """
    if not isinstance(msg, type([])):
        msg = [msg]
    for m in msg:
        try:
            log_clean(level=level, msg=_prepLogMsg(m, cleanYN, notimeYN))
        except (KeyboardInterrupt, SystemExit):
            raise
        except Exception:  # pylint: disable=E0012, W0703
            e = sys.exc_info()[1]
            sys.stderr.write('ERROR: upon attempt to write to log file: %s' % e)


def log2stream(level, msg, cleanYN, notimeYN, stream):
    """Log to a specified stream.
    Arguments: see def _prepLogMsg(...) above.
    """
    if not isinstance(msg, type([])):
        msg = [msg]
    if CFG.DEBUG >= level:
        for m in msg:
            stream.write(_prepLogMsg(m, cleanYN, notimeYN, shortYN=1) + '\n')
        stream.flush()


def log2email(level, msg, cleanYN=0, notimeYN=0):
    """ Log to the email log.
        Arguments: see def _prepLogMsg(...) above.
    """
    if EMAIL_LOG is not None:
        log2stream(level, msg, cleanYN, notimeYN, EMAIL_LOG)


def log2background(level, msg, cleanYN=0, notimeYN=0):
    """Log to email and disk
    Arguments: see def _prepLogMsg(...) above.
    """
    log2email(level, msg, cleanYN, notimeYN)
    log2disk(level, msg, cleanYN, notimeYN)


def log2stderr(level, msg, cleanYN=0, notimeYN=0):
    """Log to standard error
    Arguments: see def _prepLogMsg(...) above.
    """
    log2email(level, msg, cleanYN, notimeYN)
    log2stream(level, msg, cleanYN, notimeYN, sys.stderr)


def log2stdout(level, msg, cleanYN=0, notimeYN=0):
    """Log to standard out
    Arguments: see def _prepLogMsg(...) above.
    """
    log2email(level, msg, cleanYN, notimeYN)
    log2stream(level, msg, cleanYN, notimeYN, sys.stdout)


def log2(levelDisk, levelStream, msg, cleanYN=0, notimeYN=0, stream=sys.stdout):
    """Log to disk and some stream --- differing log levels.
    Arguments: see def _prepLogMsg(...) above.
    """
    log2disk(levelDisk, msg, cleanYN, notimeYN)
    if stream is sys.stdout:
        log2stdout(levelStream, msg, cleanYN, notimeYN)
    elif stream is sys.stderr:
        log2stderr(levelStream, msg, cleanYN, notimeYN)
    else:
        log2stream(levelStream, msg, cleanYN, notimeYN, stream=stream)


def log(level, msg, cleanYN=0, notimeYN=0, stream=sys.stdout):
    """Log to disk and some stream --- share same log level.
    Arguments: see def _prepLogMsg(...) above.
    """
    log2(level, level, msg, cleanYN, notimeYN, stream=stream)


class FileCreationError(Exception):
    pass


class FileManip:

    "Generic file manipulation class"

    def __init__(self, relative_path, timestamp, file_size):
        self.relative_path = relative_path
        self.timestamp = rhnLib.timestamp(timestamp)
        self.file_size = file_size
        self.full_path = os.path.join(CFG.MOUNT_POINT, self.relative_path)
        self.buffer_size = CFG.BUFFER_SIZE

    def write_file(self, stream_in):
        """Writes the contents of stream_in to the filesystem
        Returns the file size(success) or raises FileCreationError"""
        dirname = os.path.dirname(self.full_path)
        createPath(dirname)
        stat = os.statvfs(dirname)

        f_bsize = stat[0]  # file system block size
        # misa: it's kind of icky whether to use f_bfree (free blocks) or
        # f_bavail (free blocks for non-root). f_bavail is more correct, since
        # you don't want to have the system out of disk space because of
        # satsync; but people would get confused when looking at the output of
        # df
        f_bavail = stat[4]  # free blocks
        freespace = f_bsize * float(f_bavail)
        if self.file_size is not None and self.file_size > freespace:
            msg = messages.not_enough_diskspace % (freespace / 1024)
            log(-1, msg, stream=sys.stderr)
            # pkilambi: As the metadata download does'nt check for unfetched rpms
            # abort the sync when it runs out of disc space
            sys.exit(-1)
            #raise FileCreationError(msg)
        if freespace < 5000 * 1024:  # arbitrary
            msg = messages.not_enough_diskspace % (freespace / 1024)
            log(-1, msg, stream=sys.stderr)
            # pkilambi: As the metadata download does'nt check for unfetched rpms
            # abort the sync when it runs out of disc space
            sys.exit(-1)
            #raise FileCreationError(msg)

        fout = open(self.full_path, 'wb')
        # setting file permissions; NOTE: rhnpush uses apache to write to disk,
        # hence the 6 setting.
        if rhnLib.isSUSE():
            setPermsPath(self.full_path, user='wwwrun', group='www', chmod=int('0644', 8))
        else:
            setPermsPath(self.full_path, user='apache', group='apache', chmod=int('0644', 8))
        size = 0
        try:
            while 1:
                buf = stream_in.read(self.buffer_size)
                if not buf:
                    break
                buf_len = len(buf)
                fout.write(buf)
                size = size + buf_len
        except IOError:
            e = sys.exc_info()[1]
            msg = "IOError: %s" % e
            log(-1, msg, stream=sys.stderr)
            # Try not to leave garbage around
            try:
                os.unlink(self.full_path)
            except (OSError, IOError):
                pass
            raise_with_tb(FileCreationError(msg), sys.exc_info()[2])
        l_file_size = fout.tell()
        fout.close()

        if self.file_size is not None and self.file_size != l_file_size:
            # Something bad happened
            msg = "Error: file %s has wrong size. Expected %s bytes, got %s bytes" % (
                self.full_path, self.file_size, l_file_size)
            log(-1, msg, stream=sys.stderr)
            # Try not to leave garbage around
            try:
                os.unlink(self.full_path)
            except (OSError, IOError):
                pass
            raise FileCreationError(msg)

        os.utime(self.full_path, (self.timestamp, self.timestamp))
        return l_file_size


class RpmManip(FileManip):

    """General [S]RPM manipulation class.

    o Check checksums for mismatches
    o Write RPMs to the filesystem
    o get NVRE and NVREA
    """

    def __init__(self, pdict, path):
        FileManip.__init__(self, relative_path=path,
                           timestamp=pdict['last_modified'], file_size=pdict['package_size'])
        self.pdict = pdict

    def nvrea(self):
        return tuple([self.pdict[x] for x in
                      ['name', 'version', 'release', 'epoch', 'arch']])
 07070100000108000081B40000000000000000000000015FBBE8EE00004FD9000000000000000000000000000000000000003300000000spacewalk-backend/satellite_tools/sync_handlers.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import sys

from uyuni.common import usix
from spacewalk.server.importlib import channelImport, packageImport, errataImport, \
    kickstartImport
from uyuni.common.usix import raise_with_tb
from . import diskImportLib
from . import xmlSource
from . import syncCache
from . import syncLib

DEFAULT_ORG = 1

# Singleton-like


class BaseCollection:
    _shared_state = {}

    def __init__(self):
        self.__dict__ = self._shared_state
        if not list(self._shared_state.keys()):
            self._items = []
            self._cache = None
            self._items_hash = {}
            self._init_fields()
            self._init_cache()

    def add_item(self, item):
        item_id = self._get_item_id(item)
        timestamp = self._get_item_timestamp(item)
        self._cache.cache_set(item_id, item, timestamp=timestamp)
        return self

    def get_item_timestamp(self, item_id):
        "Returns this item's timestamp"
        if item_id not in self._items_hash:
            raise KeyError("Item %s not found in collection" % item_id)
        return self._items_hash[item_id]

    def get_item(self, item_id, timestamp):
        "Retrieve an item from the collection"
        return self._cache.cache_get(item_id, timestamp=timestamp)

    def has_item(self, item_id, timestamp):
        """Return true if the item exists in the collection (with the
        specified timestamp"""
        return self._cache.cache_has_key(item_id, timestamp=timestamp)

    def _init_fields(self):
        return self

    def _init_cache(self):
        return self

    def _get_item_id(self, item):
        "Get the item ID out of an item. Override in subclasses"
        raise NotImplementedError

    def _get_item_timestamp(self, item):
        "Get the item timestamp out of an item. Override in subclasses"
        raise NotImplementedError

    def reset(self):
        """Reset the collection"""
        self._shared_state.clear()
        self.__init__()

# Singleton-like


class ChannelCollection:
    _shared_state = {}

    def __init__(self):
        self.__dict__ = self._shared_state
        if not list(self._shared_state.keys()):
            self._channels = []
            self._parent_channels = {}
            self._channels_hash = {}
            self._cache = syncCache.ChannelCache()

    def add_item(self, channel_object):
        """Stores a channel in the collection"""
        channel_label = channel_object['label']
        channel_last_modified = channel_object['last_modified']
        last_modified = _to_timestamp(channel_last_modified)
        self._cache.cache_set(channel_label, channel_object,
                              timestamp=last_modified)
        t = (channel_label, last_modified)
        self._channels.append(t)
        channel_parent = channel_object.get('parent_channel')
        if channel_parent is not None:
            # Add this channel to the parent's list
            l = self._get_list_from_dict(self._parent_channels, channel_parent)
            l.append(t)
        else:
            # Create an empty list
            self._get_list_from_dict(self._parent_channels, channel_label)
        self._channels_hash[channel_label] = last_modified
        return self

    @staticmethod
    def _get_list_from_dict(diction, key):
        # Returns the dictionary's key if present (assumed to be a list), or
        # sets the value to an empty list and returns it
        if key in diction:
            l = diction[key]
        else:
            l = diction[key] = []
        return l

    def get_channel_labels(self):
        """Return the channel labels from this collection"""
        return [x[0] for x in self._channels]

    def get_channels(self):
        """Return a list of (channel label, channel timestamp) from this
        collection"""
        return self._channels[:]

    def get_channel(self, channel_label, timestamp):
        """Return the channel with the specified label and timestamp from the
        collection"""
        return self._cache.cache_get(channel_label, timestamp=timestamp)

    def get_channel_timestamp(self, channel_label):
        """Returns the channel's timestamp"""
        if channel_label not in self._channels_hash:
            raise KeyError("Channel %s could not be found" % channel_label)
        return self._channels_hash[channel_label]

    def get_parent_channel_labels(self):
        """Return a list of channel labels for parent channels"""
        l = list(self._parent_channels.keys())
        l.sort()
        return l

    def get_child_channels(self, channel_label):
        """Return a list of (channel label, channel timestamp) for this parent
        channel"""
        if channel_label not in self._parent_channels:
            raise Exception("Channel %s is not a parent" % channel_label)
        return self._parent_channels[channel_label]

    def reset(self):
        """Reset the collection"""
        self._shared_state.clear()
        self.__init__()

# pylint: disable=W0232


class SyncHandlerContainer:
    collection = object

    # this class has no __init__ for the purpose
    # it's used in multiple inheritance mode and inherited classes should
    # use __init__ from the other base class

    def endItemCallback(self):
        # reference to xmlSource superclass we redefines
        xml_superclass = self.__class__.__bases__[1]
        xml_superclass.endItemCallback(self)
        # pylint: disable=E1101
        if not self.batch:
            return
        c = self.collection()
        c.add_item(self.batch[-1])
        del self.batch[:]

    def endContainerCallback(self):
        # Not much to do here...
        pass


def get_sync_handler(container):
    handler = xmlSource.SatelliteDispatchHandler()
    handler.set_container(container)
    return handler


class ChannelContainer(SyncHandlerContainer, xmlSource.ChannelContainer):
    collection = ChannelCollection


def get_channel_handler():
    return get_sync_handler(ChannelContainer())


def import_channels(channels, orgid=None, master=None):
    collection = ChannelCollection()
    batch = []
    org_map = None
    my_backend = diskImportLib.get_backend()
    if master:
        org_map = my_backend.lookupOrgMap(master)['master-id-to-local-id']
    for c in channels:
        try:
            timestamp = collection.get_channel_timestamp(c)
        except KeyError:
            raise_with_tb(Exception("Could not find channel %s" % c), sys.exc_info()[2])
        c_obj = collection.get_channel(c, timestamp)
        if c_obj is None:
            raise Exception("Channel not found in cache: %s" % c)

        # Check to see if we're asked to sync to an orgid,
        # make sure the org from the export is not null org,
        # finally if the orgs differ so we might wanna use
        # requested org's channel-family.
        # TODO: Move these checks somewhere more appropriate
        if not orgid and c_obj['org_id'] is not None:
            # If the src org is not present default to org 1
            orgid = DEFAULT_ORG
        if orgid is not None and c_obj['org_id'] is not None and \
                c_obj['org_id'] != orgid:
            # If we know the master this is coming from and the master org
            # has been mapped to a local org, transform org_id to the local
            # org_id. Otherwise just put it in the default org.
            if (org_map and c_obj['org_id'] in list(org_map.keys())
                    and org_map[c_obj['org_id']]):
                c_obj['org_id'] = org_map[c_obj['org_id']]
            else:
                c_obj['org_id'] = orgid
                if 'trust_list' in c_obj:
                    del(c_obj['trust_list'])
            for family in c_obj['families']:
                family['label'] = 'private-channel-family-' + \
                    str(c_obj['org_id'])
        # If there's a trust list on the channel, transform the org ids to
        # the local ones
        if 'trust_list' in c_obj and c_obj['trust_list']:
            trusts = []
            for trust in c_obj['trust_list']:
                if trust['org_trust_id'] in org_map:
                    trust['org_trust_id'] = org_map[trust['org_trust_id']]
                    trusts.append(trust)
            c_obj['trust_list'] = trusts

        syncLib.log(6, "Syncing Channel %s to Org %s " % (c_obj['label'], c_obj['org_id']))
        batch.append(c_obj)

    importer = channelImport.ChannelImport(batch, my_backend)
    # Don't commit just yet
    importer.will_commit = 0
    importer.run()
    return importer

# Singleton-like


class ShortPackageCollection:
    _shared_state = {}

    def __init__(self):
        self.__dict__ = self._shared_state
        if not list(self._shared_state.keys()):
            self._cache = None
            self._init_cache()

    def _init_cache(self):
        self._cache = syncCache.ShortPackageCache()

    def add_item(self, package):
        """Stores a package in the collection"""
        self._cache.cache_set(package['package_id'], package)

    def get_package(self, package_id):
        """Return the package with the specified id from the collection"""
        return self._cache.cache_get(package_id)

    def has_package(self, package_id):
        """Returns true if the package exists in the collection"""
        return self._cache.cache_has_key(package_id)

    def reset(self):
        """Reset the collection"""
        self._shared_state.clear()
        self.__init__()


class ShortPackageContainer(SyncHandlerContainer, xmlSource.IncompletePackageContainer):
    collection = ShortPackageCollection


def get_short_package_handler():
    return get_sync_handler(ShortPackageContainer())


class PackageCollection(ShortPackageCollection):
    _shared_state = {}

    def _init_cache(self):
        self._cache = syncCache.PackageCache()

    def get_package_timestamp(self, package_id):
        raise NotImplementedError


class PackageContainer(SyncHandlerContainer, xmlSource.PackageContainer):
    collection = PackageCollection


def get_package_handler():
    return get_sync_handler(PackageContainer())


# Singleton-like
class SourcePackageCollection(ShortPackageCollection):
    _shared_state = {}

    def _init_cache(self):
        self._cache = syncCache.SourcePackageCache()


class SourcePackageContainer(SyncHandlerContainer, xmlSource.SourcePackageContainer):
    collection = SourcePackageCollection


def get_source_package_handler():
    return get_sync_handler(SourcePackageContainer())

# Singleton-like


class ErrataCollection:
    _shared_state = {}

    def __init__(self):
        self.__dict__ = self._shared_state
        if not list(self._shared_state.keys()):
            self._errata_hash = {}
            self._cache = None
            self._init_cache()

    def _init_cache(self):
        self._cache = syncCache.ErratumCache()

    def add_item(self, erratum):
        """Stores an erratum in the collection"""
        erratum_id = erratum['erratum_id']
        timestamp = _to_timestamp(erratum['last_modified'])
        self._errata_hash[erratum_id] = timestamp
        self._cache.cache_set(erratum_id, erratum, timestamp=timestamp)

    def get_erratum_timestamp(self, erratum_id):
        """Returns the erratum's timestamp"""
        if erratum_id not in self._errata_hash:
            raise KeyError("Erratum %s could not be found" % erratum_id)
        return self._errata_hash[erratum_id]

    def get_erratum(self, erratum_id, timestamp):
        """Return the erratum with the specified id and timestamp from the
        collection. Note that timestamp can be None, in which case no timetamp
        matching is performed"""
        return self._cache.cache_get(erratum_id, timestamp=timestamp)

    def has_erratum(self, erratum_id, timestamp):
        """Returns true if the erratum exists in the collection"""
        return self._cache.cache_has_key(erratum_id, timestamp=timestamp)

    def reset(self):
        """Reset the collection"""
        self._shared_state.clear()
        self.__init__()


class ErrataContainer(SyncHandlerContainer, xmlSource.ErrataContainer):
    collection = ErrataCollection


def get_errata_handler():
    return get_sync_handler(ErrataContainer())


class KickstartableTreesCollection(BaseCollection):
    _shared_state = {}

    def _init_cache(self):
        self._cache = syncCache.KickstartableTreesCache()

    def _get_item_id(self, item):
        return item['label']

    def _get_item_timestamp(self, item):
        return None


class KickstartableTreesContainer(SyncHandlerContainer, xmlSource.KickstartableTreesContainer):
    collection = KickstartableTreesCollection


def get_kickstarts_handler():
    return get_sync_handler(KickstartableTreesContainer())


def import_packages(batch, sources=0):
    importer = packageImport.PackageImport(batch, diskImportLib.get_backend(), sources)
    importer.setUploadForce(4)
    importer.run()
    importer.status()
    return importer


def link_channel_packages(batch, strict=1):
    importer = packageImport.ChannelPackageSubscription(batch,
                                                        diskImportLib.get_backend(),
                                                        caller="satsync.linkPackagesToChannels", strict=strict)
    importer.run()
    importer.status()
    return importer


def import_errata(batch):
    importer = errataImport.ErrataImport(batch, diskImportLib.get_backend())
    importer.ignoreMissing = 1
    importer.run()
    importer.status()
    return importer


def import_kickstarts(batch):
    importer = kickstartImport.KickstartableTreeImport(batch,
                                                       diskImportLib.get_backend())
    importer.run()
    importer.status()
    return importer


def _to_timestamp(t):
    if isinstance(t, usix.IntType):
        # Already an int
        return t
    # last_modified is YYYY-MM-DD HH24:MI:SS
    # The cache expects YYYYMMDDHH24MISS as format; so just drop the
    # spaces, dashes and columns
    # python 2.4 can't handle t.translate(None, ' -:')
    table = t.maketrans('', '', ' -:')
    last_modified = t.translate(table)
    return last_modified

# Generic container handler


class ContainerHandler:

    """generate and set container XML handlers"""

    def __init__(self, master_label, create_orgs=False):
        self.handler = xmlSource.SatelliteDispatchHandler()
        # arch containers
        self.setServerArchContainer()
        self.setPackageArchContainer()
        self.setChannelArchContainer()
        self.setCPUArchContainer()
        self.setServerPackageArchContainer()
        self.setServerChannelArchContainer()
        self.setServerGroupServerArchContainer()
        self.setChannelPackageArchContainer()
        # all other containers
        self.setChannelFamilyContainer()
        self.setProductNamesContainer()
        self.setOrgContainer(master_label, create_orgs)
        self.setSupportInformationContainer()
        self.setSuseProductsContainer()
        self.setSuseProductChannelsContainer()
        self.setSuseUpgradePathsContainer()
        self.setSuseProductExtensionsContainer()
        self.setSuseProductRepositoriesContainer()
        self.setSCCRepositoriesContainer()
        self.setSuseSubscriptionsContainer()
        self.setClonedChannelsContainer()

    def __del__(self):
        self.handler.close()  # kill the circular reference.

    def close(self):
        self.handler.close()  # kill the circular reference.

    def clear(self):
        self.handler.clear()  # clear the batch

    # basic functionality:
    def process(self, stream):
        self.handler.process(stream)

    def reset(self):
        self.handler.reset()

    def getHandler(self):
        return self.handler

    # set arch containers:
    def setServerArchContainer(self):
        self.handler.set_container(diskImportLib.ServerArchContainer())

    def setPackageArchContainer(self):
        self.handler.set_container(diskImportLib.PackageArchContainer())

    def setChannelArchContainer(self):
        self.handler.set_container(diskImportLib.ChannelArchContainer())

    def setCPUArchContainer(self):
        self.handler.set_container(diskImportLib.CPUArchContainer())

    def setServerPackageArchContainer(self):
        self.handler.set_container(diskImportLib.ServerPackageArchCompatContainer())

    def setServerChannelArchContainer(self):
        self.handler.set_container(diskImportLib.ServerChannelArchCompatContainer())

    def setServerGroupServerArchContainer(self):
        self.handler.set_container(diskImportLib.ServerGroupServerArchCompatContainer())

    def setChannelPackageArchContainer(self):
        self.handler.set_container(ChannelPackageArchCompatContainer())
    # set all other containers:

    def setChannelFamilyContainer(self):
        self.handler.set_container(ChannelFamilyContainer())

    def setProductNamesContainer(self):
        self.handler.set_container(diskImportLib.ProductNamesContainer())

    def setOrgContainer(self, master_label, create_orgs):
        # pylint: disable=E1101,E1103
        self.handler.set_container(diskImportLib.OrgContainer())
        # pylint: disable=E1103
        self.handler.get_container('rhn-orgs').set_master_and_create_org_args(
            master_label, create_orgs)
    def setSupportInformationContainer(self):
        self.handler.set_container(diskImportLib.SupportInformationContainer())
    def setSuseProductsContainer(self):
        self.handler.set_container(diskImportLib.SuseProductsContainer())
    def setSuseProductChannelsContainer(self):
        self.handler.set_container(diskImportLib.SuseProductChannelsContainer())
    def setSuseUpgradePathsContainer(self):
        self.handler.set_container(diskImportLib.SuseUpgradePathsContainer())
    def setSuseProductExtensionsContainer(self):
        self.handler.set_container(diskImportLib.SuseProductExtensionsContainer())
    def setSuseProductRepositoriesContainer(self):
        self.handler.set_container(diskImportLib.SuseProductRepositoriesContainer())
    def setSCCRepositoriesContainer(self):
        self.handler.set_container(diskImportLib.SCCRepositoriesContainer())
    def setSuseSubscriptionsContainer(self):
        self.handler.set_container(diskImportLib.SuseSubscriptionsContainer())
    def setClonedChannelsContainer(self):
        self.handler.set_container(diskImportLib.ClonedChannelsContainer())

#
# more containers
#
# NOTE: we use *most* the Arch Containers from diskImportLib.py
#       this one is used simply to print out the arches.


class ChannelPackageArchCompatContainer(diskImportLib.ChannelPackageArchCompatContainer):

    arches = {}

    def endItemCallback(self):
        diskImportLib.ChannelPackageArchCompatContainer.endItemCallback(self)
        if not self.batch:
            return
        self.arches[self.batch[-1]['package-arch']] = 1

    def endContainerCallback(self):
        arches = list(self.arches.keys())
        arches.sort()
        if arches:
            for arch in arches:
                syncLib.log(6, '   parsed arch: %s' % (arch))
        diskImportLib.ChannelPackageArchCompatContainer.endContainerCallback(self)


class ChannelFamilyContainer(xmlSource.ChannelFamilyContainer):

    def endItemCallback(self):
        xmlSource.ChannelFamilyContainer.endItemCallback(self)
        if not self.batch:
            return
        syncLib.log(2, '   parsing family: %s' % (self.batch[-1]['name']))

    def endContainerCallback(self):
        batch = self.batch
        # use the copy only; don't want a persistent self.batch
        self.batch = []

        importer = channelImport.ChannelFamilyImport(batch,
                                                     diskImportLib.get_backend())
        importer.run()
   07070100000109000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002700000000spacewalk-backend/satellite_tools/test    0707010000010A000081B40000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000003300000000spacewalk-backend/satellite_tools/test/__init__.py    0707010000010B000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002C00000000spacewalk-backend/satellite_tools/test/unit   0707010000010C000081B40000000000000000000000015FBBE8EE0000006C000000000000000000000000000000000000003300000000spacewalk-backend/satellite_tools/test/unit/README    These tests require python-mock and python-nose to run.

You can excecute them by just running 'nosetests'.
0707010000010D000081B40000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000003800000000spacewalk-backend/satellite_tools/test/unit/__init__.py   0707010000010E000081B40000000000000000000000015FBBE8EE00009EDB000000000000000000000000000000000000003D00000000spacewalk-backend/satellite_tools/test/unit/test_reposync.py  #!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright (c) 2011 SUSE LLC
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.

import imp
import sys
import unittest
import json
try:
    from io import StringIO
except ImportError:
    from StringIO import StringIO
from datetime import datetime, timedelta

from mock import Mock, patch, call

import spacewalk.satellite_tools.reposync
from spacewalk.satellite_tools.repo_plugins import ContentPackage
from spacewalk.satellite_tools.repo_plugins import yum_src
from spacewalk.server.importlib import importLib

from uyuni.common import rhn_rpm

RTYPE = 'yum' # a valid repotype

class RepoSyncTest(unittest.TestCase):

    def setUp(self):
        self.reposync = spacewalk.satellite_tools.reposync

        # kill logging
        self.reposync.rhnLog.initLOG = Mock()

        # catching stdout
        # this could be assertRaisesRegexp in python>=2.7. just sayin'
        self.saved_stdout = sys.stdout
        self.stdout = StringIO()
        sys.stdout = self.stdout

        # catching stderr
        self.saved_stderr = sys.stderr
        self.stderr = StringIO()
        sys.stderr = self.stderr

        self.reposync.os = Mock()
        self.reposync.rhnSQL.initDB = Mock()
        self.reposync.rhnSQL.commit = Mock()

        _mock_rhnsql(
            self.reposync,
            [
              [{'id': 'id1', 'repo_label': 'label1', 'source_url': 'http://url.one', 'metadata_signed': 'Y', 'repo_type': 'yum'}],
              [{'id': 'id2', 'repo_label': 'label2', 'source_url': 'http://url.two', 'metadata_signed': 'N', 'repo_type': 'yum'}],
            ]
        )

    def tearDown(self):
        self.stdout.close()
        sys.stdout = self.saved_stdout

        self.stderr.close()
        sys.stderr = self.saved_stderr

        imp.reload(spacewalk.satellite_tools.reposync)

    def test_init_succeeds_with_correct_attributes(self):
        rs = self._init_reposync('Label', RTYPE)

        self.assertEqual(rs.channel_label, 'Label')

        # these should have been set automatically
        self.assertEqual(rs.fail, False)
        self.assertEqual(rs.interactive, True)

    def test_init_with_custom_url(self):
        rs = self._init_reposync('Label', RTYPE, url='http://example.com')

        self.assertEqual(rs.urls, [{'source_url': 'http://example.com',
                                    'repo_label': None,
                                    'id': None,
                                    'metadata_signed': 'N',
                                    'repo_type': 'yum'
                                  }])

    def test_init_with_custom_flags(self):
        rs = self._init_reposync('Label', RTYPE, fail=True, noninteractive=True)

        self.assertEqual(rs.fail, True)
        self.assertEqual(rs.interactive, False)

    def test_init_wrong_url(self):
        """Test generates empty metadata via taskomatic and quits"""
        # the channel shouldn't be found in the database
        _mock_rhnsql(self.reposync, False)
        self.reposync.taskomatic.add_to_repodata_queue_for_channel_package_subscription = Mock()

        channel = {'org_id':1, 'id':1, 'arch': 'arch1'}
        self.reposync.RepoSync.load_channel = Mock(return_value=channel)

        self.assertRaises(SystemExit, self.reposync.RepoSync, 'WrongLabel', RTYPE)

        self.assertTrue(self.reposync.taskomatic.
                        add_to_repodata_queue_for_channel_package_subscription.
                        called)

    def test_init_rhnlog(self):
        """Init rhnLog successfully"""
        rs = self._init_reposync('Label', RTYPE)

        self.assertTrue(self.reposync.rhnLog.initLOG.called)

    def test_init_channel(self):
        self.reposync.rhnChannel.channel_info = Mock(return_value=
                                                {'name': 'mocked Channel',
                                                 'id': 1,
                                                 'org_id': 1})
        self.reposync.RepoSync.get_compatible_arches = Mock(return_value=['arch1', 'arch2'])

        rs = self.reposync.RepoSync('Label', RTYPE)

        self.assertEqual(rs.channel, {'name': 'mocked Channel', 'id': 1, 'org_id': 1})

    def test_init_bad_channel(self):
        self.reposync.rhnChannel.channel_info = Mock(return_value=None)

        self.assertRaises(SystemExit, self.reposync.RepoSync, 'Label', RTYPE)

    def test_bad_repo_type(self):
        rs = self._init_reposync('Label', RTYPE)
        self.assertRaises(SystemExit, rs.load_plugin, 'bad-repo-type')
        self.assertIn("Repository type bad-repo-type is not supported. "
                      "Could not import "
                      "spacewalk.satellite_tools."
                      "repo_plugins.bad-repo-type_src.\n",
                      self.stderr.getvalue())

    def test_sync_success_no_regen(self):
        rs = self._init_reposync()

        rs.urls = [
          {"source_url": ["http://none.host/bogus-url"], "id": 42, "metadata_signed": "N", "repo_label": None, 'repo_type': 'yum'}]

        _mock_rhnsql(self.reposync, None)
        rs = self._mock_sync(rs)
        rs.sync()

        self.assertEqual(rs.repo_plugin.call_args[0],
                (('http://none.host/bogus-url', 'bogus-url', True, True)))

        self.assertEqual(rs.import_packages.call_args,
                ((rs.mocked_plugin, 42, "http://none.host/bogus-url", 1), {}))
        self.assertEqual(rs.import_updates.call_args,
                ((rs.mocked_plugin,), {}))
        self.assertEqual(rs.import_products.call_args,
                ((rs.mocked_plugin,), {}))

        # for the rest just check if they were called or not
        self.assertTrue(rs.update_date.called)
        # these aren't supposed to be called unless self.regen is True
        self.assertFalse(self.reposync.taskomatic.add_to_repodata_queue_for_channel_package_subscription.called)
        self.assertFalse(self.reposync.taskomatic.add_to_erratacache_queue.called)

    def test_sync_success_regen(self):
        rs = self._init_reposync()

        rs.urls = [{"source_url": ["http://none.host/bogus-url"], "id": 42, "metadata_signed": "N", "repo_label": None, 'repo_type': 'yum'}]

        _mock_rhnsql(self.reposync, {})
        rs = self._mock_sync(rs)
        rs.regen = True
        rs.sync()

        self.assertEqual(self.reposync.taskomatic.add_to_repodata_queue_for_channel_package_subscription.call_args,
                         ((["Label"], [], "server.app.yumreposync"), {}))
        self.assertEqual(self.reposync.taskomatic.add_to_erratacache_queue.call_args,
                         (("Label", ), {}))

    def test_sync_raises_channel_timeout(self):
        rs = self._create_mocked_reposync()

        exception = self.reposync.ChannelTimeoutException("anony-error")
        rs.load_plugin = Mock(return_value=Mock(side_effect=exception))
        rs.sendErrorMail = Mock()

        etime, ret = rs.sync()
        self.assertEqual(-1, ret)
        self.assertEqual(rs.sendErrorMail.call_args,
                         (("anony-error", ), {}))
        self.assertEqual(self.reposync.log.call_args[0][1], exception)

    def test_sync_raises_unexpected_error(self):
        rs = self._create_mocked_reposync()

        rs.load_plugin = Mock(return_value=Mock(side_effect=TypeError))
        rs.sendErrorMail = Mock()
        etime, ret = rs.sync()
        self.assertEqual(-1, ret)

        error_string = self.reposync.log.call_args[0][1]
        assert (error_string.startswith('Traceback') and
                'TypeError' in error_string), (
            "The error string does not contain the keywords "
            "'Traceback' and 'TypeError':\n %s\n---end of assert" % error_string)

    def test_update_bugs(self):
        notice = {'references': [{'type': 'bugzilla',
                                  'id': '12345',
                                  'title': 'title1',
                                  'href': 'href1'},
                                 {'type': 'bugzilla',
                                  'id': 'string_id',
                                  'title': 'title2',
                                  'href': 'href2',
                                  'this': 'non-integer bz ids should be skipped'},
                                 {'type': 'bugzilla',
                                  'id': 'string_id',
                                  'title': 'title3',
                                  'href': 'http://dummyhost/show_bug.cgi?id=11111',
                                  'this': 'bz id parsed from href'},
                                 {'type': 'bugzilla',
                                  'id': '54321',
                                  'title': 'title2',
                                  'href': 'href2'},
                                 {'type': 'bugzilla',
                                  'id': '54321',
                                  'title': 'duplicate_id',
                                  'href': 'duplicate_id'},
                                 {'type': 'godzilla',
                                  'this': 'should be skipped'}]}
        bugs = self.reposync.RepoSync._update_bugs(notice)

        bug_values = [set(['12345', 'title1', 'href1']),
                      set(['54321', 'title2', 'href2']),
                      set(['11111', 'title3', 'http://dummyhost/show_bug.cgi?id=11111'])]

        self.assertEqual(len(bugs), 3)
        for bug in bugs:
            self.assertCountEqual(list(bug.keys()), ['bug_id', 'href', 'summary'])
            assert set(bug.values()) in bug_values, (
                "Bug set(%s) not in %s" % (list(bug.values()), bug_values))

    def test_update_cves(self):
        notice = {'references': [{'type': 'cve',
                                  'id': "CVE-1234-5678"},
                                 {'type': 'cve',
                                  'id': "CVE-1234-123456"},
                                 {'type': 'cve',
                                  'id': "CVE-1234-5678"},
                                 {'type': 'this should be skipped'}],
                  'description': None}
        cves = self.reposync.RepoSync._update_cve(notice)

        self.assertCountEqual(cves, ["CVE-1234-5678", "CVE-1234-123456"])

    def test_update_cves_with_description(self):
        notice = {'references': [{'type': 'cve',
                                  'id': "CVE-1234-5678"},
                                 {'type': 'cve',
                                  'id': "CVE-1234-1234"},
                                 {'type': 'cve',
                                  'id': "CVE-1234-5678"},
                                 {'type': 'this should be skipped'}],
                  'description': 'This is a text with two CVE numbers CVE-1234-5678, CVE-1234-567901'}
        cves = self.reposync.RepoSync._update_cve(notice)

        self.assertCountEqual(cves, ["CVE-1234-567901", "CVE-1234-5678", "CVE-1234-1234"])


    def test_update_keywords_reboot(self):
        notice = {'reboot_suggested': True,
                  'restart_suggested': False}

        keyword = self.reposync.importLib.Keyword()
        keyword.populate({'keyword': 'reboot_suggested'})
        self.assertEqual(self.reposync.RepoSync._update_keywords(notice),
                         [keyword])

    def test_update_keywords_restart(self):
        notice = {'reboot_suggested': False,
                  'restart_suggested': True}

        keyword = self.reposync.importLib.Keyword()
        keyword.populate({'keyword': 'restart_suggested'})
        self.assertEqual(self.reposync.RepoSync._update_keywords(notice),
                         [keyword])

    def test_update_keywords_restart_and_reboot(self):
        notice = {'reboot_suggested': True,
                  'restart_suggested': True}

        keyword_restart = self.reposync.importLib.Keyword()
        keyword_restart.populate({'keyword': 'restart_suggested'})
        keyword_reboot = self.reposync.importLib.Keyword()
        keyword_reboot.populate({'keyword': 'reboot_suggested'})
        self.assertEqual(self.reposync.RepoSync._update_keywords(notice),
                         [keyword_reboot, keyword_restart])

    def test_update_keywords_both_false(self):
        notice = {'reboot_suggested': False,
                  'restart_suggested': False}

        self.assertEqual(self.reposync.RepoSync._update_keywords(notice),
                         [])

    def test_send_error_mail(self):
        rs = self._create_mocked_reposync()
        self.reposync.rhnMail.send = Mock()
        self.reposync.CFG.TRACEBACK_MAIL = 'recipient'
        self.reposync.hostname = 'testhost'

        rs.sendErrorMail('email body')

        self.assertEqual(self.reposync.rhnMail.send.call_args, (
                ({'To': 'recipient',
                  'From': 'testhost <recipient>',
                  'Subject': "SUSE Manager repository sync failed (testhost)"},
                 "Syncing Channel 'Label' failed:\n\nemail body"), {}))

    def test_updates_process_packages_simple(self):
        rs = self._create_mocked_reposync()

        packages = [{'name': 'n1',
                     'version': 'v1',
                     'release': 'r1',
                     'arch': 'arch1',
                     'channel_label': 'l1',
                     'epoch': []},
                    {'name': 'n2',
                     'version': 'v2',
                     'release': 'r2',
                     'arch': 'arch2',
                     'channel_label': 'l2',
                     'epoch': 'e2'}]
        checksum = {'epoch': None,
                    'checksum_type': None,
                    'checksum': None,
                    'id': None}

        _mock_rhnsql(self.reposync, checksum)
        processed = rs._updates_process_packages(packages, 'a name', [])
        for p in processed:
            self.assertTrue(isinstance(p, self.reposync.importLib.IncompletePackage))

    def test_updates_process_packages_returns_the_right_values(self):
        rs = self._create_mocked_reposync()

        packages = [{'name': 'n1',
                     'version': 'v1',
                     'release': 'r1',
                     'arch': 'arch1',
                     'epoch': []},
                    {'name': 'n2',
                     'version': 'v2',
                     'release': 'r2',
                     'arch': 'arch2',
                     'epoch': 'e2'}]

        checksum = {'epoch': 'cs_epoch',
                    'checksum_type': 'md5',
                    'checksum': '12345',
                    'id': 'cs_package_id'}

        _mock_rhnsql(self.reposync, checksum)
        processed = rs._updates_process_packages(packages, 'patchy', [])

        p1 = self.reposync.importLib.IncompletePackage()
        p1.populate({'package_size': None,
                     'name': 'n1',
                     'checksum_list': None,
                     'md5sum': None,
                     'org_id': 1,
                     'epoch': 'cs_epoch',
                     'channels': None,
                     'package_id': 'cs_package_id',
                     'last_modified': None,
                     'version': 'v1',
                     'checksum_type': 'md5',
                     'release': 'r1',
                     'checksums': {'md5': '12345'},
                     'checksum': '12345',
                     'arch': 'arch1'})
        p2 = self.reposync.importLib.IncompletePackage()
        p2.populate({'package_size': None,
                     'name': 'n2',
                     'checksum_list': None,
                     'md5sum': None,
                     'org_id': 1,
                     'epoch': 'cs_epoch',
                     'channels': None,
                     'package_id': 'cs_package_id',
                     'last_modified': None,
                     'version': 'v2',
                     'checksum_type': 'md5',
                     'release': 'r2',
                     'checksums': {'md5': '12345'},
                     'checksum': '12345',
                     'arch': 'arch2'})
        fixtures = [p1, p2]
        for pkg, fix in zip(processed, fixtures):
            self.assertEqual(pkg, fix)

    def test_updates_process_packages_checksum_not_found(self):
        rs = self._create_mocked_reposync()

        packages = [{'name': 'n2',
                     'version': 'v2',
                     'release': 'r2',
                     'arch': 'arch2',
                     'channel_label': 'l2',
                     'epoch': 'e2'}]
        ident = "%(name)s-%(epoch)s:%(version)s-%(release)s.%(arch)s" % packages[0]
        rs.available_packages[ident] = 1

        _mock_rhnsql(self.reposync, [])
        self.assertEqual(rs._updates_process_packages(packages, 'patchy', []),
                         [])
        self.assertEqual(self.reposync.log.call_args[0][1],
                "The package n2-e2:v2-r2.arch2 "
                "which is referenced by patch patchy was not found "
                "in the database. This patch has been skipped.")

    def test_updates_process_packages_checksum_not_found_no_epoch(self):
        rs = self._create_mocked_reposync()

        packages = [{'name': 'n1',
                     'version': 'v1',
                     'release': 'r1',
                     'arch': 'arch1',
                     'channel_label': 'l1',
                     'epoch': '' }]
        ident = "%(name)s-%(epoch)s%(version)s-%(release)s.%(arch)s" % packages[0]
        rs.available_packages[ident] = 1

        _mock_rhnsql(self.reposync, [])
        self.assertEqual(rs._updates_process_packages(packages, 'patchy', []),
                         [])
        self.assertEqual(self.reposync.log.call_args[0][1],
                "The package n1-v1-r1.arch1 "
                "which is referenced by patch patchy was not found "
                "in the database. This patch has been skipped.")

    def test_updates_process_packages_checksum_not_found_but_not_available(self):
        rs = self._create_mocked_reposync()

        packages = [{'name': 'n1',
                     'version': 'v1',
                     'release': 'r1',
                     'arch': 'arch1',
                     'channel_label': 'l1',
                     'epoch': '' }]

        _mock_rhnsql(self.reposync, [])
        self.assertEqual(rs._updates_process_packages(packages, 'patchy', []),
                         [])
        self.assertEqual(self.reposync.log.call_args, None)

    # RedHat has errata with empty package list
    # they removed the check - therefor this is disabled too
    #def test_upload_updates_referenced_package_not_found(self):
    #    timestamp1 = datetime.now().isoformat(' ')
    #    notices = [{'from': 'from1',
    #                'update_id': 'update_id1',
    #                'version': 'version1',
    #                'type': 'security',
    #                'severity': 'Low',
    #                'release': 'release1',
    #                'description': 'description1',
    #                'title': 'title1',
    #                'issued': timestamp1, # we mock _to_db_date anyway
    #                'updated': timestamp1,
    #                'pkglist': [{'packages': []}],
    #                'reboot_suggested': False,
    #                'restart_suggested': False,
    #                'references': None,
    #                }]
    #    self.reposync._to_db_date = Mock(return_value=timestamp1)

    #    # no packages related to this errata makes the ErrataImport be called
    #    # with an empty list
    #    self.reposync.RepoSync._updates_process_packages = Mock(return_value=[])
    #    self.reposync.get_errata = Mock(return_value=None)

    #    mocked_backend = Mock()
    #    self.reposync.SQLBackend = Mock(return_value=mocked_backend)
    #    self.reposync.ErrataImport = Mock()

    #    rs = self._create_mocked_reposync()
    #    rs._patch_naming = Mock(return_value='package-name')

    #    rs.upload_updates(notices)

    #    self.assertEqual(self.reposync.ErrataImport.call_args, None)

    def test_associate_package(self):
        pack = ContentPackage()
        pack.setNVREA('name1', 'version1', 'release1', 'epoch1', 'arch1')
        pack.unique_id = 1
        pack.a_pkg = rhn_rpm.RPM_Package(None)
        pack.a_pkg.checksum = 'checksum1'
        pack.a_pkg.checksum_type = 'c_type1'
        pack.a_pkg.header = {'epoch': 'epoch1'}
        pack.checksums[1] = 'checksum1'

        mocked_backend = Mock()
        self.reposync.SQLBackend = Mock(return_value=mocked_backend)
        rs = self._create_mocked_reposync()
        rs._importer_run = Mock()
        rs.channel_label = 'Label1'
        rs.channel = {'id': 'channel1', 'org_id': 1}

        package = {'name': 'name1',
                   'version': 'version1',
                   'release': 'release1',
                   'epoch': 'epoch1',
                   'arch': 'arch1',
                   'checksum': 'checksum1',
                   'checksum_type': 'c_type1',
                   'org_id': 1,
                   'channels': [{'label': 'Label1', 'id': 'channel1'}]}
        refpack = importLib.IncompletePackage().populate(package)
        ipack = rs.associate_package(pack)
        self.assertEqual(ipack, refpack)

    def test_get_errata_no_advisories_found(self):
        rs = self._create_mocked_reposync()
        _mock_rhnsql(self.reposync, None)
        self.assertEqual(rs.get_errata('bogus'), None)

    def test_get_errata_advisories_but_no_channels(self):
        rs = self._create_mocked_reposync()
        _mock_rhnsql(self.reposync, [{'id': 42}, []])
        self.assertEqual(rs.get_errata('bogus'),
                         {'channels': [], 'id': 42, 'packages': []})

    def test_get_errata_success(self):
        rs = self._create_mocked_reposync()
        _mock_rhnsql(self.reposync, [{'id': 42}, ['channel1', 'channel2']])
        self.assertEqual(rs.get_errata('bogus'),
                         {'id': 42, 'channels': ['channel1', 'channel2'],
                          'packages': []})

    def test_get_compat_arches(self):
        _mock_rhnsql(self.reposync, ({'label': 'a1'}, {'label':'a2'}))
        self.assertEqual(self.reposync.RepoSync.get_compatible_arches(None),
                         ['a1', 'a2'])

    def test_set_repo_credentials_no_credentials(self):
        url = {'source_url': "http://example.com"}
        rs = self._create_mocked_reposync()

        rs.set_repo_credentials(url)
        self.assertEqual(url['source_url'], "http://example.com")

    def test_set_repo_credentials_old_default_credentials_bad(self):
        url = {
            "source_url": [
                "http://example.com/?credentials=testcreds"
            ]
        }
        rs = self._create_mocked_reposync()
        self.assertRaises(SystemExit, rs.set_repo_credentials, url)

    def test_set_repo_credentials_bad_credentials(self):
        rs = self._init_reposync()
        rs.error_msg = Mock()
        url = {
            "source_url": [
                "http://example.com/?credentials=bad_creds_with_underscore"
            ]
        }
        self.assertRaises(SystemExit, rs.set_repo_credentials, url)

    def test_set_repo_credentials_number_credentials(self):
        rs = self._create_mocked_reposync()
        url = {
            "source_url": [
                "http://example.com/?credentials=testcreds_42"
            ]
        }
        _mock_rhnsql(self.reposync, [{ 'username' : 'foo', 'password': 'c2VjcmV0' }])
        self.assertEqual(
            rs.set_repo_credentials(url), ["http://foo:secret@example.com/"])

    def test_is_old_style(self):
        """
        Test for _is_old_suse_style
        """
        notice = {'from': 'maint-coord@suse.de',
                  'version': '1111',
                  'update_id': 'sles-kernel-default'}
        self.assertTrue(self.reposync.RepoSync._is_old_suse_style(notice))

        notice = {'from': 'maint-coord@suse.de',
                  'version': '7',
                  'update_id': 'res5ct-kernel-default'}
        self.assertTrue(self.reposync.RepoSync._is_old_suse_style(notice))

        notice = {'from': 'maint-coord@suse.de',
                  'version': '1',
                  'update_id': 'sles-kernel-default'}
        self.assertFalse(self.reposync.RepoSync._is_old_suse_style(notice))

        notice = {'from': 'maint-coord@suse.de',
                  'version': '6',
                  'update_id': 'res5ct-kernel-default'}
        self.assertFalse(self.reposync.RepoSync._is_old_suse_style(notice))

    def test_to_db_date(self):
        """
        Test for _to_db_date
        """
        # Unsure datetime.fromtimestamp is always returning UTC times
        class DateTimeMock(datetime):
            @classmethod
            def fromtimestamp(cls, timestamp):
                return cls.utcfromtimestamp(timestamp)

        with patch("spacewalk.satellite_tools.reposync.datetime", DateTimeMock):
            self.assertEqual(self.reposync.RepoSync._to_db_date('2015-01-02 01:02:03'), '2015-01-02 01:02:03')
            self.assertEqual(self.reposync.RepoSync._to_db_date('1420160523'), '2015-01-02 01:02:03')
            self.assertEqual(self.reposync.RepoSync._to_db_date('2015-01-02'), '2015-01-02 00:00:00')
            self.assertEqual(self.reposync.RepoSync._to_db_date('2015-09-02 13:39:49 UTC'), '2015-09-02 13:39:49')
            self.assertEqual(self.reposync.RepoSync._to_db_date('2015-01-02T02:02:03+0100'), '2015-01-02 01:02:03')
            self.assertRaises(ValueError, self.reposync.RepoSync._to_db_date, '2015-01-02T01:02:03+nonsense')

    def _init_reposync(self, label="Label", repo_type=RTYPE, **kwargs):
        """Initialize the RepoSync object with some mocked attrs"""
        self.reposync.RepoSync.get_compatible_arches = Mock(
            return_value=['arch1', 'arch2'])
        channel = {'org_id':1, 'id':1, 'arch': 'arch1'}
        self.reposync.RepoSync.load_channel = Mock(return_value=channel)
        rs = self.reposync.RepoSync(label, repo_type, **kwargs)
        return rs

    def _create_mocked_reposync(self):
        """Create a fully mocked RepoSync"""
        rs = self._init_reposync()
        rs.urls = [{'id': None, "source_url": ["http://none.host/bogus-url"], "metadata_signed": "N", "repo_label": None, 'repo_type': 'yum'}]
        rs = self._mock_sync(rs)

        return rs

    def _mock_sync(self, rs):
        """Mock a lot of the methods that are called during sync()

        erratum = reposync.Erratum()
        erratum.populate({'advisory_name': 'update_id1-version1-arch',
                          'advisory': 'update_id1-version1-arch',
                          'product': 'release1',
                          'description': 'description1',
                          'errata_from': 'from1',
                          'locally_modified': None,
                          'refers_to': '',
                          'solution': ' ',
                          'topic': ' ',
                          'last_modified': None,
                          'keywords': [],
                          'packages': [True],
                          'files': [],
                          'advisory_type': 'Security Advisory',
                          'issue_date': timestamp1,
                          'notes': '',
                          'org_id': 1,
                          'bugs': [],
                          'advisory_rel': 'version1',
                          'synopsis': 'title1',
                          'cve': [],
                          'update_date': timestamp2,
                          'channels': [{'label': 'Label'}]})
        self.assertEqual(reposync.ErrataImport.call_args,
                         (([erratum], mocked_backend), {}))
        :rs: RepoSync object on which we're going to call sync() later

        """
        rs.import_packages = Mock(return_value=0)
        rs.import_updates = Mock()
        rs.import_products = Mock()
        rs.import_susedata = Mock()
        rs.import_groups = Mock()
        rs.import_mediaproducts = Mock()
        rs.import_modules = Mock()
        self.reposync.taskomatic.add_to_repodata_queue_for_channel_package_subscription = Mock()
        self.reposync.taskomatic.add_to_erratacache_queue = Mock()
        self.reposync.log = Mock()

        rs.mocked_plugin = Mock()
        rs.mocked_plugin.num_packages = 0
        rs.load_plugin = Mock(return_value=Mock(return_value=rs.mocked_plugin))

        rs.update_date = Mock()

        self.reposync.initCFG = Mock()
        self.reposync.CFG = Mock()
        self.reposync.CFG.MOUNT_POINT = '/tmp'
        self.reposync.CFG.PREPENDED_DIR = ''
        self.reposync.CFG.AUTO_GENERATE_BOOTSTRAP_REPO = 1
        self.reposync.fileutils.createPath = Mock()
        self.reposync.os.walk = Mock(return_value=[])
        self.reposync.subprocess.call = Mock()
        return rs


class SyncTest(unittest.TestCase):

    def setUp(self):
        module_patcher = patch.multiple(
            'spacewalk.satellite_tools.reposync',
            rhnSQL=Mock()
        )
        class_patcher = patch.multiple(
            'spacewalk.satellite_tools.reposync.RepoSync',
            load_channel=Mock(
                return_value=dict(id="1", org_id=1, label="label#1")
            ),
            get_compatible_arches=Mock(),
            load_plugin=Mock(),
            import_packages=Mock(return_value=0),
            import_groups=Mock(),
            import_mediaproducts=Mock(),
            import_modules=Mock(),
            import_updates=Mock(),
            import_products=Mock(),
            import_susedata=Mock()
        )
        module_patcher.start()
        class_patcher.start()
        self.addCleanup(module_patcher.stop)
        self.addCleanup(class_patcher.stop)

    def test_pass_multiple_urls_params(self):
        from spacewalk.satellite_tools.reposync import RepoSync
        urls = ['http://some.url', 'http://some-other.url']
        repo_sync = RepoSync(
            channel_label="channel-label",
            repo_type=RTYPE,
            url=urls
        )
        repo_sync.sync()

    @patch('spacewalk.satellite_tools.reposync.RepoSync._url_with_repo_credentials')
    def test_set_repo_credentials_with_multiple_urls(self, mocked_method):
        from spacewalk.satellite_tools.reposync import RepoSync
        urls = ['http://some.url', 'http://some-other.url']
        data = {
            'metadata_signed': 'N',
            'repo_label': None,
            'id': None,
            'source_url': urls,
            'repo_type': 'yum'
        }
        repo_sync = RepoSync(
            channel_label="channel-label",
            repo_type=RTYPE,
            url=urls
        )
        repo_sync.set_repo_credentials(data)
        self.assertEqual(
            repo_sync._url_with_repo_credentials.call_args_list,
            [call(urls[0]), call(urls[1])]
        )

    def test__url_with_repo_credentials(self):
        import base64
        from spacewalk.satellite_tools.reposync import RepoSync
        credentials_id = 777
        urls = [
            'http://some.url?credentials=abc_%s' % credentials_id,
            'http://some-other.url'
        ]
        repo_sync = RepoSync(
            channel_label="channel-label",
            repo_type=RTYPE,
            url=urls
        )
        username = "user#1"
        password = "pass#1"
        config = {
            'return_value.fetchone_dict.return_value': {
                "username": "user#1",
                "password": base64.encodestring(password.encode()).decode()
            }
        }
        patcher = patch(
            'spacewalk.satellite_tools.reposync.rhnSQL.prepare', **config
        )
        with patcher as mock_prepare:
            self.assertEqual(
                repo_sync._url_with_repo_credentials(urls[0]),
                'http://{0}:{1}@some.url'.format(username, password)
            )
            mock_prepare.assert_called_once_with(
                'SELECT username, password FROM suseCredentials WHERE id = :id'
            )
            mock_prepare().execute.assert_called_once_with(id=credentials_id)

    def test_rhnSQL_should_return_source_urls_as_list(self):
        from spacewalk.satellite_tools.reposync import RepoSync
        url1 = 'http://url.one'
        url2 = 'http://url.two'
        patcher = patch(
            'spacewalk.satellite_tools.reposync.rhnSQL.prepare',
            **{
                'return_value.fetchall_dict.return_value': [
                    {
                        'metadata_signed': 'N',
                        'repo_label': 'channel-label-1',
                        'id': 508,
                        'source_url': url1,
                        'repo_type': 'yum'
                    },
                    {
                        'metadata_signed': 'Y',
                        'repo_label': 'channel-label-2',
                        'id': 509,
                        'source_url': url2,
                        'repo_type': 'yum'
                    }
                ]
            }
        )
        with patcher as mock_prepare:
            repo_sync = RepoSync(
                channel_label="channel-label",
                repo_type=RTYPE
            )
            self.assertEqual(
                repo_sync.urls,
                [
                    {
                        'metadata_signed': 'N',
                        'repo_label': 'channel-label-1',
                        'id': 508,
                        'source_url': [url1],
                        'repo_type': 'yum'
                    },
                    {
                        'metadata_signed': 'Y',
                        'repo_label': 'channel-label-2',
                        'id': 509,
                        'source_url': [url2],
                        'repo_type': 'yum'
                    }
                ]
            )


class RunScriptTest(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        cls.repo_sync = imp.load_source(
            'repo_sync',
            '/manager/backend/satellite_tools/spacewalk-repo-sync')

    def setUp(self):
        config = dict(
            os=Mock(**{'getuid.return_value': 0}),
            open=Mock(
                return_value=StringIO(
					json.dumps(
						{
							"no_errata": False,
							"sync_kickstart": False,
							"fail": True,
							"channel": {
								"chann_1": [
									"http://example.com/repo1",
									"http://example.com/repo2"
								],
								"chann_2": []
							}
						}
					)
                )
            ),
            rhnLockfile=Mock(),
            releaseLOCK=Mock(),
            OptionParser=Mock(
                **{
                    'return_value.parse_args.return_value': [
                        Mock(
                            # options
                            list=None,
                            dry_run=False,
                            config="example.conf",
                            channel_label=[],
                            parent_label=None,
                            batch_size=None
                        ),
                        []
                    ]
                }
            ),
            reposync=Mock(
                **{
                    'getCustomChannels.return_value': ['chann_1', 'chann_2'],
                    'getChannelRepo.return_value': {
                        'chann_1': 'abc',
                        'chann_2': 'def'
                    },
                    'RepoSync.return_value.sync.return_value': (timedelta(), 0)
                }
            ),
            systemExit=Mock(side_effect=[SystemExit])
        )
        patcher = patch.multiple('repo_sync', **config)
        patcher.start()
        self.addCleanup(patcher.stop)

    def test_config_parameter_channel_not_list(self):
        self.repo_sync.open.return_value = StringIO(
            json.dumps(
                {
                    "no_errata": False,
                    "sync_kickstart": False,
                    "fail": True,
                    "channel": {"chann_1": "http://example.com/repo1"}
                }
            )
        )
        self.assertRaises(SystemExit, self.repo_sync.main)
        self.repo_sync.systemExit.assert_called_once_with(
            1,
            "Configuration file is invalid, chann_1's value needs to be a list."
        )

    def test_config_parameter_channel_as_list(self):
        self.repo_sync.CFG = Mock()
        self.repo_sync.CFG.DEBUG = 3
        self.repo_sync.CFG.AUTO_GENERATE_BOOTSTRAP_REPO = 1
        self.repo_sync.main()
        self.assertEqual(self.repo_sync.reposync.RepoSync.call_count, 2)


def test_channel_exceptions():
    """Test rasising all the different exceptions when syncing"""
    # the only way to write a test generator with nose is if we put it
    # outside the class, so we have to repeat all the Mocks
    repoSync = spacewalk.satellite_tools.reposync
    repoSync.rhnLog.initLOG = Mock()
    repoSync.CFG = repoSync.initCFG = Mock()
    repoSync.CFG.MOUNT_POINT = '/tmp'
    repoSync.CFG.PREPENDED_DIR = ''
    repoSync.CFG.AUTO_GENERATE_BOOTSTRAP_REPO = 1
    repoSync.fileutils.createPath = Mock()
    repoSync.os.walk = Mock(return_value=[])
    backup_os = repoSync.os
    repoSync.os = Mock()
    repoSync.RepoSync._format_sources = Mock()
    repoSync.RepoSync.get_compatible_arches = Mock(return_value=['arch1', 'arch2'])
    rs = repoSync.RepoSync("Label", RTYPE)
    rs.urls = [{'id': None, "source_url": ["http://none.host/bogus-url"], "metadata_signed": "N", "repo_label": None, 'repo_type': 'yum'}]
    rs.import_packages = Mock(return_value=0)
    rs.import_updates = Mock()
    rs.mocked_plugin = Mock()
    rs.log = Mock()
    rs.load_plugin = Mock(return_value=rs.mocked_plugin)
    rs.update_date = Mock()
    rs.sendErrorMail = Mock()
    repoSync.os = backup_os

    for exc_class, exc_name in [
        (repoSync.ChannelException, "ChannelException"),
        (yum_src.RepoMDError, "RepoMDError")]:
        yield check_channel_exceptions, rs, exc_class, exc_name

def check_channel_exceptions(rs, exc_class, exc_name):
    # since this isn't a subclass of unittest.TestCase we can't use
    # unittest's assertions
    from nose.tools import assert_raises, assert_equal
    rs.load_plugin = Mock(return_value=Mock(side_effect=exc_class("error msg")))

    etime, ret = rs.sync()
    assert_equal(-1, ret)
    assert_equal(rs.sendErrorMail.call_args,
                 (("%s: %s" % (exc_name, "error msg"), ), {}))


def _mock_rhnsql(module, return_values):
    """Method to mock the rhnSQL to return something for us

    :module: the module where rhnSQL is called from
    :return_values: a list of the consecutive values that rhnSQL
    fetchall_dict/fetchone_dict will return. If it is just one value,
    then that value will be returned for all calls to those two methods.
    :return_value2: the second rhnSQL fetch will return this value

    rhnSQL's calls are a often a bit more complex. It usually goes
    like this: first an sql statement is prepared, then it is
    executed and then the result is fetched. We need to mock all
    that.

    Here's an example usage:

    query = rhnSQL.prepare('some sql statement')
    query.execute()
    result = query.fetchall_dict()

    """
    def side_effect(*args):
        # Raises or returns each of the values in return_values until exhausted
        # if return_values is not a list, the same value is returned ad infinitum
        if isinstance(return_values, list) and return_values:
            result = return_values.pop(0)
        else:
            result = return_values

        if isinstance(result, Exception):
            raise result
        return result

    # we're making prepare() return an object with methods that
    # return our desired return value
    query = Mock()
    returned_obj = Mock(side_effect=side_effect)
    query.fetchall_dict = query.fetchone_dict = returned_obj
    module.rhnSQL.execute = Mock(return_value=query)
    module.rhnSQL.prepare = Mock(return_value=query)
 0707010000010F000081B40000000000000000000000015FBBE8EE00001A1F000000000000000000000000000000000000003800000000spacewalk-backend/satellite_tools/test/unit/test_uln.py   # coding: utf-8
"""
Unit tests for the ULN authentication library.
"""
import sys
import pytest
from unittest.mock import MagicMock, patch

try:
    sys.path.insert(0, __file__.split("/test/unit")[0])
    import ulnauth
except ImportError as ex:
    ulnauth = None


def uln_auth_instance():
    """
    Instantiate ULNAuth.
    """
    return ulnauth.ULNAuth()


def cfg_parser():
    """
    Get cfgparser dummy class
    """
    class CfgParser(dict):
        cfg = {}
        def read(self, path):
            self["main"] = self.cfg

    return CfgParser


@pytest.mark.skipif(ulnauth is None, reason="'ulnauth' failed to be imported")
class TestULNAuth:
    """
    Test ULN auth.
    """
    def setUp(self):
        self.uln_auth_instance = uln_auth_instance()
        self.cfg_parser = cfg_parser()

    def test_get_hostname_uln(self):
        """
        Test ULN uri raises an exception if protocol is not ULN.
        """
        with pytest.raises(ulnauth.RhnSyncException) as exc:
            self.uln_auth_instance.get_hostname("foo://something/else")
        assert "URL must start with 'uln://'" in str(exc)

    def test_get_hostname_default(self):
        """
        Test ULN uri inserts a default hostname, if not specified.
        """
        hostname, path  = self.uln_auth_instance.get_hostname("uln:///suse")
        assert hostname == "https://{}".format(ulnauth.ULNAuth.ULN_DEFAULT_HOST)
        assert path == "suse"

    def test_get_hostname_custom(self):
        """
        Test ULN uri inserts a custom hostname, if specified.
        """
        hostname, path  = self.uln_auth_instance.get_hostname("uln://scc.suse.de/suse")
        assert hostname == "https://scc.suse.de"
        assert path == "suse"

    @patch("os.path.exists", MagicMock(return_value=False))
    @patch("os.access", MagicMock(return_value=False))
    def test_get_credentials_not_found(self):
        """
        Test credentials ULN configuration exists.
        """
        with pytest.raises(ulnauth.RhnSyncException) as exc:
            self.uln_auth_instance.get_credentials()
        assert "'/etc/rhn/spacewalk-repo-sync/uln.conf' does not exists" in str(exc)

    @patch("os.path.exists", MagicMock(return_value=True))
    @patch("os.access", MagicMock(return_value=False))
    def test_get_credentials_access_denied(self):
        """
        Test credentials ULN configuration readable.
        """
        with pytest.raises(ulnauth.RhnSyncException) as exc:
            self.uln_auth_instance.get_credentials()
        assert "Permission denied to '/etc/rhn/spacewalk-repo-sync/uln.conf'" in str(exc)

    @patch("os.path.exists", MagicMock(return_value=True))
    @patch("os.access", MagicMock(return_value=False))
    def test_get_credentials_access_denied(self):
        """
        Test credentials ULN configuration readable.
        """
        with pytest.raises(ulnauth.RhnSyncException) as exc:
            self.uln_auth_instance.get_credentials()
        assert "Permission denied to '/etc/rhn/spacewalk-repo-sync/uln.conf'" in str(exc)

    @patch("os.path.exists", MagicMock(return_value=True))
    @patch("os.access", MagicMock(return_value=True))
    def test_get_credentials_credentials(self):
        """
        Test credentials ULN
        """
        self.cfg_parser.cfg = {"username": "Darth Vader", "password": "f1ndE4rth"}
        with patch("configparser.ConfigParser", self.cfg_parser):
            username, password = self.uln_auth_instance.get_credentials()
            assert username == "Darth Vader"
            assert password == "f1ndE4rth"

    @patch("os.path.exists", MagicMock(return_value=True))
    @patch("os.access", MagicMock(return_value=True))
    def test_get_credentials_credentials_not_found(self):
        """
        Test credentials ULN was not found
        """
        with patch("configparser.ConfigParser", self.cfg_parser):
            with pytest.raises(AssertionError) as exc:
                self.uln_auth_instance.get_credentials()
            assert "Credentials were not found in the configuration" in str(exc)

    @patch("os.path.exists", MagicMock(return_value=True))
    @patch("os.access", MagicMock(return_value=True))
    def test_get_credentials_not_all_credentials_found(self):
        """
        Test partial credentials ULN found
        """
        self.cfg_parser.cfg = {"username": "Darth Vader"}
        with patch("configparser.ConfigParser", self.cfg_parser):
            with pytest.raises(AssertionError) as exc:
                self.uln_auth_instance.get_credentials()
            assert "Credentials were not found in the configuration" in str(exc)

        self.cfg_parser.cfg["password"] = "something"
        del self.cfg_parser.cfg["username"]
        with patch("configparser.ConfigParser", self.cfg_parser):
            with pytest.raises(AssertionError) as exc:
                self.uln_auth_instance.get_credentials()
            assert "Credentials were not found in the configuration" in str(exc)

    @patch("ulnauth.get_proxy", MagicMock(return_value=("https://my_http_proxy", "user", "password")))
    def test_auth_uln(self):
        """
        Authenticate ULN, getting its token.
        """

        class ServerList:
            """
            Dummy server list mock.
            """
            def server(self): pass

        server_list_instance = ServerList()
        server_list = MagicMock(return_value=server_list_instance)
        retry_server_instance = MagicMock()
        retry_server_instance.auth = MagicMock()
        retry_server_instance.auth.login = MagicMock(return_value="12345")
        retry_server = MagicMock(return_value=retry_server_instance)
        uri = "uln:///suse"
        with patch("ulnauth.ServerList", server_list) as srv_lst, patch("ulnauth.RetryServer", retry_server) as rtr_srv:
            self.uln_auth_instance.get_credentials = MagicMock(return_value=("uln_user", "uln_password",))
            token = self.uln_auth_instance.authenticate(uri)
            assert server_list.call_args_list[0][0] == (['https://linux-update.oracle.com/rpc/api'],)
            rs_call = retry_server.call_args_list[0][1]
            for p_name, p_val in {'refreshCallback': None, 'username': 'user',
                          'proxy': 'https://my_http_proxy', 'password': 'password', 'timeout': 5}.items():
                assert p_name in rs_call
                assert rs_call[p_name] == p_val

            assert retry_server_instance.addServerList.call_args_list[0][0] == (server_list_instance,)
            assert token == "12345"
            assert retry_server_instance.auth.login.call_args_list[0][0] == ("uln_user", "uln_password")
 07070100000110000081B40000000000000000000000015FBBE8EE000015A2000000000000000000000000000000000000003C00000000spacewalk-backend/satellite_tools/test/unit/test_yum_src.py   #!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright (c) 2011 SUSE LLC
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.

import os
import solv
import xml.etree.ElementTree as etree
import unittest
try:
    from io import StringIO
except ImportError:
    from StringIO import StringIO
from collections import namedtuple

import mock
from mock import Mock, MagicMock

from spacewalk.satellite_tools.repo_plugins import yum_src, ContentPackage

class YumSrcTest(unittest.TestCase):

    def _make_dummy_cs(self):
        """Create a dummy ContentSource object that only talks to a mocked yum"""
        real_setup_repo = yum_src.ContentSource.setup_repo
        yum_src.ContentSource.get_groups = Mock(return_value=None)

        # don't read configs
        mock.patch('spacewalk.common.suseLib.initCFG').start()
        mock.patch('spacewalk.common.suseLib.CFG').start()
        yum_src.initCFG = Mock()
        yum_src.CFG = Mock()
        yum_src.CFG.MOUNT_POINT = ''
        yum_src.CFG.PREPENDED_DIR = ''
        yum_src.fileutils.makedirs = Mock()
        yum_src.os.makedirs = Mock()
        yum_src.os.path.isdir = Mock()

        yum_src.get_proxy = Mock(return_value=(None, None, None))

        cs = yum_src.ContentSource("http://example.com", "test_repo", org='')
        mockReturnPackages = MagicMock()
        mockReturnPackages.returnPackages = MagicMock(name="returnPackages")
        mockReturnPackages.returnPackages.return_value = []
        cs.repo.is_configured = True
        cs.repo.includepkgs = []
        cs.repo.exclude = []

        yum_src.ContentSource.setup_repo = real_setup_repo

        return cs

    def test_content_source_init(self):
        cs = self._make_dummy_cs()

        self.assertFalse(cs.insecure)
        self.assertTrue(cs.interactive)
        assert isinstance(cs.repo, yum_src.ZypperRepo)

    @unittest.skip
    def test_list_packages_empty(self):
        cs = self._make_dummy_cs()

        os.path.isfile = Mock(return_value=True)
        solv.Pool = Mock()

        self.assertEqual(cs.list_packages(filters=None, latest=False), [])

    @unittest.skip
    def test_list_packages_with_pack(self):
        cs = self._make_dummy_cs()

        package_attrs = ['name', 'version', 'release',
                         'epoch', 'arch', 'checksums', 'repoid', 'pkgtup']
        Package = namedtuple('Package', package_attrs)
        mocked_packs = [Package('n1', 'v1', 'r1', 'e1', 'a1', [('c1', 'cs')], 'rid1', ('n1', 'a1', 'e1', 'v1', 'r1')),
                        Package('n2', 'v2', 'r2', 'e2', 'a2', [('c2', 'cs')], 'rid2', ('n2', 'a2', 'e2', 'v2', 'r2'))]

        os.path.isfile = Mock(return_value=True)
        solv.Pool = Mock()

        listed_packages = cs.list_packages(filters=None, latest=False)

        self.assertEqual(len(listed_packages), 2)
        for pack, mocked_pack in zip(listed_packages, mocked_packs):
            # listed_packages should return ContentPackages
            self.assertTrue(isinstance(pack, ContentPackage))

            # all the attributes should be rightly imported from yum's
            # returnPackages which we've mocked above
            for attr in package_attrs:
                if attr == 'checksums':
                    # checksums are transformed by list_packages from
                    # yum's list of tuples to ContentSource's dictionary
                    self.assertEqual(pack.checksums,
                                     {mocked_pack.checksums[0][0]:
                                          mocked_pack.checksums[0][1]})
                elif attr in ['repoid', 'pkgtup']:
                    continue
                else:
                    self.assertEqual(getattr(pack, attr),
                                     getattr(mocked_pack, attr))

    @unittest.skip
    def test_get_updates_suse_patches(self):
        cs = self._make_dummy_cs()

        patches_xml = StringIO(u"""<?xml version="1.0" encoding="UTF-8"?>
                <patches xmlns="http://novell.com/package/metadata/suse/patches">
                  <patch id="smcl3-cobbler-7778">
                    <checksum type="sha">ec34048ebda707a83190056d832d43c9fbb55ca6</checksum>
                    <location href="/patch-smcl3-cobbler-7778.xml"/>
                    <someother>weird element</someother>
                  </patch>
                  <patch id="smcl3-code11-update-stack-7779">
                    <checksum type="sha">51a736a468ebf53d7a4084cf0ca72a87427cdeba</checksum>
                    <location href="/patch-smcl3-code11-update-stack-7779.xml"/>
                  </patch>
                </patches>
                """)
        cs._md_exists = Mock(side_effect=[False, True, True])
        cs._retrieve_md_path = Mock(return_value="patches.xml")
        open = Mock(return_value=patches_xml)
        os.path.join = Mock(side_effect=lambda *args: StringIO(u"<xml></xml>"))

        patches = cs.get_updates()
        self.assertEqual(patches[0], 'patches')
        self.assertEqual(len(patches[1]), 2)
  07070100000111000081B40000000000000000000000015FBBE8EE00000EE7000000000000000000000000000000000000002D00000000spacewalk-backend/satellite_tools/ulnauth.py  # coding: utf-8
"""
Oracle ULN (Unbreakable Linux Network) authentication library.
"""
import os
import configparser
import urllib.parse

from spacewalk.common.suseLib import get_proxy
from spacewalk.satellite_tools.syncLib import RhnSyncException
from up2date_client.rpcServer import RetryServer, ServerList

from spacewalk.common.rhnConfig import initCFG

import logging
log = logging.getLogger(__name__)


class ULNTokenException(Exception):
    """
    This class represent an exception getting the ULN token
    """
    pass


class ULNAuth:
    """
    ULN Authentication.
    """
    ULN_CONF_PATH = "/etc/rhn/spacewalk-repo-sync/uln.conf"
    ULN_DEFAULT_HOST = "linux-update.oracle.com"

    def __init__(self):
        initCFG("server.satellite")
        self._uln_token = None
        self._uln_url = None

    @property
    def token(self):
        """
        Return ULN token, if authorised.
        """
        return self._uln_token

    @property
    def url(self):
        """
        Return ULN URL for the access.
        """
        return self._uln_url

    def get_hostname(self, url: str) -> tuple:
        """
        Get label from the URL (a hostname).

        :raises RhnSyncException: if URL is wrongly formatted.
        :returns: tuple (hostname, label)
        """
        if url.startswith("uln:///"):
            return "https://" + self.ULN_DEFAULT_HOST, url[7:]
        elif url.startswith("uln://"):
            parts = url[6:].split("/")
            return "https://" + parts[0], "/".join(parts[1:])
        else:
            raise RhnSyncException("URL must start with 'uln://'.")


    def get_credentials(self) -> tuple:
        """
        Get credentials from the uln.conf

        :raises AssertionError: if configuration does not contain required sections.
        :returns: tuple of username and password
        """
        if not os.path.exists(self.ULN_CONF_PATH):
            raise RhnSyncException("'{}' does not exists".format(self.ULN_CONF_PATH))
        elif not os.access(self.ULN_CONF_PATH, os.R_OK):
            raise RhnSyncException("Permission denied to '{}'".format(self.ULN_CONF_PATH))

        config = configparser.ConfigParser()
        config.read(self.ULN_CONF_PATH)
        if "main" in config:
            sct = config["main"]
            username, password = sct.get("username"), sct.get("password")
        else:
            username = password = None
        assert username is not None and password is not None, "Credentials were not found in the configuration"

        return username, password

    def authenticate(self, url):
        """
        Get ULN token.

        :raises RhnSyncException: if configuration does not contain required sections.
        :returns: ULN token
        """
        err_msg = ''
        if self._uln_token is None:
            try:
                usr, pwd = self.get_credentials()
                self._uln_url, label = self.get_hostname(url)
                px_url, px_usr, px_pwd = get_proxy(self._uln_url)
                server_list = ServerList([self._uln_url + "/rpc/api"])
                retry_server = RetryServer(server_list.server(),
                                           refreshCallback=None,
                                           proxy=px_url,
                                           username=px_usr,
                                           password=px_pwd,
                                           timeout=5)
                retry_server.addServerList(server_list)
                self._uln_token = retry_server.auth.login(usr, pwd)
            except Exception as exc:
                err_msg = exc

        if not self.token or err_msg:
            raise ULNTokenException("Authentication failure: token was not obtained. {}".format(err_msg))

        return self.token
 07070100000112000081FD0000000000000000000000015FBBE8EE00000A02000000000000000000000000000000000000003200000000spacewalk-backend/satellite_tools/update-packages #!/usr/bin/python
#
# wrapper for Script to update pacakge paths and gpg key ids.
#
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# Authors: Pradeep Kilambi
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#


if __name__ != '__main__':
    raise ImportError("module cannot be imported")

import sys


def systemExit(code, msgs=None):
    "Exit with a code and optional message(s). Saved a few lines of code."

    if msgs:
        if type(msgs) not in [type([]), type(())]:
            msgs = (msgs, )
        for msg in msgs:
            sys.stderr.write(str(msg) + '\n')
    sys.exit(code)


import os

# quick check to see if you are a super-user.
if os.getuid() != 0:
    sys.stderr.write('ERROR: must be root to execute\n')
    sys.exit(8)


try:
    from rhn import rhnLockfile
except KeyboardInterrupt:
    systemExit(0, "\nUser interrupted process.")
except ImportError:
    sys.stderr.write("Unable to find RHN code tree.\n"
                     "Path not correct? '%s'\n" % _LIBPATH)
    raise


# acquire lock/check for other instances of update packages
#   i.e., lock against multiple instances of updatePackages
LOCK = None
try:
    LOCK = rhnLockfile.Lockfile('/var/run/update-packages.pid')
except rhnLockfile.LockfileLockedException:
    systemExit(1, "ERROR: attempting to run more than one instance of update-packages. Exiting.")

try:
    # NOTE: importing
    from spacewalk.satellite_tools import updatePackages
except KeyboardInterrupt:
    systemExit(0, "\nUser interrupted process.")
except ImportError as e:
    systemExit(2, "Unable to find update package tool.\n"
                  "Error: %s" % e)


def releaseLOCK():
    global LOCK
    if LOCK:
        LOCK.release()


def main():
    # execute
    try:
        return updatePackages.main()
    except KeyboardInterrupt:
        systemExit(0, "\nUser interrupted process.")

    releaseLOCK()
    return 0


if __name__ == '__main__':
    try:
        sys.exit(abs(main() or 0))
    except KeyboardInterrupt:
        systemExit(0, "\nUser interrupted process.")
  07070100000113000081B40000000000000000000000015FBBE8EE000009BE000000000000000000000000000000000000003700000000spacewalk-backend/satellite_tools/update-packages.sgml    <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V3.1//EN">
<refentry>

<RefMeta>
<RefEntryTitle>update-packages</RefEntryTitle><manvolnum>8</manvolnum>
</RefMeta>

<RefNameDiv>
<RefName><command>update-packages</command></RefName>
<RefPurpose>
Migration script for nvrea issue to migrate already existing paths and include the package gpg key id for different providers.
</RefPurpose>
</RefNameDiv>

<RefSynopsisDiv>
<Synopsis>
    <cmdsynopsis>
        <command>update-packages</command>
    </cmdsynopsis>
</Synopsis>
</RefSynopsisDiv>

<RefSect1><Title>Description</Title>

<para>
Running this script is necessary if you are upgrading from RHN Satellite 5.2.
If you're upgrading from RHN Satellite 5.3, this step can be safely skipped.
</para>
<para>
Run update-packages script as root:
<programlisting>
  /usr/bin/update-packages \
        --update-filer \
        --update-kstrees \
        --debug
</programlisting>
</para>
<para>
The --debug option will direct the script to log all actions into /var/log/rhn/update-packages.log
</para>
<para>
* Time estimate: the time required for whole conversion depends on the current
size of your filer and the speed of your hardware. Assume 60 - 120 GB / hour.
</para>
</RefSect1>

<RefSect1><Title>Options</Title>
<variablelist>
    <varlistentry>
        <term>--help</term>
        <listitem>
            <para>Display usage and exit.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>-v, --verbose</term>
        <listitem>
            <para>Increase verbosity.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--debug</term>
        <listitem>
            <para>Logs the debug information to a log file /var/log/rhn/update-packages.log</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--update-sha256</term>
        <listitem>
            <para>Update SHA-256 capable packages.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--update-filer</term>
        <listitem>
            <para>Convert filer structure.</para>
        </listitem>
    </varlistentry>
    <varlistentry>
        <term>--update-kstrees</term>
        <listitem>
            <para>Fix kickstart trees permissions.</para>
        </listitem>
    </varlistentry>

</variablelist>
</RefSect1>

<RefSect1><Title>Authors</Title>
<simplelist>
    <member>Pradeep Kilambi <email>pkilambi@redhat.com</email></member>
</simplelist>
</RefSect1>
</RefEntry>
  07070100000114000081B40000000000000000000000015FBBE8EE00005FE6000000000000000000000000000000000000003400000000spacewalk-backend/satellite_tools/updatePackages.py   #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# Authors: Pradeep Kilambi
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

import sys
import os
import shutil

from optparse import Option, OptionParser
from spacewalk.common.rhnLog import initLOG, rhnLog
from spacewalk.common.rhnConfig import CFG, initCFG
from uyuni.common import rhn_rpm
from spacewalk.server.rhnLib import parseRPMFilename, get_package_path
from spacewalk.server import rhnSQL, rhnPackageUpload
from spacewalk.server.rhnServer import server_packages
from spacewalk.satellite_tools.progress_bar import ProgressBar
from uyuni.common.checksum import getFileChecksum
from spacewalk.server.importlib import mpmSource

initCFG('server.satellite')
initLOG(CFG.LOG_FILE, CFG.DEBUG)

OPTIONS = None
debug = 0
verbose = 0

options_table = [
    Option("--update-package-files", action="store_true",
           help="Update package files (bugs #659348, #652852)"),
    Option("--update-sha256", action="store_true",
           help="Update SHA-256 capable packages"),
    Option("--update-filer", action="store_true",
           help="Convert filer structure"),
    Option("--update-kstrees", action="store_true",
           help="Fix kickstart trees permissions"),
    Option("--update-changelog", action="store_true",
           help="Fix incorrectly encoded package changelog data"),
    Option("-v", "--verbose", action="count",
           help="Increase verbosity"),
    Option("--debug", action="store_true",
           help="Log the debug information to a log file"),
]


def main():
    global debug, verbose
    parser = OptionParser(option_list=options_table)

    (options, args) = parser.parse_args()

    if args:
        for arg in args:
            sys.stderr.write("Not a valid option ('%s'), try --help\n" % arg)
        sys.exit(-1)

    if options.verbose:
        initLOG("stdout", options.verbose or 0)
        verbose = 1

    if options.debug:
        initLOG(CFG.LOG_FILE, options.debug or 0)
        debug = 1

    rhnSQL.initDB()

    if options.update_filer:
        process_package_data()

    if options.update_sha256:
        process_sha256_packages()

    if options.update_kstrees:
        process_kickstart_trees()

    if options.update_package_files:
        process_package_files()

    if options.update_changelog:
        process_changelog()

_get_path_query = """
        select id, checksum_type, checksum, path, epoch, new_path
        from (
                select rhnPackage.id,
                       rhnChecksumView.checksum_type,
                       rhnChecksumView.checksum,
                       rhnPackage.path,
                       rhnPackageEvr.epoch,
                        case when rhnPackage.org_id is null then 'NULL'
                             else rhnPackage.org_id || '' end
                        || '/' || substr(rhnChecksumView.checksum, 1, 3)
                        || '/' || rhnPackageName.name
                        || '/' || case when rhnPackageEvr.epoch is null then ''
                                       else rhnPackageEvr.epoch || ':' end
                        || rhnPackageEvr.version || '-' || rhnPackageEvr.release
                        || '/' || rhnPackageArch.label
                        || '/' || rhnChecksumView.checksum
                        || substr(rhnPackage.path, instr(rhnPackage.path, '/', -1))
                        as new_path
                from rhnPackage, rhnPackagename, rhnPackageEvr, rhnPackageArch, rhnChecksumView
                where rhnPackage.name_id = rhnPackageName.id
                        and rhnPackage.evr_id = rhnPackageEvr.id
                        and rhnPackage.package_arch_id = rhnPackageArch.id
                        and rhnPackage.checksum_id = rhnChecksumView.id
                ) X
        where '/' || new_path <> nvl(substr(path, -length(new_path) - 1), 'x')
"""

_update_pkg_path_query = """
    update rhnPackage
       set path = :new_path
    where id = :the_id
"""


def process_package_data():
    if debug:
        log = rhnLog('/var/log/rhn/update-packages.log', 5)

    _get_path_sql = rhnSQL.prepare(_get_path_query)
    _update_package_path = rhnSQL.prepare(_update_pkg_path_query)

    _get_path_sql.execute()
    paths = _get_path_sql.fetchall_dict()

    if not paths:
        # Nothing to change
        return
    if verbose:
        print(("Processing %s packages" % len(paths)))
    pb = ProgressBar(prompt='standby: ', endTag=' - Complete!',
                     finalSize=len(paths), finalBarLength=40, stream=sys.stdout)
    pb.printAll(1)
    skip_list = []
    new_ok_list = []
    i = 0
    for path in paths:
        pb.addTo(1)
        pb.printIncrement()
        old_path_nvrea = path['path'].split('/')
        org_id = old_path_nvrea[1]
        # pylint: disable=W0703
        try:
            nevra = parseRPMFilename(old_path_nvrea[-1])
            if nevra[1] in [None, '']:
                nevra[1] = path['epoch']
        except Exception:
            # probably not an rpm skip
            if debug:
                log.writeMessage("Skipping: %s Not a valid rpm"
                                 % old_path_nvrea[-1])
            continue
        old_abs_path = os.path.join(CFG.MOUNT_POINT, path['path'])

        checksum_type = path['checksum_type']
        checksum = path['checksum']
        new_path = get_package_path(nevra, org_id, prepend=old_path_nvrea[0],
                                    checksum=checksum)
        new_abs_path = os.path.join(CFG.MOUNT_POINT, new_path)

        bad_abs_path = os.path.join(CFG.MOUNT_POINT,
                                    get_package_path(nevra, org_id, prepend=old_path_nvrea[0],
                                                     omit_epoch=True, checksum=checksum))

        if not os.path.exists(old_abs_path):
            if os.path.exists(new_abs_path):
                new_ok_list.append(new_abs_path)
                if debug:
                    log.writeMessage("File %s already on final path %s" % (path['path'], new_abs_path))
                old_abs_path = new_abs_path
            elif os.path.exists(bad_abs_path):
                log.writeMessage("File %s found on %s" % (path['path'], bad_abs_path))
                old_abs_path = bad_abs_path
            else:
                skip_list.append(old_abs_path)
                if debug:
                    log.writeMessage("Missing path %s for package %d" % (old_abs_path, path['id']))
                continue

        # pylint: disable=W0703
        try:
            hdr = rhn_rpm.get_package_header(filename=old_abs_path)
        except Exception:
            e = sys.exc_info()[1]
            msg = "Exception occurred when reading package header %s: %s" % \
                (old_abs_path, str(e))
            print(msg)
            if debug:
                log.writeMessage(msg)
            rhnSQL.commit()
            sys.exit(1)

        if old_abs_path != new_abs_path:
            new_abs_dir = os.path.dirname(new_abs_path)
            # relocate the package on the filer
            if debug:
                log.writeMessage("Relocating %s to %s on filer"
                                 % (old_abs_path, new_abs_path))
            if not os.path.isdir(new_abs_dir):
                os.makedirs(new_abs_dir)
            shutil.move(old_abs_path, new_abs_path)
            # Clean up left overs
            os.removedirs(os.path.dirname(old_abs_path))
            # make the path readable
            os.chmod(new_abs_path, int('0644', 8))

        # Update the db paths
        _update_package_path.execute(the_id=path['id'],
                                     new_path=new_path)
        if debug:
            log.writeMessage("query Executed: update rhnPackage %d to %s"
                             % (path['id'], new_path))
        # Process gpg key ids
        server_packages.processPackageKeyAssociations(hdr, checksum_type, checksum)
        if debug:
            log.writeMessage("gpg key info updated from %s" % new_abs_path)
        i = i + 1
        # we need to break the transaction to smaller pieces
        if i % 1000 == 0:
            rhnSQL.commit()
    pb.printComplete()
    # All done, final commit
    rhnSQL.commit()
    sys.stderr.write("Transaction Committed! \n")
    if verbose:
        print((" Skipping %s packages, paths not found" % len(skip_list)))
    if new_ok_list and verbose:
        print((" There were %s packages found in the correct location" % len(new_ok_list)))
    return


def process_kickstart_trees():
    for root, _dirs, files in os.walk(CFG.MOUNT_POINT + "/rhn/"):
        for name in files:
            os.chmod(root + '/' + name, int('0644', 8))

_get_sha256_packages_query = """
select p.id, p.path
from rhnPackage p,
     rhnPackageRequires pr,
     rhnPackageCapability pc,
     rhnChecksumView cv
where pr.package_id = p.id and
      pr.capability_id = pc.id and
      pc.name = 'rpmlib(FileDigests)' and
      pc.version = '4.6.0-1' and
      cv.id = p.checksum_id and
      cv.checksum_type = 'md5'
"""

_update_sha256_package = """
update rhnPackage
set checksum_id = lookup_checksum(:ctype, :csum),
    path = :path
where id = :id
"""

_select_checksum_type_id = """
select id from rhnChecksumType where label = :ctype
"""

_update_package_files = """
declare
    checksum_id number;
begin
    begin
        insert into rhnChecksum values (
            sequence_nextval('rhnChecksum_seq'),
            :ctype_id,
            :csum ) returning id into checksum_id;
    exception when dup_val_on_index then
        select c.id
        into checksum_id
        from rhnChecksum c
        where c.checksum = :csum and
              c.checksum_type_id = :ctype_id;
    end;

    update rhnPackageFile p
    set p.checksum_id = checksum_id
    where p.capability_id = (
        select c.id
        from rhnPackageCapability c
        where p.package_id = :pid and
              c.name = :filename
    ) and p.package_id = :pid;
end;
"""


def process_sha256_packages():
    if debug:
        log = rhnLog('/var/log/rhn/update-packages.log', 5)

    _get_sha256_packages_sql = rhnSQL.prepare(_get_sha256_packages_query)
    _get_sha256_packages_sql.execute()
    packages = _get_sha256_packages_sql.fetchall_dict()

    if not packages:
        print("No SHA256 capable packages to process.")
        if debug:
            log.writeMessage("No SHA256 capable packages to process.")

        return

    if verbose:
        print(("Processing %s SHA256 capable packages" % len(packages)))

    pb = ProgressBar(prompt='standby: ', endTag=' - Complete!',
                     finalSize=len(packages), finalBarLength=40, stream=sys.stdout)
    pb.printAll(1)

    _update_sha256_package_sql = rhnSQL.prepare(_update_sha256_package)
    _update_package_files_sql = rhnSQL.prepare(_update_package_files)

    for package in packages:
        pb.addTo(1)
        pb.printIncrement()

        old_abs_path = os.path.join(CFG.MOUNT_POINT, package['path'])
        if debug and verbose:
            log.writeMessage("Processing package: %s" % old_abs_path)
        temp_file = open(old_abs_path, 'rb')
        header, _payload_stream, _header_start, _header_end = \
            rhnPackageUpload.load_package(temp_file)
        checksum_type = header.checksum_type()
        checksum = getFileChecksum(checksum_type, file_obj=temp_file)

        old_path = package['path'].split('/')
        nevra = parseRPMFilename(old_path[-1])
        org_id = old_path[1]
        new_path = get_package_path(nevra, org_id, prepend=old_path[0], checksum=checksum)
        new_abs_path = os.path.join(CFG.MOUNT_POINT, new_path)

        # Filer content relocation
        try:
            if old_abs_path != new_abs_path:
                if debug:
                    log.writeMessage("Relocating %s to %s on filer" % (old_abs_path, new_abs_path))

                new_abs_dir = os.path.dirname(new_abs_path)
                if not os.path.isdir(new_abs_dir):
                    os.makedirs(new_abs_dir)

                # link() the old path to the new path
                if not os.path.exists(new_abs_path):
                    os.link(old_abs_path, new_abs_path)
                elif debug:
                    log.writeMessage("File %s already exists" % new_abs_path)

                # Make the new path readable
                os.chmod(new_abs_path, int('0644', 8))
        except OSError:
            e = sys.exc_info()[1]
            message = "Error when relocating %s to %s on filer: %s" % \
                      (old_abs_path, new_abs_path, str(e))
            print(message)
            if debug:
                log.writeMessage(message)
            sys.exit(1)

        # Update package checksum in the database
        _update_sha256_package_sql.execute(ctype=checksum_type, csum=checksum,
                                           path=new_path, id=package['id'])

        _select_checksum_type_id_sql = rhnSQL.prepare(_select_checksum_type_id)
        _select_checksum_type_id_sql.execute(ctype=checksum_type)
        checksum_type_id = _select_checksum_type_id_sql.fetchone()[0]

        # Update checksum of every single file in a package
        for i, f in enumerate(header['filenames']):
            csum = header['filemd5s'][i]

            # Do not update checksums for directories & links
            if not csum:
                continue

            _update_package_files_sql.execute(ctype_id=checksum_type_id, csum=csum,
                                              pid=package['id'], filename=f)

        rhnSQL.commit()

        try:
            if os.path.exists(old_abs_path):
                os.unlink(old_abs_path)
            if os.path.exists(os.path.dirname(old_abs_path)):
                os.removedirs(os.path.dirname(old_abs_path))
        except OSError:
            e = sys.exc_info()[1]
            message = "Error when removing %s: %s" % (old_abs_path, str(e))
            print(message)
            if debug:
                log.writeMessage(message)

            sys.exit(1)

    pb.printComplete()

package_query = """
    select p.id as id,
           p.path as path,
           count(pf.capability_id) as filecount,
           count(pf.checksum_id) as nonnullcsums
      from rhnPackage p left outer join rhnPackageFile pf
        on p.id = pf.package_id
     where path is not null
  group by id, path
"""

package_capabilities = """
    select PC.name,
           PF.package_id,
           PF.capability_id,
           C.checksum,
           C.checksum_type
      from rhnPackageFile PF left outer join rhnChecksumView C
        on PF.checksum_id = C.id,
           rhnPackageCapability PC
     where PC.id = PF.capability_id and
           PF.package_id = :pid
"""

update_packagefile_checksum = """
    update rhnPackageFile
       set checksum_id = lookup_checksum(:ctype, :csum)
     where package_id = :pid and
           capability_id = :cid
"""

insert_packagefile = """
    insert into rhnPackageFile (
            package_id, capability_id, device, inode, file_mode, username,
            groupname, rdev, file_size, mtime, linkto, flags, verifyflags,
            lang, checksum_id
           )
    values (
            :pid, lookup_package_capability(:name, null),
            :device, :inode, :file_mode, :username, :groupname,
            :rdev, :file_size, to_timestamp(:mtime, 'YYYY-MM-DD HH24:MI:SS'), :linkto,
            :flags, :verifyflags, :lang, lookup_checksum(:ctype, :csum)
           )
"""

package_name_query = """
    select pn.name as name,
           evr_t_as_vre_simple(pevr.evr) as vre,
           pa.label as arch
      from rhnPackage p,
           rhnPackageName pn,
           rhnPackageEVR pevr,
           rhnPackageArch pa
     where p.id = :pid and
           p.name_id = pn.id and
           p.evr_id = pevr.id and
           p.package_arch_id = pa.id
"""

package_repodata_delete = """
    delete
          from rhnPackageRepoData
         where package_id = :pid
"""


def process_package_files():
    def parse_header(header):
        checksum_type = rhn_rpm.RPM_Header(header).checksum_type()
        return mpmSource.create_package(header, size=0,
                                        checksum_type=checksum_type, checksum=None, relpath=None,
                                        org_id=None, header_start=None, header_end=None, channels=[])

    package_name_h = rhnSQL.prepare(package_name_query)

    def package_name(pid):
        package_name_h.execute(pid=pid)
        r = package_name_h.fetchall_dict()[0]
        return "%s-%s.%s" % (r['name'], r['vre'], r['arch'])

    package_repodata_h = rhnSQL.prepare(package_repodata_delete)

    def delete_package_repodata(pid):
        package_repodata_h.execute(pid=pid)

    log = rhnLog('/var/log/rhn/update-packages.log', 5)

    package_query_h = rhnSQL.prepare(package_query)
    package_query_h.execute()

    package_capabilities_h = rhnSQL.prepare(package_capabilities)
    update_packagefile_checksum_h = rhnSQL.prepare(update_packagefile_checksum)
    insert_packagefile_h = rhnSQL.prepare(insert_packagefile)

    while (True):
        row = package_query_h.fetchone_dict()
        if not row:  # No more packages in DB to process
            break

        package_path = os.path.join(CFG.MOUNT_POINT, row['path'])

        if not os.path.exists(package_path):
            if debug:
                log.writeMessage("Package path '%s' does not exist." % package_path)
            continue

        # pylint: disable=W0703
        try:
            hdr = rhn_rpm.get_package_header(filename=package_path)
        except Exception:
            e = sys.exc_info()[1]
            message = "Error when reading package %s header: %s" % (package_path, e)
            if debug:
                log.writeMessage(message)
            continue

        pkg_updates = 0
        if row['filecount'] != len(hdr['filenames']):
            # Number of package files on disk and in the DB do not match
            # (possibly a bug #652852). We have to correct them one by one.
            package_capabilities_h.execute(pid=row['id'])
            pkg_caps = {}  # file-name : capabilities dictionary
            for cap in package_capabilities_h.fetchall_dict() or []:
                pkg_caps[cap['name']] = cap

            for f in parse_header(hdr)['files']:
                if f['name'] in pkg_caps:
                    continue  # The package files exists in the DB

                # Insert the missing package file into DB
                insert_packagefile_h.execute(pid=row['id'], name=f['name'],
                                             ctype=f['checksum_type'], csum=f['checksum'], device=f['device'],
                                             inode=f['inode'], file_mode=f['file_mode'], username=f['username'],
                                             groupname=f['groupname'], rdev=f['rdev'], file_size=f['file_size'],
                                             mtime=f['mtime'], linkto=f['linkto'], flags=f['flags'],
                                             verifyflags=f['verifyflags'], lang=f['lang'])
                pkg_updates += 1

            if debug and pkg_updates:
                log.writeMessage("Package id: %s, name: %s, %s files inserted" %
                                 (row['id'], package_name(row['id']), pkg_updates))
        elif row['nonnullcsums'] == 0:
            # All package files in the DB have null checksum (possibly a bug #659348)
            package_capabilities_h.execute(pid=row['id'])
            pkg_caps = {}  # file-name : capabilities dictionary
            for cap in package_capabilities_h.fetchall_dict() or []:
                pkg_caps[cap['name']] = cap

            for f in parse_header(hdr)['files']:
                if f['checksum'] == '':  # Convert empty string (symlinks) to None to match w/ Oracle returns
                    f['checksum'] = None

                caps = pkg_caps[f['name']]

                if not caps['checksum'] == f['checksum']:
                    # Package file exists, but its checksum in the DB is incorrect
                    update_packagefile_checksum_h.execute(ctype=f['checksum_type'], csum=f['checksum'],
                                                          pid=caps['package_id'], cid=caps['capability_id'])
                    pkg_updates += 1

            if debug and pkg_updates:
                log.writeMessage("Package id: %s, name: %s, %s checksums updated" %
                                 (row['id'], package_name(row['id']), pkg_updates))

        if pkg_updates:
            log.writeMessage("Package id: %s, purging rhnPackageRepoData" % row['id'])
            delete_package_repodata(row['id'])

        rhnSQL.commit()  # End of a package


def process_changelog():
    def convert(u):
        last = ''
        while u != last:
            last = u
            try:
                u = last.encode('iso8859-1').decode('utf8')
            except (UnicodeDecodeError, UnicodeEncodeError):
                e = sys.exc_info()[1]
                if e.reason == 'unexpected end of data':
                    u = u[:-1]
                    continue
                else:
                    break
        return u

    if CFG.db_backend == 'postgresql':
        lengthb = "octet_length(%s)"
    else:
        lengthb = "lengthb(%s)"
    _non_ascii_changelog_data_count = """select count(*) as cnt from rhnpackagechangelogdata
                                          where length(name) <> %s
                                             or length(text) <> %s
        """ % (lengthb % 'name', lengthb % 'text')
    _non_ascii_changelog_data = """select * from rhnpackagechangelogdata
                                    where length(name) <> %s
                                       or length(text) <> %s
        """ % (lengthb % 'name', lengthb % 'text')
    _update_changelog_data_name = """update rhnpackagechangelogdata set name = :name
                                           where id = :id"""
    _update_changelog_data_text = """update rhnpackagechangelogdata set text = :text
                                           where id = :id"""
    if debug:
        log = rhnLog('/var/log/rhn/update-packages.log', 5)

    query_count = rhnSQL.prepare(_non_ascii_changelog_data_count)
    query_count.execute()
    nrows = query_count.fetchall_dict()[0]['cnt']

    query = rhnSQL.prepare(_non_ascii_changelog_data)
    query.execute()

    if nrows == 0:
        msg = "No non-ASCII changelog entries to process."
        print(msg)
        if debug:
            log.writeMessage(msg)
        return

    if verbose:
        print(("Processing %s non-ASCII changelog entries" % nrows))

    pb = ProgressBar(prompt='standby: ', endTag=' - Complete!',
                     finalSize=nrows, finalBarLength=40, stream=sys.stdout)
    pb.printAll(1)

    update_name = rhnSQL.prepare(_update_changelog_data_name)
    update_text = rhnSQL.prepare(_update_changelog_data_text)

    while (True):
        row = query.fetchone_dict()
        if not row:  # No more packages in DB to process
            break

        pb.addTo(1)
        pb.printIncrement()

        name_u = row['name'].decode('utf8', 'ignore')
        name_fixed = name_u
        if len(row['name']) != len(name_u):
            name_fixed = convert(name_u)
        if name_fixed != name_u:
            if debug and verbose:
                log.writeMessage("Fixing record %s: name: '%s'" % (row['id'], row['name']))
            update_name.execute(id=row['id'], name=name_fixed)

        text_u = row['text'].decode('utf8', 'ignore')
        text_fixed = text_u
        if len(row['text']) != len(text_u):
            text_fixed = convert(text_u)
        if text_fixed != text_u:
            if debug and verbose:
                log.writeMessage("Fixing record %s: text: '%s'" % (row['id'], row['text']))
            update_text.execute(id=row['id'], text=text_fixed)

        rhnSQL.commit()

    pb.printComplete()


if __name__ == '__main__':
    main()
  07070100000115000081B40000000000000000000000015FBBE8EE00003267000000000000000000000000000000000000003300000000spacewalk-backend/satellite_tools/xmlDiskSource.py    #
# Abstraction for an XML importer with a disk base
#
# Copyright (c) 2008--2018 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import os
import gzip
from uyuni.common.fileutils import createPath
from uyuni.common.rhnLib import hash_object_id


class MissingXmlDiskSourceFileError(Exception):
    pass


class MissingXmlDiskSourceDirError(Exception):
    pass


class DiskSource:
    subdir = None
    # Allow for compressed files by default
    allow_compressed_files = 1

    def __init__(self, mountPoint):
        self.mountPoint = mountPoint

    # Returns a data stream
    def load(self):
        # Returns a stream
        filename = self._getFile()
        return self._loadFile(filename)

    def _getFile(self, create=0):
        # Virtual
        # pylint: disable=W0613,R0201
        return None

    def _loadFile(self, filename):
        # Look for a gzip file first
        if self.allow_compressed_files:
            if filename[-3:] == '.gz' and os.path.exists(filename):
                return gzip.open(filename, "rb")

            if os.path.exists(filename + '.gz'):
                return gzip.open(filename + ".gz", "rb")

        if os.path.exists(filename):
            return open(filename, "r")

        raise MissingXmlDiskSourceFileError("unable to process file %s" % filename)

    def _getDir(self, create=0):
        dirname = "%s/%s" % (self.mountPoint, self.subdir)
        if not create:
            return dirname
        if not os.path.exists(dirname):
            createPath(dirname)
        if not os.path.isdir(dirname):
            raise MissingXmlDiskSourceDirError("%s is not a directory" % dirname)
        return dirname


class ArchesDiskSource(DiskSource):
    subdir = 'arches'
    filename = 'arches.xml'

    def _getFile(self, create=0):
        dirname = self._getDir(create)
        if create and not os.path.isdir(dirname):
            createPath(dirname)
        return os.path.join(dirname, self.filename)


class ArchesExtraDiskSource(ArchesDiskSource):
    filename = "arches-extra.xml"


class ProductnamesDiskSource(DiskSource):
    subdir = 'product_names'

    def _getFile(self, create=0):
        dirname = self._getDir(create)
        if create and not os.path.isdir(dirname):
            createPath(dirname)
        return "%s/product_names.xml" % dirname


class ChannelFamilyDiskSource(DiskSource):
    subdir = 'channel_families'

    def _getFile(self, create=0):
        dirname = self._getDir(create)
        if create and not os.path.isdir(dirname):
            createPath(dirname)
        return "%s/channel_families.xml" % dirname


class OrgsDiskSource(DiskSource):
    subdir = 'orgs'

    def _getFile(self, create=0):
        dirname = self._getDir(create)
        if create and not os.path.isdir(dirname):
            createPath(dirname)
        return "%s/orgs.xml" % dirname


class ChannelDiskSource(DiskSource):
    subdir = 'channels'

    def __init__(self, mountPoint):
        DiskSource.__init__(self, mountPoint)
        self.channel = None

    def setChannel(self, channel):
        self.channel = channel

    def list(self):
        # Lists the available channels
        dirname = self._getDir(create=0)
        if not os.path.isdir(dirname):
            # No channels available
            return []
        return os.listdir(dirname)

    def _getFile(self, create=0):
        dirname = "%s/%s" % (self._getDir(create), self.channel)
        if create and not os.path.isdir(dirname):
            createPath(dirname)
        return os.path.join(dirname, self._file_name())

    @staticmethod
    def _file_name():
        return "channel.xml"


class ChannelCompsDiskSource(ChannelDiskSource):

    @staticmethod
    def _file_name():
        return "comps.xml"


class ChannelModulesDiskSource(ChannelDiskSource):

    @staticmethod
    def _file_name():
        return "modules.yaml"


class ShortPackageDiskSource(DiskSource):
    subdir = "packages_short"

    def __init__(self, mountPoint):
        DiskSource.__init__(self, mountPoint)
        # Package ID
        self.id = None
        self._file_suffix = ".xml"

    def setID(self, pid):
        self.id = pid

    # limited dict behaviour
    def has_key(self, pid):
        # Save the old id
        old_id = self.id
        self.id = pid
        f = self._getFile()
        # Restore the old id
        self.id = old_id
        if os.path.exists(f + '.gz') or os.path.exists(f):
            return 1
        return 0

    def _getFile(self, create=0):
        dirname = "%s/%s" % (self._getDir(create), self._hashID())
        # Create the directoru if we have to
        if create and not os.path.exists(dirname):
            createPath(dirname)
        return "%s/%s%s" % (dirname, self.id, self._file_suffix)

    def _hashID(self):
        # Hashes the package name
        return hash_object_id(self.id, 2)


class PackageDiskSource(ShortPackageDiskSource):
    subdir = "packages"


class SourcePackageDiskSource(ShortPackageDiskSource):
    subdir = "source_packages"


class ErrataDiskSource(ShortPackageDiskSource):
    subdir = "errata"

    def _hashID(self):
        # Hashes the erratum name
        return hash_object_id(self.id, 1)


class BlacklistsDiskSource(DiskSource):
    subdir = "blacklists"

    def _getFile(self, create=0):
        dirname = self._getDir(create)
        if create and not os.path.isdir(dirname):
            createPath(dirname)
        return "%s/blacklists.xml" % dirname


class BinaryRPMDiskSource(ShortPackageDiskSource):
    subdir = "rpms"

    def __init__(self, mountPoint):
        ShortPackageDiskSource.__init__(self, mountPoint)
        self._file_suffix = '.rpm'


class SourceRPMDiskSource(BinaryRPMDiskSource):
    subdir = "srpms"


class KickstartDataDiskSource(DiskSource):
    subdir = "kickstart_trees"

    def __init__(self, mountPoint):
        DiskSource.__init__(self, mountPoint)
        self.id = None

    def setID(self, ks_label):
        self.id = ks_label

    def _getFile(self, create=0):
        dirname = self._getDir(create)
        if create and not os.path.isdir(dirname):
            createPath(dirname)
        return os.path.join(dirname, self.id) + '.xml'


class KickstartFileDiskSource(KickstartDataDiskSource):
    subdir = "kickstart_files"
    allow_compressed_files = 0

    def __init__(self, mountPoint):
        KickstartDataDiskSource.__init__(self, mountPoint)
        # the file's relative path
        self.relative_path = None

    def set_relative_path(self, relative_path):
        self.relative_path = relative_path

    def _getFile(self, create=0):
        path = os.path.join(self._getDir(create), self.id,
                            self.relative_path)
        dirname = os.path.dirname(path)
        if create and not os.path.isdir(dirname):
            createPath(dirname)
        return path


class MetadataDiskSource:

    def __init__(self, mountpoint):
        self.mountpoint = mountpoint

    @staticmethod
    def is_disk_loader():
        return True

    def getArchesXmlStream(self):
        return ArchesDiskSource(self.mountpoint).load()

    def getArchesExtraXmlStream(self):
        return ArchesExtraDiskSource(self.mountpoint).load()

    def getChannelFamilyXmlStream(self):
        return ChannelFamilyDiskSource(self.mountpoint).load()

    def getOrgsXmlStream(self):
        return OrgsDiskSource(self.mountpoint).load()

    def getProductNamesXmlStream(self):
        return ProductnamesDiskSource(self.mountpoint).load()

    def getComps(self, label):
        sourcer = ChannelCompsDiskSource(self.mountpoint)
        sourcer.setChannel(label)
        return sourcer.load()

    def getModules(self, label):
        sourcer = ChannelModulesDiskSource(self.mountpoint)
        sourcer.setChannel(label)
        return sourcer.load()

    def getChannelXmlStream(self):
        sourcer = ChannelDiskSource(self.mountpoint)
        channels = sourcer.list()
        stream_list = []
        for c in channels:
            sourcer.setChannel(c)
            stream_list.append(sourcer.load())
        return stream_list

    def getChannelShortPackagesXmlStream(self):
        return ShortPackageDiskSource(self.mountpoint)

    def getPackageXmlStream(self):
        return PackageDiskSource(self.mountpoint)

    def getSourcePackageXmlStream(self):
        return SourcePackageDiskSource(self.mountpoint)

    def getKickstartsXmlStream(self):
        return KickstartDataDiskSource(self.mountpoint)

    def getErrataXmlStream(self):
        return ErrataDiskSource(self.mountpoint)

    def getSupportInformationXmlStream(self):
        return SupportInformationDiskSource(self.mountpoint).load()

    def getSuseProductsXmlStream(self):
        return SuseProductsDiskSource(self.mountpoint).load()

    def getSuseProductChannelsXmlStream(self):
        return SuseProductChannelsDiskSource(self.mountpoint).load()

    def getSuseUpgradePathsXmlStream(self):
        return SuseUpgradePathsDiskSource(self.mountpoint).load()

    def getSuseProductExtensionsXmlStream(self):
        return SuseProductExtensionsDiskSource(self.mountpoint).load()

    def getSuseProductRepositoriesXmlStream(self):
        return SuseProductRepositoriesDiskSource(self.mountpoint).load()

    def getSCCRepositoriesXmlStream(self):
        return SCCRepositoriesDiskSource(self.mountpoint).load()

    def getSuseSubscriptionsXmlStream(self):
        return SuseSubscriptionsDiskSource(self.mountpoint).load()

    def getClonedChannelsXmlStream(self):
        return ClonedChannelsDiskSource(self.mountpoint).load()

class SupportInformationDiskSource(DiskSource):
    subdir = 'support_info'

    def _getFile(self, create=0):
        dirname = self._getDir(create)
        if create and not os.path.isdir(dirname):
            createPath(dirname)
        return "%s/support_info.xml" % dirname

class SuseProductsDiskSource(DiskSource):
    subdir = 'suse_products'

    def _getFile(self, create=0):
        dirname = self._getDir(create)
        if create and not os.path.isdir(dirname):
            createPath(dirname)
        return "%s/suse_products.xml" % dirname

class SuseProductChannelsDiskSource(DiskSource):
    subdir = 'suse_products'

    def _getFile(self, create=0):
        dirname = self._getDir(create)
        if create and not os.path.isdir(dirname):
            createPath(dirname)
        return "%s/suse_product_channels.xml" % dirname

class SuseUpgradePathsDiskSource(DiskSource):
    subdir = 'suse_products'

    def _getFile(self, create=0):
        dirname = self._getDir(create)
        if create and not os.path.isdir(dirname):
            createPath(dirname)
        return "%s/suse_upgrade_paths.xml" % dirname

class SuseProductExtensionsDiskSource(DiskSource):
    subdir = 'suse_product_extensions'

    def _getFile(self, create=0):
        dirname = self._getDir(create)
        if create and not os.path.isdir(dirname):
            createPath(dirname)
        return "%s/suse_product_extensions.xml" % dirname

class SuseProductRepositoriesDiskSource(DiskSource):
    subdir = 'suse_product_repositories'

    def _getFile(self, create=0):
        dirname = self._getDir(create)
        if create and not os.path.isdir(dirname):
            createPath(dirname)
        return "%s/suse_product_repositories.xml" % dirname

class SCCRepositoriesDiskSource(DiskSource):
    subdir = 'scc_repositories'

    def _getFile(self, create=0):
        dirname = self._getDir(create)
        if create and not os.path.isdir(dirname):
            createPath(dirname)
        return "%s/scc_repositories.xml" % dirname

class SuseSubscriptionsDiskSource(DiskSource):
    subdir = 'suse_products'

    def _getFile(self, create=0):
        dirname = self._getDir(create)
        if create and not os.path.isdir(dirname):
            createPath(dirname)
        return "%s/suse_subscriptions.xml" % dirname

class ClonedChannelsDiskSource(DiskSource):
    subdir = 'suse_products'

    def _getFile(self, create=0):
        dirname = self._getDir(create)
        if create and not os.path.isdir(dirname):
            createPath(dirname)
        return "%s/cloned_channels.xml" % dirname

if __name__ == '__main__':
    # TEST CODE
    s = ChannelDiskSource("/tmp")
    print((s.list()))
    s.setChannel("redhat-linux-i386-7.2")
    print((s.load()))
 07070100000116000081B40000000000000000000000015FBBE8EE0000A6BC000000000000000000000000000000000000002F00000000spacewalk-backend/satellite_tools/xmlSource.py    #
# Decoding data from XML streams
#
# Copyright (c) 2008--2018 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import sys
import re
from xml.sax import make_parser, SAXParseException, ContentHandler, \
    ErrorHandler

from uyuni.common import usix
from spacewalk.common import rhnFlags
from spacewalk.common.rhnLog import log_debug
from spacewalk.common.rhnConfig import CFG
from spacewalk.common.rhnTB import Traceback
from spacewalk.server.importlib import importLib, backendLib

RHEL234_REGEX = re.compile("rhel-[^-]*-[aew]s-(4|3|2.1)")

# Terminology used throughout this file:
# Item: an atomic entity from the database's perspective.
#   A channel, or a package, or an erratum is an item.
# Container: a list of items
#   We work under the assumption everything on the second level (i.e. a child
#   of the root element) is a container.

# The way the parser works: get a handler with getHandler() and call process()
# with an XML stream.

# Our parser exceptions


class ParseException(Exception):

    """general parser exception (generated at this level).
    """
    pass


class _EndContainerEvent(Exception):

    def __init__(self, container):
        Exception.__init__(self)
        self.container = container


class IncompatibleVersionError(ParseException):

    def __init__(self, stream_version, parser_version, *args):
        ParseException.__init__(self, *args)
        self.stream_version = stream_version
        self.parser_version = parser_version

# XML parser exception wrappers
# Exposed functionality for the next three include:
#    getColumnNumber(), getLineNumber(), and _msg (or just str(e))


class RecoverableParseException(SAXParseException, Exception):

    """exception wrapper for a critical, but possibly recoverable, XML parser
       error.
    """
    pass


class FatalParseException(SAXParseException, Exception):

    """exception wrapper for a critical XML parser error.
    """
    pass

# XML Node


class Node:

    def __init__(self, name, attributes=None, subelements=None):
        self.name = name
        if attributes is None:
            attributes = {}
        if subelements is None:
            subelements = []
        self.attributes = attributes
        self.subelements = subelements

    def addSubelement(self, e):
        self.subelements.append(e)

    def __repr__(self):
        return "[<Node element: name=%s>]" % self.name


# Base class we use as a SAX parsing handler
class BaseDispatchHandler(ContentHandler, ErrorHandler):

    """ Base class we use as a SAX parsing handler

        We expect the meaningful data to be on the third level.
        The root element defines what the export contains, while the collection
        element defines what this collection contains
    """
    rootElement = None  # non-static
    __stream = None
    container_dispatch = {}

    def __init__(self):
        super(ContentHandler, self).__init__()
        self.rootAttributes = None
        self.__parser = make_parser()
        # Init the parser's handlers
        self.restoreParser()
        # No container at this time
        self.__container = None
        # Reset all the containers, to make sure previous runs don't leave
        # garbage data
        for container in list(self.container_dispatch.values()):
            container.reset()

    def restoreParser(self):
        # Restore the parser's handlers to self
        self.__parser.setContentHandler(self)
        self.__parser.setErrorHandler(self)

    def setStream(self, stream):
        self.__stream = stream

    # Starts processing the data from the XML stream
    def process(self, stream=None):
        log_debug(6)
        if stream is not None:
            self.setStream(stream)
        try:
            self.__parser.parse(self.__stream)
        except (KeyboardInterrupt, SystemExit):
            raise
        except Exception:  # pylint: disable=E0012, W0703
            Traceback(ostream=sys.stderr, with_locals=1)
            if stream is not None:
                stream.close()
            sys.exit(1)

    def reset(self):
        self.close()
        # Re-init
        self.__init__()

    def close(self):
        # WARNING: better call this function when you're done, or you'll end
        # up with a circular reference
        self.__parser = None

    def clear(self):
        # clear out the current container's parse batch; start afresh
        if self.__container:
            try:
                self.__container.batch = []
            except (KeyboardInterrupt, SystemExit):
                raise
            except Exception:
                e = sys.exc_info()[1]
                log_debug(-1, 'ERROR (odd) upon container.batch=[] cleanup: %s' % e)
                raise

    # Interface with containers
    def set_container(self, obj):
        if not hasattr(obj, "container_name"):
            raise Exception("%s not a container type" % type(obj))

        # reset the container (to clean up garbage from previous parses)
        obj.reset()
        self.container_dispatch[obj.container_name] = obj

    def get_container(self, name):
        if name not in self.container_dispatch:
            # Return a dummy container
            c = ContainerHandler()
            c.container_name = name
            return c

        return self.container_dispatch[name]

    def has_container(self, name):
        return (name in self.container_dispatch)

    # Overwrite the functions required by SAX
    def setDocumentLocator(self, locator):
        ContentHandler.setDocumentLocator(self, locator)

    # def startDocument(self):

    # def endDocument(self):

    def startElement(self, name, attrs):
        log_debug(6, name)
        utf8_attrs = _dict_to_utf8(attrs)
        if self.rootAttributes is None:
            # First time around
            if self.rootElement != name:
                raise Exception("Mismatching elements; root='%s', "
                                "received='%s'" % (self.rootElement, name))
            self.rootAttributes = utf8_attrs
            self._check_version()
            return

        if self.__container is None:
            # This means it's parsing a container element
            self.__container = self.get_container(name)

        self.__container.startElement(name, utf8_attrs)

    def characters(self, content):
        if self.__container:
            self.__container.characters(_stringify(content))

    def endElement(self, name):
        log_debug(6, name)
        if self.__container is None:
            # End of the root attribute
            # We know now the tag stack is empty
            self.rootAttributes = None
            return

        try:
            self.__container.endElement(name)
        except _EndContainerEvent:
            self.__container = None

    #___Error handling methods___

    # pylint: disable=W0212,W0710
    def error(self, exception):
        """Handle a recoverable error.
        """
        log_debug(-1, "ERROR (RECOVERABLE): parse error encountered - line: %s, col: %s, msg: %s"
                  % (exception.getLineNumber(), exception.getColumnNumber(), exception._msg))
        raise RecoverableParseException(exception._msg, exception, exception._locator)

    def fatalError(self, exception):
        """Handle a non-recoverable error.
        """
        log_debug(-1, "ERROR (FATAL): parse error encountered - line: %s, col: %s, msg: %s"
                  % (exception.getLineNumber(), exception.getColumnNumber(), exception._msg))
        raise FatalParseException(exception._msg, exception, exception._locator)

    def warning(self, exception):
        """Handle a warning.
        """
        log_debug(-1, "ERROR (WARNING): parse error encountered - line: %s, col: %s, msg: %s"
                  % (exception.getLineNumber(), exception.getColumnNumber(), exception._msg))

    # To be overridden in subclasses
    def _check_version(self):
        pass

# Particular case: a satellite handler


class SatelliteDispatchHandler(BaseDispatchHandler):
    rootElement = 'rhn-satellite'
    # this is the oldest version of channel dump we support
    version = "3.0"

    # Historical log
    # * Version 2.2 2004-03-02
    #    arch types introduced in all the arch dumps
    # * Version 2.3 2004-09-13
    #    added short package dumps per channel
    # * Version 3.0 2005-01-13
    #    required major version change for channel family merging (#136525)

    def _check_version(self):
        # Check the version
        version = self.rootAttributes.get("version")
        # Entitlement/certificate generation
        generation = self.rootAttributes.get("generation")
        rhnFlags.set("stream-generation", generation)
        if not version:
            version = "0"
        stream_version = list(map(int, version.split('.')))
        allowed_version = list(map(int, self.version.split(".")))
        if (stream_version[0] != allowed_version[0] or
                stream_version[1] < allowed_version[1]):
            raise IncompatibleVersionError(version, self.version,
                                           "Incompatible stream version %s; code supports %s" % (
                                               version, self.version))

# Element handler


class BaseItem:
    item_name = None
    item_class = object
    tagMap = {}

    def __init__(self):
        pass

    def populate(self, attributes, elements):
        item = self.item_class()
        # Populate the item from the attribute data structure
        self.populateFromAttributes(item, attributes)
        # Populate the item from sub-elements
        self.populateFromElements(item, elements)
        return item

    def populateFromAttributes(self, obj, sourceDict):
        # Populates dict with items from sourceDict
        for key, value in list(sourceDict.items()):
            if key not in self.tagMap:
                if key not in obj:
                    # Unsupported key
                    continue
            else:
                # Have to map this key
                key = self.tagMap[key]

            # Finally, update the key
            obj[key] = _normalizeAttribute(obj.attributeTypes.get(key), value)

    def populateFromElements(self, obj, elements):
        # Populates obj with `elements' as subelements
        keys = list(obj.keys())
        keys_len = len(keys)
        for element in elements:
            if _is_string(element):
                if keys_len != 1:
                    if not element.strip():
                        # White space around an element - skip
                        continue
                    # Ambiguity: don't know which attribute to initialize
                    raise Exception("Ambiguity %s" % keys)
                # Init the only attribute we know of
                obj[keys[0]] = element
                continue
            name = element.name
            if name not in obj and name not in self.tagMap:
                # Unsupported key
                continue
            if name in self.tagMap:
                # Have to map this element
                name = self.tagMap[name]
            value = _normalizeSubelements(obj.attributeTypes.get(name),
                                          element.subelements)
            obj[name] = value


def _is_string(obj):
    if isinstance(obj, usix.StringType):
        return 1
    if isinstance(obj, usix.UnicodeType):
        return 1
    return 0


def _stringify(data):
    # Accelerate the most common cases
    if isinstance(data, usix.StringType):
        return data
    elif isinstance(data, usix.UnicodeType):
        return data.encode('UTF8')
    return str(data)


def _dict_to_utf8(d):
    # Convert the dictionary to have non-unocide key-value pairs
    ret = {}
    for k, v in list(d.items()):
        if isinstance(k, usix.UnicodeType):
            k = k.encode('UTF8')
        if isinstance(v, usix.UnicodeType):
            v = v.encode('UTF8')
        ret[k] = v
    return ret


__itemDispatcher = {}


def addItem(classobj):
    __itemDispatcher[classobj.item_name] = classobj


def _createItem(element):
    # Creates an Item object from the specified element
    if element.name not in __itemDispatcher:
        # No item processor
        return None
    item = __itemDispatcher[element.name]()
    return item.populate(element.attributes, element.subelements)

#
# ITEMS:
#


class BaseArchItem(BaseItem):
    pass


class ServerArchItem(BaseArchItem):
    item_name = 'rhn-server-arch'
    item_class = importLib.ServerArch
addItem(ServerArchItem)


class PackageArchItem(BaseArchItem):
    item_name = 'rhn-package-arch'
    item_class = importLib.PackageArch
addItem(PackageArchItem)


class ChannelArchItem(BaseArchItem):
    item_name = 'rhn-channel-arch'
    item_class = importLib.ChannelArch
addItem(ChannelArchItem)


class CPUArchItem(BaseItem):
    item_name = 'rhn-cpu-arch'
    item_class = importLib.CPUArch
addItem(CPUArchItem)


class ServerPackageArchCompatItem(BaseItem):
    item_name = 'rhn-server-package-arch-compat'
    item_class = importLib.ServerPackageArchCompat
addItem(ServerPackageArchCompatItem)


class ServerChannelArchCompatItem(BaseItem):
    item_name = 'rhn-server-channel-arch-compat'
    item_class = importLib.ServerChannelArchCompat
addItem(ServerChannelArchCompatItem)


class ChannelPackageArchCompatItem(BaseItem):
    item_name = 'rhn-channel-package-arch-compat'
    item_class = importLib.ChannelPackageArchCompat
addItem(ChannelPackageArchCompatItem)


class ServerGroupServerArchCompatItem(BaseItem):
    item_name = 'rhn-server-group-server-arch-compat'
    item_class = importLib.ServerGroupServerArchCompat
addItem(ServerGroupServerArchCompatItem)


class ChannelFamilyItem(BaseItem):
    item_name = 'rhn-channel-family'
    item_class = importLib.ChannelFamily
    tagMap = {
        'id': 'channel-family-id',
        # max_members is no longer populated from the xml dump, but from the
        # satellite cert
        'rhn-channel-family-name': 'name',
        'rhn-channel-family-product-url': 'product_url',
        'channel-labels': 'channels',
    }
addItem(ChannelFamilyItem)


class ChannelItem(BaseItem):
    item_name = 'rhn-channel'
    item_class = importLib.Channel
    tagMap = {
        'channel-id': 'string_channel_id',
        'org-id': 'org_id',
        'rhn-channel-parent-channel': 'parent_channel',
        'rhn-channel-families': 'families',
        'channel-arch': 'channel_arch',
        'rhn-channel-basedir': 'basedir',
        'rhn-channel-name': 'name',
        'rhn-channel-summary': 'summary',
        'rhn-channel-description': 'description',
        'rhn-channel-last-modified': 'last_modified',
        'rhn-dists': 'dists',
        'rhn-release': 'release',
        'channel-errata': 'errata',
        'kickstartable-trees': 'kickstartable_trees',
        'rhn-channel-errata': 'errata_timestamps',
        'source-packages': 'source_packages',
        'rhn-channel-gpg-key-url': 'gpg_key_url',
        'rhn-channel-product-name': 'product_name',
        'rhn-channel-product-version': 'product_version',
        'rhn-channel-product-beta': 'product_beta',
        'rhn-channel-receiving-updates': 'receiving_updates',
        'rhn-channel-checksum-type': 'checksum_type',
        'rhn-channel-comps-last-modified': 'comps_last_modified',
        'rhn-channel-modules-last-modified': 'modules_last_modified',
        'sharing': 'channel_access',
        'rhn-channel-trusted-orgs': 'trust_list',
        'rhn-channel-update-tag': 'update_tag',
        'rhn-channel-installer-updates': 'installer_updates',
        'suse-data': 'package_keywords',
    }

    def populateFromElements(self, obj, elements):
        # bz 808516, to retain compatibility with Satellite <= 5.3 we
        # need to assume sha1 checksum type unless we explicitly see
        # 'rhn-null' in the xml
        checksum_type_really_null = False
        for element in elements:
            if (not _is_string(element)
                    and element.name == 'rhn-channel-checksum-type'):
                for subelement in element.subelements:
                    if (not _is_string(subelement)
                            and subelement.name == 'rhn-null'):
                        checksum_type_really_null = True

        BaseItem.populateFromElements(self, obj, elements)

        if obj['checksum_type'] == 'sha':
            obj['checksum_type'] = 'sha1'
        if not obj['checksum_type'] and not checksum_type_really_null:
            obj['checksum_type'] = 'sha1'

        # if importing from an old export that does not know about
        # channel_access, use the default
        if not obj['channel_access']:
            obj['channel_access'] = 'private'

        # if using versions of rhel that doesn't use yum, set
        # checksum_type to None
        if (RHEL234_REGEX.match(obj['label'])
                or (obj['parent_channel']
                    and RHEL234_REGEX.match(obj['parent_channel']))):
            obj['checksum_type'] = None

addItem(ChannelItem)


class ChannelTrustItem(BaseItem):
    item_name = 'rhn-channel-trusted-org'
    item_class = importLib.ChannelTrust
    tagMap = {
        'org-id': 'org_trust_id',
    }
addItem(ChannelTrustItem)


class OrgTrustItem(BaseItem):
    item_name = 'rhn-org-trust'
    item_class = importLib.OrgTrust
    tagMap = {
        'org-id': 'org_id',
    }
addItem(OrgTrustItem)


class OrgItem(BaseItem):
    item_name = 'rhn-org'
    item_class = importLib.Org
    tagMap = {
        'id': 'id',
        'name': 'name',
        'rhn-org-trusts': 'org_trust_ids',
    }
addItem(OrgItem)


class BaseChecksummedItem(BaseItem):

    def populate(self, attributes, elements):
        item = BaseItem.populate(self, attributes, elements)
        item['checksums'] = {}
        if 'md5sum' in item:
            # xml dumps < 3.6 (aka pre-sha256)
            if item['md5sum']:
                item['checksums']['md5'] = item['md5sum']
            del(item['md5sum'])
        if 'checksum_list' in item and item['checksum_list']:
            for csum in item['checksum_list']:
                item['checksums'][csum['type']] = csum['value']
            del(item['checksum_list'])
        for ctype in CFG.CHECKSUM_PRIORITY_LIST:
            if ctype in item['checksums']:
                item['checksum_type'] = ctype
                item['checksum'] = item['checksums'][ctype]
                break
        return item
addItem(BaseChecksummedItem)


class IncompletePackageItem(BaseChecksummedItem):
    item_name = 'rhn-package-short'
    item_class = importLib.IncompletePackage
    tagMap = {
        'id': 'package_id',
        'package-size': 'package_size',
        'last-modified': 'last_modified',
        'package-arch': 'arch',
        'org-id': 'org_id',
        'checksums': 'checksum_list',
    }
addItem(IncompletePackageItem)


class ChecksumItem(BaseItem):
    item_name = 'checksum'
    item_class = importLib.Checksum
    tagMap = {
        'checksum-type': 'type',
        'checksum-value': 'value',
    }
addItem(ChecksumItem)


class PackageItem(IncompletePackageItem):
    item_name = 'rhn-package'
    item_class = importLib.Package
    tagMap = {
        # Stuff coming through as attributes
        'package-group': 'package_group',
        'rpm-version': 'rpm_version',
        'payload-size': 'payload_size',
        'build-host': 'build_host',
        'build-time': 'build_time',
        'source-rpm': 'source_rpm',
        'payload-format': 'payload_format',
        # Stuff coming through as subelements
        'rhn-package-summary': 'summary',
        'rhn-package-description': 'description',
        'rhn-package-vendor': 'vendor',
        'rhn-package-copyright': 'license',
        'rhn-package-header-sig': 'header_sig',
        # These are duplicated as attributes, should go away eventually
        'rhn-package-package-group': 'package_group',
        'rhn-package-rpm-version': 'rpm_version',
        'rhn-package-payload-size': 'payload_size',
        'rhn-package-header-start': 'header_start',
        'rhn-package-header-end': 'header_end',
        'rhn-package-build-host': 'build_host',
        'rhn-package-build-time': 'build_time',
        'rhn-package-source-rpm': 'source_rpm',
        'rhn-package-payload-format': 'payload_format',
        'rhn-package-cookie': 'cookie',
        #
        'rhn-package-files': 'files',
        'rhn-package-requires': 'requires',
        'rhn-package-provides': 'provides',
        'rhn-package-conflicts': 'conflicts',
        'rhn-package-obsoletes': 'obsoletes',
        'rhn-package-recommends': 'recommends',
        'rhn-package-suggests': 'suggests',
        'rhn-package-supplements': 'supplements',
        'rhn-package-enhances': 'enhances',
        'rhn-package-changelog': 'changelog',
        'suse-product-file': 'product_files',
        'suse-eula': 'eulas',
        'pkg-extratag': 'extra_tags',
    }
    tagMap.update(IncompletePackageItem.tagMap)

    def populate(self, attributes, elements):
        item = IncompletePackageItem.populate(self, attributes, elements)
        # find out "primary" checksum
        # let's use the best we have
        # pylint: disable=bad-option-value,unsubscriptable-object,unsupported-assignment-operation
        #have_filedigests = len([1 for i in item['requires'] if i['name'] == 'rpmlib(FileDigests)'])
        #if not have_filedigests:
        #    item['checksum_type'] = 'md5'
        #    item['checksum'] = item['checksums']['md5']
        return item
addItem(PackageItem)


class IncompleteSourcePackageItem(BaseItem):
    item_name = 'source-package'
    item_class = importLib.IncompleteSourcePackage
    tagMap = {
        'last-modified': 'last_modified',
        'source-rpm': 'source_rpm',
    }
addItem(IncompleteSourcePackageItem)


class SourcePackageItem(BaseItem):
    item_name = 'rhn-source-package'
    item_class = importLib.SourcePackage
    tagMap = {
        'id': 'package_id',
        'source-rpm': 'source_rpm',
        'package-group': 'package_group',
        'rpm-version': 'rpm_version',
        'payload-size': 'payload_size',
        'build-host': 'build_host',
        'build-time': 'build_time',
        'package-size': 'package_size',
        'last-modified': 'last_modified',
    }
addItem(SourcePackageItem)


class ChangelogItem(BaseItem):
    item_name = 'rhn-package-changelog-entry'
    item_class = importLib.ChangeLog
    tagMap = {
        'rhn-package-changelog-entry-name': 'name',
        'rhn-package-changelog-entry-text': 'text',
        'rhn-package-changelog-entry-time': 'time',
    }
addItem(ChangelogItem)

class ProductFileItem(BaseItem):
    item_name = 'suse-product-file-entry'
    item_class = importLib.ProductFile
    tagMap = {
        'suse-product-file-entry-name'        : 'name',
        'suse-product-file-entry-epoch'       : 'epoch',
        'suse-product-file-entry-version'     : 'version',
        'suse-product-file-entry-release'     : 'release',
        'suse-product-file-entry-arch'        : 'arch',
        'suse-product-file-entry-vendor'      : 'vendor',
        'suse-product-file-entry-summary'     : 'summary',
        'suse-product-file-entry-description' : 'description',
    }
addItem(ProductFileItem)

class EulaItem(BaseItem):
    item_name = 'suse-eula-entry'
    item_class = importLib.Eula
    tagMap = {
        'suse-eula-entry-text'     : 'text',
        'suse-eula-entry-checksum' : 'checksum',
    }
addItem(EulaItem)

class ExtraTagItem(BaseItem):
    item_name = 'pkg-extratag-entry'
    item_class = importLib.ExtraTag
    tagMap = {
        'pkg-extratag-entry-name'     : 'name',
        'pkg-extratag-entry-value'    : 'value',
    }
addItem(ExtraTagItem)

class DependencyItem(BaseItem):

    """virtual class - common settings for dependency items"""
    item_class = importLib.Dependency
    tagMap = {
        'sense': 'flags',
    }


class ProvidesItem(DependencyItem):
    item_name = 'rhn-package-provides-entry'
addItem(ProvidesItem)


class RequiresItem(DependencyItem):
    item_name = 'rhn-package-requires-entry'
addItem(RequiresItem)


class ConflictsItem(DependencyItem):
    item_name = 'rhn-package-conflicts-entry'
addItem(ConflictsItem)


class ObsoletesItem(DependencyItem):
    item_name = 'rhn-package-obsoletes-entry'
addItem(ObsoletesItem)


class RecommendsItem(DependencyItem):
    item_name = 'rhn-package-recommends-entry'
addItem(RecommendsItem)


class SuggestsItem(DependencyItem):
    item_name = 'rhn-package-suggests-entry'
addItem(SuggestsItem)


class SupplementsItem(DependencyItem):
    item_name = 'rhn-package-supplements-entry'
addItem(SupplementsItem)


class EnhancesItem(DependencyItem):
    item_name = 'rhn-package-enhances-entry'
addItem(EnhancesItem)


class FileItem(BaseChecksummedItem):
    item_name = 'rhn-package-file'
    item_class = importLib.File
    tagMap = {
        'checksum-type': 'checksum_type',
    }

    def populate(self, attributes, elements):
        if 'md5' in attributes and 'checksum-type' not in attributes:
            attributes['checksum-type'] = 'md5'
            attributes['checksum'] = attributes['md5']
        item = BaseChecksummedItem.populate(self, attributes, elements)
        return item
addItem(FileItem)


class DistItem(BaseItem):
    item_name = 'rhn-dist'
    item_class = importLib.DistChannelMap
    tagMap = {
        'channel-arch': 'channel_arch',
    }
addItem(DistItem)

class SupportInfoItem(BaseItem):
    item_name = 'suse-keyword'
    item_class = importLib.SupportInformation
addItem(SupportInfoItem)

class SuseProductItem(BaseItem):
    item_name = 'suse-product'
    item_class = importLib.SuseProduct
    tagMap = {
        'product-id'           : 'product_id',
        'friendly-name'        : 'friendly_name',
        'release-stage'        : 'release_stage',
        'channel-family-label' : 'channel_family_label'
    }
addItem(SuseProductItem)

class SuseProductChannelItem(BaseItem):
    item_name = 'suse-product-channel'
    item_class = importLib.SuseProductChannel
    tagMap = {
        'product-id'           : 'product_id',
        'channel-label'        : 'channel_label',
        'parent-channel-label' : 'parent_channel_label',
    }
addItem(SuseProductChannelItem)

class SuseUpgradePathItem(BaseItem):
    item_name = 'suse-upgrade-path'
    item_class = importLib.SuseUpgradePath
    tagMap = {
        'from-product-id' : 'from_product_id',
        'to-product-id'   : 'to_product_id',
    }
addItem(SuseUpgradePathItem)

class SuseProductExtensionItem(BaseItem):
    item_name = 'suse-product-extension'
    item_class = importLib.SuseProductExtension
    tagMap = {
        'product-id'    : 'product_id',
        'root-product-id' : 'root_id',
        'ext-product-id' : 'ext_id',
        'recommended': 'recommended'
    }
addItem(SuseProductExtensionItem)

class SuseProductRepositoryItem(BaseItem):
    item_name = 'suse-product-repository'
    item_class = importLib.SuseProductRepository
    tagMap = {
        'product-id'    : 'product_id',
        'root-product-id' : 'rootid',
        'repository-id' : 'repo_id',
        'channel-label': 'channel_label',
        'parent-channel-label': 'parent_channel_label',
        'channel-name': 'channel_name',
        'mandatory': 'mandatory',
        'update-tag': 'update_tag'
    }
addItem(SuseProductRepositoryItem)

class SCCRepositoryItem(BaseItem):
    item_name = 'scc-repository'
    item_class = importLib.SCCRepository
    tagMap = {
            'scc-id' : 'sccid',
            'autorefresh' : 'autorefresh',
            'name' : 'name',
            'distro-target': 'distro_target',
            'description': 'description',
            'url': 'url',
            'signed': 'signed',
            'installer_updates': 'installer_updates'
    }
addItem(SCCRepositoryItem)

class SuseSubscriptionItem(BaseItem):
    item_name = 'suse-subscription'
    item_class = importLib.SuseSubscription
    tagMap = {
        'sub-label'       : 'label',
        'sub-max-members' : 'max_members',
        'sub-system-ent'  : 'system_entitlement'
    }
addItem(SuseSubscriptionItem)

class ClonedChannelItem(BaseItem):
    item_name = 'cloned-channel'
    item_class = importLib.ClonedChannel
    tagMap = {
        'orig'  : 'orig',
        'clone' : 'clone'
    }
addItem(ClonedChannelItem)

class ChannelErratumItem(BaseItem):
    item_name = 'erratum'
    item_class = importLib.ChannelErratum
    tagMap = {
        'last-modified': 'last_modified',
        'advisory-name': 'advisory_name',
    }
addItem(ChannelErratumItem)


class ReleaseItem(BaseItem):
    item_name = 'rhn-release'
    item_class = importLib.ReleaseChannelMap
    tagMap = {
        'channel-arch': 'channel_arch'
    }
addItem(ReleaseItem)


class BugItem(BaseItem):
    item_name = 'rhn-erratum-bug'
    item_class = importLib.Bug
    tagMap = {
        'rhn-erratum-bug-id': 'bug_id',
        'rhn-erratum-bug-summary': 'summary',
        'rhn-erratum-bug-href': 'href',
    }
addItem(BugItem)


class KeywordItem(BaseItem):
    item_name = 'rhn-erratum-keyword'
    item_class = importLib.Keyword
    tagMap = {
    }
addItem(KeywordItem)


class ErratumItem(BaseItem):
    item_name = 'rhn-erratum'
    item_class = importLib.Erratum
    tagMap = {
        'id': 'erratum_id',
        'org-id': 'org_id',
        'rhn-erratum-advisory-name': 'advisory_name',
        'rhn-erratum-advisory-rel': 'advisory_rel',
        'rhn-erratum-advisory-type': 'advisory_type',
        'rhn-erratum-product': 'product',
        'rhn-erratum-description': 'description',
        'rhn-erratum-synopsis': 'synopsis',
        'rhn-erratum-topic': 'topic',
        'rhn-erratum-solution': 'solution',
        'rhn-erratum-issue-date': 'issue_date',
        'rhn-erratum-update-date': 'update_date',
        'rhn-erratum-notes': 'notes',
        'rhn-erratum-org-id': 'org_id',
        'rhn-erratum-refers-to': 'refers_to',
        'rhn-erratum-channels': 'channels',
        'rhn-erratum-keywords': 'keywords',
        'rhn-erratum-checksums': 'checksums',
        'rhn-erratum-bugs': 'bugs',
        'rhn-erratum-cve': 'cve',
        'rhn-erratum-last-modified': 'last_modified',
        'rhn-erratum-files': 'files',
        'rhn-erratum-errata-from': 'errata_from',
        'rhn-erratum-severity': 'severity',
        'cve-names': 'cve',
    }
addItem(ErratumItem)


class ErrorItem(BaseItem):
    item_name = 'rhn-error'
    item_class = importLib.Error
addItem(ErrorItem)


class ErrataFileItem(BaseChecksummedItem):
    item_name = 'rhn-erratum-file'
    item_class = importLib.ErrataFile
    tagMap = {
        'type': 'file_type',
        'channels': 'channel_list',
        # Specific to XML
        'package': 'package',
        'source-package': 'source-package',
        'checksum-type': 'checksum_type',
    }
addItem(ErrataFileItem)


class ProductNamesItem(BaseItem):
    item_name = 'rhn-product-name'
    item_class = importLib.ProductName
addItem(ProductNamesItem)


class KickstartableTreeItem(BaseItem):
    item_name = 'rhn-kickstartable-tree'
    item_class = importLib.KickstartableTree
    tagMap = {
        'rhn-kickstart-files': 'files',
        'base-path': 'base_path',
        'boot-image': 'boot_image',
        'kstree-type-label': 'kstree_type_label',
        'install-type-label': 'install_type_label',
        'kstree-type-name': 'kstree_type_name',
        'install-type-name': 'install_type_name',
        'last-modified': 'last_modified',
    }
addItem(KickstartableTreeItem)


class KickstartFileItem(BaseChecksummedItem):
    item_name = 'rhn-kickstart-file'
    item_class = importLib.KickstartFile
    tagMap = {
        'relative-path': 'relative_path',
        'file-size': 'file_size',
        'last-modified': 'last_modified',
        'checksums': 'checksum_list',
    }
addItem(KickstartFileItem)

#
# Container handler and containers:
#


class ContainerHandler:
    container_name = None

    def __init__(self):
        # The tag stack; each item is an array [element, attributes]
        self.tagStack = []
        # The object stack; each item is an array
        # [element, attributes, content]
        self.objStack = []
        # Collects the elements in a batch
        self.batch = []

    def reset(self):
        # Make sure the batch is preserved
        batch = self.batch
        # Re-init the object: cleans up the stacks and such
        self.__init__()
        # And restore the batch
        self.batch = batch

    def startElement(self, element, attrs):
        # log_debug(6, element) --duplicate logging.
        if not self.tagStack and element != self.container_name:
            # Strange; this element is called to parse stuff when it's not
            # supposed to
            raise Exception('This object should not have been used')
        self.tagStack.append(Node(element, attrs))
        self.objStack.append([])

    def characters(self, data):
        log_debug(6, data)
        if data == '':
            # Nothing to do
            return
        # If the thing in front is a string, append to it
        lastObj = self.objStack[-1]
        if lastObj and _is_string(lastObj[-1]):
            lastObj[-1] = '%s%s' % (lastObj[-1], data)
        else:
            lastObj.append(data)

    def endElement(self, element):
        # log_debug(6, element) --duplicate logging.
        tagobj = self.tagStack[-1]
        # Remove the previous tag
        del self.tagStack[-1]
        # Decode the tag object
        name = tagobj.name
        if name != element:
            raise ParseException(
                "incorrect XML data: closing tag %s, opening tag %s" % (
                    element, name))
        # Append the content of the object to the tag object
        for obj in self.objStack[-1]:
            tagobj.addSubelement(obj)

        # Remove the subelements from the stack
        del self.objStack[-1]

        if not self.objStack:
            # End element for this container
            self.endContainerCallback()
            raise _EndContainerEvent(tagobj)

        # Regular element; append the current object as a subelement to the
        # previous object
        self.objStack[-1].append(tagobj)
        if len(self.tagStack) == 1:
            # Finished parsing an item; let the parent know
            self.endItemCallback()

    def getLastItem(self):
        return self.objStack[-1][-1]

    def clearLastItem(self):
        del self.objStack[-1][-1]

    def endItemCallback(self):
        # Grab the latest object we've parsed
        obj = self.getLastItem()
        # And remove it since we don't need it
        self.clearLastItem()
        # Instantiate the object
        item = _createItem(obj)

        if item is None:
            # Nothing to do with this object
            return

        if 'error' in item:
            # Special case errors
            log_debug(0, 'XML parser error: found "rhn-error" item: %s' %
                      item['error'])
            raise ParseException(item['error'])

        self.postprocessItem(item)
        # Add it to the items list
        self.batch.append(item)

    def endContainerCallback(self):
        pass

    def postprocessItem(self, item):
        # Do nothing
        pass


def _normalizeSubelements(objtype, subelements):
    # pylint: disable=R0911
    # Deal with simple cases first
    if objtype is None:
        # Don't know how to handle it
        return _stringify(subelements)

    if not subelements:
        # No subelements available
        if isinstance(objtype, usix.ListType):
            # Expect a list of things - return the empty list
            return []
        # Expected a scalar type
        return None

    # We do have subelements
    # Extract all the non-string subelements
    _s = []
    _strings_only = 1
    for subel in subelements:
        if _is_string(subel) and not subel.strip():
            # Ignore it for now
            continue
        _s.append(subel)
        if not _is_string(subel):
            _strings_only = 0

    if _strings_only:
        # Multiple strings - contactenate into one
        subelements = [''.join(subelements)]
    else:
        # Ignore whitespaces around elements
        subelements = _s

    if not isinstance(objtype, usix.ListType):
        if len(subelements) > 1:
            raise Exception("Expected a scalar, got back a list")
        subelement = subelements[0]
        # NULL?
        if isinstance(subelement, Node):
            if subelement.name == 'rhn-null':
                return None
            raise Exception("Expected a scalar, got back an element '%s'" % subelement.name)

        if objtype is usix.StringType:
            return _stringify(subelement)

        if objtype is usix.IntType:
            if subelement == '':
                # Treat it as NULL
                return None
            return int(subelement)

        if objtype is importLib.DateType:
            return _normalizeDateType(subelement)
        raise Exception("Unhandled type %s for subelement %s" % (objtype,
                                                                 subelement))

    # Expecting a list of things
    expectedType = objtype[0]
    if expectedType is usix.StringType:
        # List of strings
        return list(map(_stringify, subelements))

    if expectedType is usix.IntType:
        # list of ints
        return list(map(int, subelements))

    if expectedType is importLib.DateType:
        return list(map(_normalizeDateType, subelements))

    # A subelement
    result = []
    for subelement in subelements:
        item = _createItem(subelement)
        if item is None:
            # Item processor not found
            continue
        if not isinstance(item, expectedType):
            raise Exception("Expected type %s, got back %s %s" % (expectedType,
                                                                  type(item), item))
        result.append(item)

    return result


def _normalizeAttribute(objtype, attribute):
    # Deal with simple cases first
    if (objtype is None) or (objtype is usix.StringType):
        # (Don't know how to handle it) or (Expecting a scalar)
        return attribute
    elif objtype is usix.IntType:
        if attribute == '' or attribute == 'None':
            # Treat it as NULL
            return None
        else:
            return int(attribute)
    elif objtype is importLib.DateType:
        return _normalizeDateType(attribute)
    elif isinstance(objtype, usix.ListType):
        # List type - split stuff
        return attribute.split()
    else:
        raise Exception("Unhandled attribute data type %s" % objtype)


def _normalizeDateType(value):
    try:
        value = int(value)
    except ValueError:
        # string
        return value
    # Timestamp
    return backendLib.localtime(value)


#
# Containers:
#
# XXX: we'll need an ErrorContainer eventually
#      (we do not handle <rhn-error> properly if it is
#       a "root" element).
# class ErrorContainer(ContainerHandler):
#    container_name = 'rhn-error'
#    def endContainerCallback(self):
#        lastObj = self.getLastItem()
#        raise ParseException(lastObj)


class ChannelFamilyContainer(ContainerHandler):
    container_name = 'rhn-channel-families'


class ChannelContainer(ContainerHandler):
    container_name = 'rhn-channels'


class IncompletePackageContainer(ContainerHandler):
    container_name = 'rhn-packages-short'

    def postprocessItem(self, item):
        channels = []
        for channel in item['channels'] or []:
            c = importLib.Channel()
            c['label'] = channel
            channels.append(c)
        item['channels'] = channels


class PackageContainer(IncompletePackageContainer):

    """Inherits from IncompletePackageContainer, since we need to postprocess the
       channel information
    """
    container_name = 'rhn-packages'


class SourcePackageContainer(ContainerHandler):
    container_name = 'rhn-source-packages'


class ErrataContainer(IncompletePackageContainer):
    container_name = 'rhn-errata'


class ServerArchContainer(ContainerHandler):
    container_name = 'rhn-server-arches'


class PackageArchContainer(ContainerHandler):
    container_name = 'rhn-package-arches'


class ChannelArchContainer(ContainerHandler):
    container_name = 'rhn-channel-arches'


class CPUArchContainer(ContainerHandler):
    container_name = 'rhn-cpu-arches'


class ServerPackageArchCompatContainer(ContainerHandler):
    container_name = 'rhn-server-package-arch-compatibility-map'


class ServerChannelArchCompatContainer(ContainerHandler):
    container_name = 'rhn-server-channel-arch-compatibility-map'


class ChannelPackageArchCompatContainer(ContainerHandler):
    container_name = 'rhn-channel-package-arch-compatibility-map'


class ServerGroupServerArchCompatContainer(ContainerHandler):
    container_name = 'rhn-server-group-server-arch-compatibility-map'


class ProductNamesContainer(ContainerHandler):
    container_name = 'rhn-product-names'


class KickstartableTreesContainer(ContainerHandler):
    container_name = 'rhn-kickstartable-trees'


class OrgContainer(ContainerHandler):
    container_name = 'rhn-orgs'

class SupportInformationContainer(ContainerHandler):
    container_name = 'suse-data'

class SuseProductsContainer(ContainerHandler):
    container_name = 'suse-products'

class SuseProductChannelsContainer(ContainerHandler):
    container_name = 'suse-product-channels'

class SuseUpgradePathsContainer(ContainerHandler):
    container_name = 'suse-upgrade-paths'

class SuseProductExtensionsContainer(ContainerHandler):
    container_name = 'suse-product-extensions'

class SuseProductRepositoriesContainer(ContainerHandler):
    container_name = 'suse-product-repositories'

class SCCRepositoriesContainer(ContainerHandler):
    container_name = 'scc-repositories'

class SuseSubscriptionsContainer(ContainerHandler):
    container_name = 'suse-subscriptions'

class ClonedChannelsContainer(ContainerHandler):
    container_name = 'cloned-channels'
07070100000117000081B40000000000000000000000015FBBE8EE00004A51000000000000000000000000000000000000003300000000spacewalk-backend/satellite_tools/xmlWireSource.py    #
# Copyright (c) 2008--2018 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#


# pylint: disable=E0012, C0413
# system imports
import os
import sys
import time

# rhn imports
from rhn import rpclib
sys.path.append("/usr/share/rhn")
from up2date_client import config

from uyuni.common.usix import raise_with_tb
from uyuni.common import rhnLib
from spacewalk.common.rhnConfig import CFG

# local imports
from spacewalk.satellite_tools.syncLib import log, log2, RhnSyncException

from rhn import rpclib

from spacewalk.common.suseLib import get_proxy
from spacewalk.satellite_tools import connection

class BaseWireSource:

    """ Base object for wire-commo to RHN for delivery of XML/RPMS. """

    serverObj = None
    handler = ''
    url = ''
    sslYN = 0
    systemid = None
    server_handler = None
    xml_dump_version = None

    def __init__(self, systemid, sslYN=0, xml_dump_version=None):
        if not BaseWireSource.systemid:
            BaseWireSource.systemid = systemid
        BaseWireSource.sslYN = sslYN
        BaseWireSource.xml_dump_version = xml_dump_version

    def getServer(self, forcedYN=0):
        if forcedYN:
            self.setServer(self.handler, self.url, forcedYN)
        return BaseWireSource.serverObj

    def schemeAndUrl(self, url):
        """ http[s]://BLAHBLAHBLAH/ACKACK --> http[s]://BLAHBLAHBLAH """

        if not url:
            url = CFG.RHN_PARENT  # the default
        # just make the url complete.
        hostname = rhnLib.parseUrl(url or '')[1]
        hostname = hostname.split(':')[0]  # just in case
        if self.sslYN:
            url = 'https://' + hostname
        else:
            url = 'http://' + hostname
        return url

    def setServer(self, handler, url=None, forcedYN=0):
        """ XMLRPC server object (ssl set in parameters).
            NOTE: url expected to be of the form: scheme://machine/HANDLER
        """

        url = self.schemeAndUrl(url)

        if self._cached_connection_params(handler, url, forcedYN=forcedYN):
            # Already cached
            return

        self._set_connection_params(handler, url)

        url = '%s%s' % (url, handler)  # url is properly set up now.

        serverObj = self._set_connection(url)
        self._set_ssl_trusted_certs(serverObj)
        return serverObj

    @staticmethod
    def _set_connection_params(handler, url):
        BaseWireSource.handler = handler
        BaseWireSource.url = url

    def _cached_connection_params(self, handler, url, forcedYN=0):
        """Helper function; returns 0 if we have to reset the connection
        params, 1 if the cached values are ok"""
        if forcedYN:
            return 0
        if handler != self.handler or url != self.url:
            return 0
        return 1

    def _set_connection(self, url):
        "Instantiates a connection object"

        proxy, puser, ppass = get_proxy(url)
        serverObj = connection.StreamConnection(url, proxy=proxy,
                                                username=puser, password=ppass,
                                                xml_dump_version=self.xml_dump_version, timeout=CFG.timeout)
        BaseWireSource.serverObj = serverObj
        return serverObj

    def _set_ssl_trusted_certs(self, serverObj):
        if not self.sslYN:
            return None

        # Check certificate
        if CFG.ISS_PARENT:
            caChain = CFG.ISS_CA_CHAIN
        else:
            caChain = CFG.CA_CHAIN
        if caChain:
            # require RHNS-CA-CERT file to be able to authenticate the SSL
            # connections.
            if not os.access(caChain, os.R_OK):
                message = "ERROR: can not find SUSE Manager CA file: %s" % caChain
                log(-1, message, stream=sys.stderr)
                raise Exception(message)
            # force the validation of the SSL cert
            serverObj.add_trusted_cert(caChain)
            return caChain

        message = '--- Warning: SSL connection made but no CA certificate used'
        log(1, message, stream=sys.stderr)
        return None

    def _openSocketStream(self, method, params):
        """Wraps the gzipstream.GzipStream instantiation in a test block so we
           can open normally if stream is not gzipped."""

        stream = None
        retryYN = 0
        wait = 0.33
        lastErrorMsg = ''
        cfg = config.initUp2dateConfig()
        for i in range(cfg['networkRetries']):
            server = self.getServer(retryYN)
            if server is None:
                log2(-1, 2, 'ERROR: server unable to initialize, attempt %s' % i, stream=sys.stderr)
                retryYN = 1
                time.sleep(wait)
                continue
            func = getattr(server, method)
            try:
                stream = func(*params)
                if CFG.SYNC_TO_TEMP:
                    import tempfile
                    cached = tempfile.NamedTemporaryFile()
                    stream.read_to_file(cached)
                    cached.seek(0)
                    return cached
                else:
                    return stream
            except rpclib.xmlrpclib.ProtocolError:
                e = sys.exc_info()[1]
                p = tuple(['<the systemid>'] + list(params[1:]))
                lastErrorMsg = 'ERROR: server.%s%s: %s' % (method, p, e)
                log2(-1, 2, lastErrorMsg, stream=sys.stderr)
                retryYN = 1
                time.sleep(wait)
                # do not reraise this exception!
            except (KeyboardInterrupt, SystemExit):
                raise
            except rpclib.xmlrpclib.Fault:
                e = sys.exc_info()[1]
                lastErrorMsg = e.faultString
                break
            except Exception:  # pylint: disable=E0012, W0703
                e = sys.exc_info()[1]
                p = tuple(['<the systemid>'] + list(params[1:]))
                lastErrorMsg = 'ERROR: server.%s%s: %s' % (method, p, e)
                log2(-1, 2, lastErrorMsg, stream=sys.stderr)
                break
                # do not reraise this exception!
        if lastErrorMsg:
            raise_with_tb(RhnSyncException(lastErrorMsg), sys.exc_info()[2])
        # Returns a stream
        # Should never be reached
        return stream

    def setServerHandler(self, isIss=0):
        if isIss:
            self.server_handler = CFG.RHN_ISS_METADATA_HANDLER
        else:
            self.server_handler = CFG.RHN_METADATA_HANDLER


class MetadataWireSource(BaseWireSource):

    """retrieve specific xml stream through xmlrpc interface."""

    @staticmethod
    def is_disk_loader():
        return False

    def _prepare(self):
        self.setServer(self.server_handler)

    def getArchesXmlStream(self):
        """retrieve xml stream for arch data."""
        self._prepare()
        return self._openSocketStream("dump.arches", (self.systemid,))

    def getArchesExtraXmlStream(self):
        "retrieve xml stream for the server group type arch compat"
        self._prepare()
        return self._openSocketStream("dump.arches_extra", (self.systemid,))

    def getProductNamesXmlStream(self):
        "retrieve xml stream for the product names data"
        self._prepare()
        return self._openSocketStream("dump.product_names", (self.systemid,))

    def getChannelFamilyXmlStream(self):
        """retrieve xml stream for channel family data."""
        self._prepare()
        return self._openSocketStream("dump.channel_families", (self.systemid,))

    def getOrgsXmlStream(self):
        """retrieve xml stream for org data."""
        self._prepare()
        return self._openSocketStream("dump.orgs", (self.systemid,))

    def getChannelXmlStream(self):
        """retrieve xml stream for channel data given a
        list of channel labels."""
        self._prepare()
        return self._openSocketStream("dump.channels", (self.systemid, []))

    def getShortPackageXmlStream(self, packageIds):
        """retrieve xml stream for short package data given
        a list of package ids."""
        self._prepare()
        return self._openSocketStream("dump.packages_short", (self.systemid, packageIds))

    def getChannelShortPackagesXmlStream(self, channel, last_modified):
        """retrieve xml stream for short package data given a channel
        label and the last modified timestamp of the channel"""
        self._prepare()
        return self._openSocketStream("dump.channel_packages_short",
                                      (self.systemid, channel, last_modified))

    def getPackageXmlStream(self, packageIds):
        """retrieve xml stream for package data given a
        list of package ids."""
        self._prepare()
        return self._openSocketStream("dump.packages", (self.systemid, packageIds))

    def getSourcePackageXmlStream(self, packageIds):
        """retrieve xml stream for package data given a
        list of package ids."""
        self._prepare()
        return self._openSocketStream("dump.source_packages", (self.systemid, packageIds))

    def getErrataXmlStream(self, erratumIds):
        """retrieve xml stream for erratum data given a list of erratum ids."""
        self._prepare()
        return self._openSocketStream("dump.errata", (self.systemid, erratumIds))

    def getKickstartsXmlStream(self, ksLabels):
        "retrieve xml stream for kickstart trees"
        self._prepare()
        return self._openSocketStream("dump.kickstartable_trees",
                                      (self.systemid, ksLabels))

    def getComps(self, channel):
        return self._openSocketStream("dump.get_comps",
                                      (self.systemid, channel))

    def getModules(self, channel):
        return self._openSocketStream("dump.get_modules",
                                      (self.systemid, channel))

    def getRpm(self, nvrea, channel, checksum):
        release = nvrea[2]
        epoch = nvrea[3]
        if epoch:
            release = "%s:%s" % (release, epoch)
        package_name = "%s-%s-%s.%s.rpm" % (nvrea[0], nvrea[1], release,
                                            nvrea[4])
        self._prepare()
        return self._openSocketStream("dump.get_rpm",
                                      (self.systemid, package_name, channel, checksum))

    def getKickstartFile(self, ks_label, relative_path):
        self._prepare()
        return self._openSocketStream("dump.get_ks_file",
                                      (self.systemid, ks_label, relative_path))


    def getSupportInformationXmlStream(self):
        """retrieve xml stream for channel family data."""
        self._prepare()
        return self._openSocketStream("dump.support_information", (self.systemid,))

    def getSuseProductsXmlStream(self):
        """retrieve xml stream for SUSE Products"""
        self._prepare()
        return self._openSocketStream("dump.suse_products", (self.systemid,))

    def getSuseProductChannelsXmlStream(self):
        """retrieve xml stream for SUSE Product Channels"""
        self._prepare()
        return self._openSocketStream("dump.suse_product_channels", (self.systemid,))

    def getSuseUpgradePathsXmlStream(self):
        """retrieve xml stream for Upgrade Paths"""
        self._prepare()
        return self._openSocketStream("dump.suse_upgrade_paths", (self.systemid,))

    def getSuseProductExtensionsXmlStream(self):
        """retrieve xml stream for SUSE Product Extensions"""
        self._prepare()
        return self._openSocketStream("dump.suse_product_extensions", (self.systemid,))

    def getSuseProductRepositoriesXmlStream(self):
        """retrieve xml stream for SUSE Product Repositories"""
        self._prepare()
        return self._openSocketStream("dump.suse_product_repositories", (self.systemid,))

    def getSCCRepositoriesXmlStream(self):
        """retrieve xml stream for SCC Repositories"""
        self._prepare()
        return self._openSocketStream("dump.scc_repositories", (self.systemid,))

    def getSuseSubscriptionsXmlStream(self):
        """retrieve xml stream for Subscriptions"""
        self._prepare()
        return self._openSocketStream("dump.suse_subscriptions", (self.systemid,))

    def getClonedChannelsXmlStream(self):
        """retrieve xml stream for Cloned Channels"""
        self._prepare()
        return self._openSocketStream("dump.cloned_channels", (self.systemid,))

class XMLRPCWireSource(BaseWireSource):

    "Base class for all the XMLRPC calls"

    @staticmethod
    def _xmlrpc(function, params):
        try:
            retval = getattr(BaseWireSource.serverObj, function)(*params)
        except TypeError:
            e = sys.exc_info()[1]
            log(-1, 'ERROR: during "getattr(BaseWireSource.serverObj, %s)(*(%s))"' % (function, params))
            raise
        except rpclib.xmlrpclib.ProtocolError:
            e = sys.exc_info()[1]
            log2(-1, 2, 'ERROR: ProtocolError: %s' % e, stream=sys.stderr)
            raise
        return retval


class AuthWireSource(XMLRPCWireSource):

    """Simply authenticate this systemid as a satellite."""

    def checkAuth(self):
        self.setServer(CFG.RHN_XMLRPC_HANDLER)
        authYN = None
        log(2, '   +++ SUSE Manager Server synchronization tool checking in.')
        try:
            authYN = self._xmlrpc('authentication.check', (self.systemid,))
        except (rpclib.xmlrpclib.ProtocolError, rpclib.xmlrpclib.Fault):
            raise
        if authYN:
            log(2, '   +++ Entitled SUSE Manager Server validated.', stream=sys.stderr)
        elif authYN is None:
            log(-1, '   --- An error occurred upon authentication of this SUSE Manager Server -- '
                    'review the pertinent log file (%s) and/or submit a service request.' % CFG.LOG_FILE,
                stream=sys.stderr)
            sys.exit(-1)
        elif authYN == 0:
            log(-1, '   --- This server is not entitled.', stream=sys.stderr)
            sys.exit(-1)
        return authYN

class RPCGetWireSource(BaseWireSource):

    "Class to retrieve various files via authenticated GET requests"
    get_server_obj = None
    login_token = None
    get_server_obj = None

    def __init__(self, systemid, sslYN, xml_dump_version):
        BaseWireSource.__init__(self, systemid, sslYN, xml_dump_version)
        self.extinctErrorYN = 0

    @staticmethod
    def _set_connection_params(handler, url):
        BaseWireSource._set_connection_params(handler, url)
        RPCGetWireSource.login_token = None

    def login(self, force=0):
        "Perform a login, return a GET Server instance"
        if force:
            # Invalidate it
            self._set_login_token(None)
        if self.login_token:
            # Return cached one
            return self.get_server_obj

        # Force a login otherwise
        self._set_login_token(self._login())
        url = self.url + self.handler
        proxy, puser, ppass = get_proxy(url)
        get_server_obj = connection.GETServer(url, proxy=proxy,
                                              username=puser, password=ppass,
                                              headers=self.login_token, timeout=CFG.timeout)
        # Add SSL trusted cert
        self._set_ssl_trusted_certs(get_server_obj)
        self._set_rpc_server(get_server_obj)
        return self.get_server_obj

    def _login(self):
        if not self.systemid:
            raise Exception("systemid not set!")

        # Set the URL to the one for regular XML-RPC calls
        self.setServer(CFG.RHN_XMLRPC_HANDLER)

        try:
            login_token = self.getServer().authentication.login(self.systemid)
        except rpclib.xmlrpclib.ProtocolError:
            e = sys.exc_info()[1]
            log2(-1, 2, 'ERROR: ProtocolError: %s' % e, stream=sys.stderr)
            raise
        return login_token

    @staticmethod
    def _set_login_token(token):
        RPCGetWireSource.login_token = token

    @staticmethod
    def _set_rpc_server(server):
        RPCGetWireSource.get_server_obj = server

    def _rpc_call(self, function_name, params):
        get_server_obj = self.login()
        # Try a couple of times
        fault_count = 0
        expired_token = 0
        cfg = config.initUp2dateConfig()
        while fault_count - expired_token < cfg['networkRetries']:
            try:
                ret = getattr(get_server_obj, function_name)(*params)
            except rpclib.xmlrpclib.ProtocolError:
                e = sys.exc_info()[1]
                # We have two codes to check: the HTTP error code, and the
                # combination (failtCode, faultString) encoded in the headers
                # of the request.
                http_error_code = e.errcode
                fault_code, fault_string = rpclib.reportError(e.headers)
                fault_count += 1
                if http_error_code == 401 and fault_code == -34:
                    # Login token expired
                    get_server_obj = self.login(force=1)
                    # allow exactly one respin for expired token
                    expired_token = 1
                    continue
                if http_error_code == 404 and fault_code == -17:
                    # File not found
                    self.extinctErrorYN = 1
                    return None
                log(-1, 'ERROR: http error code :%s; fault code: %s; %s' %
                    (http_error_code, fault_code, fault_string))
                # XXX
                raise
            else:
                return ret
        raise Exception("Failed after multiple attempts!")

    def getPackageStream(self, channel, nvrea, checksum):
        release = nvrea[2]
        epoch = nvrea[3]
        if epoch:
            release = "%s:%s" % (release, epoch)
        package_name = "%s-%s-%s.%s.rpm" % (nvrea[0], nvrea[1], release,
                                            nvrea[4])
        return self._rpc_call("getPackage", (channel, package_name, checksum))

    def getKickstartFileStream(self, channel, ks_tree_label, relative_path):
        return self._rpc_call("getKickstartFile", (channel, ks_tree_label,
                                                   relative_path))

    def getCompsFileStream(self, channel):
        return self._rpc_call("repodata", (channel, 'comps.xml'))

    def getModulesFilesStram(self, channel):
        return self._rpc_call("repodata", (channel, 'modules.yaml'))
   07070100000118000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000001900000000spacewalk-backend/server  07070100000119000081B40000000000000000000000015FBBE8EE000002FA000000000000000000000000000000000000002200000000spacewalk-backend/server/Makefile # Makefile for spacewalk backend
#

# what is the backend top dir
TOP     = ..

# Specific stuff
SUBDIR		= server

FILES		= __init__
SPACEWALK_FILES		= __init__ \
		  apacheServer apacheHandler apacheAuth apacheRequest \
                  apacheUploadServer \
		  configFilesHandler \
		  rhnAuthPAM rhnCapability rhnChannel \
                  rhnDependency \
                  rhnAction \
                  rhnHandler rhnImport rhnMapping rhnLib rhnPackage \
                  rhnPackageUpload basePackageUpload rhnRepository \
                  rhnSession rhnUser rhnVirtualization taskomatic \
                  suseEula
SUBDIRS		= rhnSQL rhnServer action \
			  handlers importlib action_extra_data \
			  config_common repomd

include $(TOP)/Makefile.defs
  0707010000011A000081B40000000000000000000000015FBBE8EE000002DD000000000000000000000000000000000000002500000000spacewalk-backend/server/__init__.py  #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# init module for the whole server object. We also provide a few
# exposed classes for making import statements nicer
#
   0707010000011B000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002000000000spacewalk-backend/server/action   0707010000011C000081B40000000000000000000000015FBBE8EE0000015A000000000000000000000000000000000000002900000000spacewalk-backend/server/action/Makefile  # Makefile for the action handlers module
#

TOP	= ../..
SUBDIR	= server/action

SPACEWALK_FILES	= __init__ configfiles kickstart kickstart_guest packages errata hardware reboot \
          rollback activation script rhnsd rhn_applet virt kickstart_host \
          utils scap image distupgrade clientcert channels

include $(TOP)/Makefile.defs

  0707010000011D000081B40000000000000000000000015FBBE8EE00000265000000000000000000000000000000000000002C00000000spacewalk-backend/server/action/__init__.py   #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
   0707010000011E000081B40000000000000000000000015FBBE8EE00000CFC000000000000000000000000000000000000002E00000000spacewalk-backend/server/action/activation.py #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# Activation key related queuing functions
#

from spacewalk.common.rhnLog import log_debug
from spacewalk.server import rhnSQL, rhnAction, rhnServer
from spacewalk.server.rhnLib import ShadowAction
from spacewalk.server.rhnServer import server_kickstart

# the "exposed" functions
__rhnexport__ = ['schedule_deploy', 'schedule_pkg_install', ]


# queries
_query_copy_pkgs_from_shadow_action = rhnSQL.Statement("""
    insert into rhnActionPackage (id, action_id, name_id, parameter)
    select sequence_nextval('rhn_act_p_id_seq'), :new_action_id, name_id, parameter
      from rhnActionPackage
     where action_id = :action_id
""")

_query_copy_revs_from_shadow_action = rhnSQL.Statement("""
    insert into rhnActionConfigRevision (id, action_id, server_id, config_revision_id)
    select sequence_nextval('rhn_actioncr_id_seq'), :new_action_id, server_id, config_revision_id
      from rhnActionConfigRevision
     where action_id = :action_id
       and server_id = :server_id
""")


def schedule_deploy(server_id, action_id, dry_run=0):
    log_debug(2, server_id, action_id)
    s = rhnServer.search(server_id)

    # Schedule an rhncfg install
    new_action_id = server_kickstart.schedule_rhncfg_install(server_id,
                                                             action_id, scheduler=None)

    new_action_id_2 = rhnAction.schedule_server_action(
        server_id,
        action_type='configfiles.deploy',
        action_name="Activation Key Config Auto-Deploy",
        delta_time=0, scheduler=None,
        org_id=s.server['org_id'],
        prerequisite=new_action_id,
    )

    if (not dry_run):
        h = rhnSQL.prepare(_query_copy_revs_from_shadow_action)
        h.execute(action_id=action_id, new_action_id=new_action_id_2,
                  server_id=server_id)
    else:
        log_debug(4, "dry run requested")

    log_debug(4, "scheduled config deploy for activation key")

    raise ShadowAction("Config deploy scheduled")


# XXX this duplicates rhnAction.schedule_server_packages_update. fix that.
def schedule_pkg_install(server_id, action_id, dry_run=0):
    s = rhnServer.search(server_id)

    new_action_id = rhnAction.schedule_server_action(
        server_id,
        action_type='packages.update',
        action_name="Activation Key Package Auto-Install",
        delta_time=0, scheduler=None,
        org_id=s.server['org_id'],
    )

    if (not dry_run):
        h = rhnSQL.prepare(_query_copy_pkgs_from_shadow_action)
        h.execute(action_id=action_id, new_action_id=new_action_id)
    else:
        log_debug(4, "dry run requested")

    log_debug(4, "scheduled pkg install for activation key")

    raise ShadowAction("Package install scheduled")
0707010000011F000081B40000000000000000000000015FBBE8EE00000327000000000000000000000000000000000000002C00000000spacewalk-backend/server/action/channels.py   # -*- coding: utf-8 -*-
#
# Copyright (c) 2018 SUSE LLC
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#

import sys
from spacewalk.common.rhnLog import log_debug
from spacewalk.common.rhnException import rhnFault
from spacewalk.server.rhnLib import ShadowAction

# the "exposed" functions
__rhnexport__ = ['subscribe']

def subscribe(serverId, actionId, dry_run=0):
    log_debug(3)

    raise ShadowAction("subscribe channel requested - internal DB operation only")
 07070100000120000081B40000000000000000000000015FBBE8EE0000031C000000000000000000000000000000000000002E00000000spacewalk-backend/server/action/clientcert.py #
# Copyright (c) 2014--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.

from spacewalk.common.rhnLog import log_debug

__rhnexport__ = ['update_client_cert']


def update_client_cert(server_id, action_id, dry_run=0):
    log_debug(3, action_id)
    return
07070100000121000081B40000000000000000000000015FBBE8EE0000148D000000000000000000000000000000000000002F00000000spacewalk-backend/server/action/configfiles.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# config file-related queuing functions
#

import time

from spacewalk.common.rhnLog import log_debug
from spacewalk.server import rhnSQL, rhnServer
from spacewalk.server.configFilesHandler import format_file_results
from spacewalk.server.config_common.templated_document import var_interp_prep

# the "exposed" functions
__rhnexport__ = ['upload', 'deploy', 'verify', 'diff', 'mtime_upload']

_query_upload_files = rhnSQL.Statement("""
    select cfn.path
      from rhnActionConfigFileName acfn, rhnConfigFileName cfn
     where acfn.server_id = :server_id
       and acfn.action_id = :action_id
       and acfn.config_file_name_id = cfn.id
""")

_query_mtime_upload_info = rhnSQL.Statement("""
    select TO_CHAR(start_date, 'YYYY-MM-DD HH24:MI:SS') as start_date,
           TO_CHAR(end_date, 'YYYY-MM-DD HH24:MI:SS') as end_date,
           TO_CHAR(current_timestamp, 'YYYY-MM-DD HH24:MI:SS') as now,
           import_contents
      from rhnActionConfigDate
     where action_id = :action_id
""")

_query_mtime_upload_paths = rhnSQL.Statement("""
    select file_name,
           file_type
      from rhnActionConfigDateFile
     where action_id = :action_id
""")


def mtime_upload(server_id, action_id, dry_run=0):
    log_debug(3)

    data = {}

    h = rhnSQL.prepare(_query_mtime_upload_info)
    h.execute(action_id=action_id)

    info = h.fetchone_dict()
    info['start_date'] = time.mktime(time.strptime(info['start_date'], '%Y-%m-%d %H:%M:%S'))
    info['now'] = time.mktime(time.strptime(info['now'], '%Y-%m-%d %H:%M:%S'))

    if info['end_date']:
        info['end_date'] = time.mktime(time.strptime(info['end_date'], '%Y-%m-%d %H:%M:%S'))
    else:
        info['end_date'] = ''

    data['info'] = info

    data['search'] = []
    data['ignore'] = []

    h = rhnSQL.prepare(_query_mtime_upload_paths)
    h.execute(action_id=action_id)

    while 1:
        row = h.fetchone_dict() or []

        if not row:
            break

        if row['file_type'] == 'W':
            data['search'].append(row['file_name'])
        elif row['file_type'] == 'B':
            data['ignore'].append(row['file_name'])

    log_debug(4, 'data', data)

    return action_id, data


def upload(server_id, action_id, dry_run=0):
    log_debug(3)
    h = rhnSQL.prepare(_query_upload_files)
    h.execute(action_id=action_id, server_id=server_id)
    files = [x['path'] for x in h.fetchall_dict() or []]

    return action_id, files


def deploy(server_id, action_id, dry_run=0):
    log_debug(3)
    return _get_files(server_id, action_id)


def verify(server_id, action_id, dry_run=0):
    log_debug(3)
    return _get_files(server_id, action_id)


def diff(server_id, action_id, dry_run=0):
    log_debug(3)
    return _get_files(server_id, action_id)

_query_get_files = rhnSQL.Statement("""
    select cfn.path,
           cc.label config_channel,
           ccont.contents file_contents,
           ccont.is_binary is_binary,
           c.checksum_type,
           c.checksum,
           ccont.delim_start,
           ccont.delim_end,
           cr.revision,
           ci.username,
           ci.groupname,
           ci.filemode,
               cft.label,
               ci.selinux_ctx,
           case
                when cft.label='symlink' then (select path from rhnConfigFileName where id = ci.SYMLINK_TARGET_FILENAME_ID)
                else ''
            end as symlink
      from
           rhnConfigFileState cfs,
           rhnConfigChannel cc,
           rhnConfigFileName cfn,
           rhnConfigInfo ci,
           rhnConfigFile cf,
           rhnConfigRevision cr
      left join rhnConfigContent ccont
        on cr.config_content_id = ccont.id
      left join rhnChecksumView c
        on ccont.checksum_id = c.id,
           rhnConfigFileType cft,
           rhnActionConfigRevision acr
     where acr.server_id = :server_id
       and acr.action_id = :action_id
       and acr.config_revision_id = cr.id
       and cr.config_file_id = cf.id
       and cr.config_info_id = ci.id
       and cf.config_file_name_id = cfn.id
       and cf.config_channel_id = cc.id
       and cf.state_id = cfs.id
       and cfs.label = 'alive'
       and cr.config_file_type_id = cft.id
""")


def _get_files(server_id, action_id):
    h = rhnSQL.prepare(_query_get_files)
    h.execute(action_id=action_id, server_id=server_id)
    server = rhnServer.search(server_id)
    server = var_interp_prep(server)

    files = []
    while 1:
        row = h.fetchone_dict()
        if not row:
            break
        files.append(format_file_results(row, server=server))

    result = {
        'files': files,
    }
    return result
   07070100000122000081B40000000000000000000000015FBBE8EE0000119C000000000000000000000000000000000000002F00000000spacewalk-backend/server/action/distupgrade.py    # -*- coding: utf-8 -*-
#
# Copyright (c) 2012 SUSE LLC
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#

import sys
from spacewalk.common.rhnLog import log_debug
from spacewalk.common.rhnException import rhnFault
from uyuni.common.usix import raise_with_tb
from spacewalk.server import rhnSQL
from spacewalk.server.rhnChannel import subscribe_channels, unsubscribe_channels
from spacewalk.server.rhnLib import InvalidAction, ShadowAction

# the "exposed" functions
__rhnexport__ = ['upgrade']

_query_dup_data = rhnSQL.Statement("""
    SELECT id, dry_run, allow_vendor_change, full_update
      FROM rhnActionDup
     WHERE action_id = :action_id
""")

_query_channel_changes = rhnSQL.Statement("""
    SELECT c.id, c.label, c.parent_channel, adc.task
      FROM rhnActionDupChannel adc
      JOIN rhnChannel c ON adc.channel_id = c.id
     WHERE adc.action_dup_id = :action_dup_id
""")

_query_products = rhnSQL.Statement("""
    SELECT p1.name,
           p1.version,
           p2.name new_name,
           p2.version new_version,
           COALESCE(p2.release, ' ') new_release,
           COALESCE(pa.label, ' ') new_arch
      FROM rhnActionDupProduct adp
      JOIN suseProducts p1 ON adp.from_pdid = p1.id
      JOIN suseProducts p2 ON adp.to_pdid = p2.id
 LEFT JOIN rhnPackageArch pa ON pa.id = p2.arch_type_id
     WHERE adp.action_dup_id = :action_dup_id
""")


# returns the values required to execute a dist upgrade
# change also the channel subscription
#
def upgrade(serverId, actionId, dry_run=0):
    log_debug(3)

    if dry_run:
        # can happen if future actions are requested
        raise ShadowAction("dry run requested - skipping")

    h = rhnSQL.prepare(_query_dup_data)
    h.execute(action_id=actionId)
    row = h.fetchone_dict()
    if not row:
        # No dup for this action
        raise InvalidAction("distupgrade.upgrade: No action found for action id "
            "%s and server %s" % (actionId, serverId))

    action_dup_id = row['id']

    # get product info

    h = rhnSQL.prepare(_query_products)
    h.execute(action_dup_id=action_dup_id)
    products = h.fetchall_dict() or []

    # only SLE10 products needs to be changed manually
    # remove all not SLE10 based products

    sle10_products = []
    do_change = False
    for product in products:
        if product['version'] == '10':
            do_change = True
            sle10_products.append(product)

    # switch the channels for this server

    h = rhnSQL.prepare(_query_channel_changes)
    h.execute(action_dup_id=action_dup_id)
    channel_changes = h.fetchall_dict() or None

    if not channel_changes:
        # this happens in case a distupgrade failed and the
        # another distupgrade is scheduled to fix the installation
        # we do not have the original channels anymore, so we need
        # to execute a full "dup" without channels
        params = {
            "full_update"         : (row['full_update'] == 'Y'),
            "change_product"      : do_change,
            "products"            : sle10_products,
            "allow_vendor_change" : (row['allow_vendor_change'] == 'Y'),
            "dry_run"             : (row['dry_run'] == 'Y') }
        return (params)

    to_subscribe = [x for x in channel_changes if x['task'] == 'S']
    to_unsubscribe = [x for x in channel_changes if x['task'] == 'U']

    try:
        unsubscribe_channels(serverId, to_unsubscribe)
        subscribe_channels(serverId, to_subscribe)
    except rhnFault as f:
        if f.code == 38:
            # channel is already subscribed, ignore it
            pass
        else:
            raise_with_tb(InvalidAction(str(f)), sys.exc_info()[2])
    except Exception as e:
        raise_with_tb(InvalidAction(str(e)), sys.exc_info()[2])

    rhnSQL.commit()

    params = {
        "dup_channel_names"   : [x['label'] for x in to_subscribe],
        "full_update"         : (row['full_update'] == 'Y'),
        "change_product"      : do_change,
        "products"            : sle10_products,
        "allow_vendor_change" : (row['allow_vendor_change'] == 'Y'),
        "dry_run"             : (row['dry_run'] == 'Y') }
    return (params)

07070100000123000081B40000000000000000000000015FBBE8EE00000553000000000000000000000000000000000000002A00000000spacewalk-backend/server/action/errata.py #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

from spacewalk.common.rhnLog import log_debug
from spacewalk.server import rhnSQL
from spacewalk.server.rhnLib import InvalidAction

# the "exposed" functions
__rhnexport__ = ['update']

# returns a list of errata scheduled for this action


def update(serverId, actionId, dry_run=0):
    log_debug(3)
    statement = """
        select errata_id
        from rhnActionErrataUpdate
        where action_id = :action_id"""
    h = rhnSQL.prepare(statement)
    h.execute(action_id=actionId)
    ret = h.fetchall_dict()
    if not ret:
        # No errata for this action
        raise InvalidAction("errata.update: Unknown action id "
                            "%s for server %s" % (actionId, serverId))

    return [x['errata_id'] for x in ret]
 07070100000124000081B40000000000000000000000015FBBE8EE0000030C000000000000000000000000000000000000002C00000000spacewalk-backend/server/action/hardware.py   #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

from spacewalk.common.rhnLog import log_debug

__rhnexport__ = ['refresh_list']


def refresh_list(serverId, actionId, dry_run=0):
    log_debug(3)
    return None
07070100000125000081B40000000000000000000000015FBBE8EE0000072D000000000000000000000000000000000000002900000000spacewalk-backend/server/action/image.py  # -*- coding: utf-8 -*-
#
# Copyright (c) 2011 SUSE LLC
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#

from spacewalk.common.rhnLog import log_debug
from spacewalk.server import rhnSQL
from spacewalk.server.rhnLib import InvalidAction

# the "exposed" functions
__rhnexport__ = ['deploy']

# returns the values for deploying a virtual machine with an image
#
# file_name, checksum, mem_kb, vcpus, imageType
#


def deploy(serverId, actionId, dry_run=0):
    log_debug(3)
    statement = """
        select aid.mem_kb, aid.vcpus, aid.bridge_device,aid.download_url,
               aid.proxy_server, aid.proxy_user, aid.proxy_pass
          from rhnActionImageDeploy aid
           where aid.action_id = :action_id"""
    h = rhnSQL.prepare(statement)
    h.execute(action_id=actionId)
    row = h.fetchone_dict()
    if not row:
        # No image for this action
        raise InvalidAction("image.deploy: No image found for action id "
                            "%s and server %s" % (actionId, serverId))

    for key in ['download_url', 'proxy_server', 'proxy_user', 'proxy_pass', 'bridge_device']:
        if row[key] is None:
            row[key] = ""

    params = {
        "downloadURL": row['download_url'],
        "proxySettings": {"proxyURL": row['proxy_server'], "proxyUser": row['proxy_user'], "proxyPass": row['proxy_pass']},
        "memKB": row['mem_kb'],
        "vCPUs": row['vcpus'],
        "domainName": "",
        "virtBridge": row['bridge_device']}
    return (params)
   07070100000126000081B40000000000000000000000015FBBE8EE0000134F000000000000000000000000000000000000002D00000000spacewalk-backend/server/action/kickstart.py  #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

from spacewalk.common.rhnLog import log_debug
from spacewalk.server import rhnSQL
from spacewalk.server.rhnLib import InvalidAction, ShadowAction
from spacewalk.server.rhnServer import server_kickstart, server_packages

# the "exposed" functions
__rhnexport__ = ['initiate', 'schedule_sync']

_query_initiate = rhnSQL.Statement("""
    select ak.append_string, ak.static_device, ak.kickstart_host, ak.cobbler_system_name
      from rhnActionKickstart ak, rhnKickstartableTree kst
     where ak.action_id = :action_id
""")

_query_file_list_initiate = rhnSQL.Statement("""
    select distinct rcfn.path
      from rhnActionKickstartFileList akfl,
           rhnFileListMembers rflm,
           rhnConfigFileName rcfn,
           rhnActionKickstart ak
     where rcfn.id = rflm.config_file_name_id
       and akfl.file_list_id = rflm.file_list_id
       and akfl.action_ks_id = ak.id
       and ak.action_id = :action_id
""")


def initiate(server_id, action_id, dry_run=0):
    log_debug(3)
    h = rhnSQL.prepare(_query_initiate)
    h.execute(action_id=action_id)
    row = h.fetchone_dict()
    if not row:
        raise InvalidAction("Kickstart action without an associated kickstart")
    boot_image, append_string = ('spacewalk-koan', row['append_string'])
    static_device = row['static_device'] or ""
    kickstart_host = row['kickstart_host']
    system_record = row['cobbler_system_name']
    if system_record is None:
        system_record = ''
    if not boot_image:
        raise InvalidAction("Boot image missing")
    if not kickstart_host:
        raise InvalidAction("Kickstart_host missing")

    h = rhnSQL.prepare(_query_file_list_initiate)
    h.execute(action_id=action_id)
    files = [x['path'] for x in h.fetchall_dict() or []]

    return (kickstart_host, boot_image, append_string, static_device, system_record, files)


def schedule_sync(server_id, action_id, dry_run=0):
    log_debug(3, server_id, action_id)
    if dry_run:
        raise ShadowAction("dry run requested - skipping")

    kickstart_session_id = server_kickstart.get_kickstart_session_id(server_id,
                                                                     action_id)

    if kickstart_session_id is None:
        raise InvalidAction("Could not find kickstart session ID")

    row = server_kickstart.get_kickstart_session_info(kickstart_session_id, server_id)
    deploy_configs = (row['deploy_configs'] == 'Y')

    ks_package_profile = server_kickstart.get_kisckstart_session_package_profile(kickstart_session_id)
    # if the session doesn't have a pkg profile, try from the ks profile itself
    if not ks_package_profile:
        ks_package_profile = server_kickstart.get_kickstart_profile_package_profile(kickstart_session_id)

    if not ks_package_profile:
        log_debug(4, "No kickstart package profile")
        # No profile to bring this system to
        if deploy_configs:
            # We have to deploy configs, so pass in a server profile
            server_profile = server_kickstart.get_server_package_profile(server_id)
        else:
            # No configs to be deployed
            server_profile = None

        server_kickstart.schedule_config_deploy(server_id,
                                                action_id, kickstart_session_id, server_profile=server_profile)
        raise ShadowAction("Package sync not scheduled, missing kickstart "
                           "package profile; proceeding with configfiles.deploy")

    server_profile = server_kickstart.get_server_package_profile(server_id)

    installs, removes = server_packages.package_delta(server_profile,
                                                      ks_package_profile)

    if not (installs or removes):
        log_debug(4, "No packages to be installed/removed")
        if not deploy_configs:
            server_profile = None

        server_kickstart.schedule_config_deploy(server_id,
                                                action_id, kickstart_session_id, server_profile=None)
        raise ShadowAction("Package sync not scheduled, nothing to do")

    log_debug(4, "Scheduling kickstart delta")
    server_kickstart.schedule_kickstart_delta(server_id,
                                              kickstart_session_id, installs, removes)

    raise ShadowAction("Package sync scheduled")
 07070100000127000081B40000000000000000000000015FBBE8EE0000115F000000000000000000000000000000000000003300000000spacewalk-backend/server/action/kickstart_guest.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
import sys
from uyuni.common.usix import raise_with_tb
from spacewalk.common.rhnLog import log_debug
from spacewalk.server import rhnSQL
from spacewalk.server.rhnLib import InvalidAction, ShadowAction
from spacewalk.server.action.utils import SubscribedChannel, \
    ChannelPackage, \
    PackageInstallScheduler, \
    NoActionInfo, \
    PackageNotFound
from spacewalk.server.rhnChannel import subscribe_to_tools_channel


__rhnexport__ = ['initiate', 'schedule_virt_guest_pkg_install', 'add_tools_channel']

_query_initiate_guest = rhnSQL.Statement("""
 select  ksd.label as profile_name, akg.kickstart_host, kvt.label as virt_type,
       akg.mem_kb, akg.vcpus, akg.disk_path, akg.virt_bridge, akg.cobbler_system_name,
       akg.disk_gb, akg.append_string,
       akg.guest_name, akg.ks_session_id from rhnActionKickstartGuest akg,
        rhnKSData ksd, rhnKickstartSession ksess,
       rhnKickstartDefaults ksdef, rhnKickstartVirtualizationType kvt
     where akg.action_id = :action_id
       and ksess.kickstart_id = ksd.id
       and ksess.id = akg.ks_session_id
       and ksdef.kickstart_id = ksd.id
       and ksdef.virtualization_type = kvt.id
""")


def schedule_virt_guest_pkg_install(server_id, action_id, dry_run=0):
    """
        ShadowAction that schedules a package installation action for the
        rhn-virtualization-guest package.
    """
    log_debug(3)

    virt_host_package_name = "rhn-virtualization-guest"
    tools_channel = SubscribedChannel(server_id, "rhn-tools")
    found_tools_channel = tools_channel.is_subscribed_to_channel()

    if not found_tools_channel:
        raise InvalidAction("System not subscribed to the Tools channel.")

    rhn_v12n_package = ChannelPackage(server_id, virt_host_package_name)

    if not rhn_v12n_package.exists():
        raise InvalidAction("Could not find the rhn-virtualization-guest package.")

    try:
        install_scheduler = PackageInstallScheduler(server_id, action_id, rhn_v12n_package)
        if (not dry_run):
            install_scheduler.schedule_package_install()
        else:
            log_debug(4, "dry run requested")
    except NoActionInfo:
        nai = sys.exc_info()[1]
        raise_with_tb(InvalidAction(str(nai)), sys.exc_info()[2])
    except PackageNotFound:
        pnf = sys.exc_info()[1]
        raise_with_tb(InvalidAction(str(pnf)), sys.exc_info()[2])
    except Exception:
        e = sys.exc_info()[1]
        raise_with_tb(InvalidAction(str(e)), sys.exc_info()[2])

    log_debug(3, "Completed scheduling install of rhn-virtualization-guest!")
    raise ShadowAction("Scheduled installation of Virtualization Guest packages.")


def initiate(server_id, action_id, dry_run=0):
    log_debug(3)
    h = rhnSQL.prepare(_query_initiate_guest)
    h.execute(action_id=action_id)
    row = h.fetchone_dict()

    if not row:
        raise InvalidAction("Kickstart action without an associated kickstart")

    kickstart_host = row['kickstart_host']
    virt_type = row['virt_type']
    name = row['guest_name']
    boot_image = "spacewalk-koan"
    append_string = row['append_string']
    vcpus = row['vcpus']
    disk_gb = row['disk_gb']
    mem_kb = row['mem_kb']
    ks_session_id = row['ks_session_id']
    virt_bridge = row['virt_bridge']
    disk_path = row['disk_path']
    cobbler_system_name = row['cobbler_system_name']

    if not boot_image:
        raise InvalidAction("Boot image missing")

    return (kickstart_host, cobbler_system_name, virt_type, ks_session_id, name,
            mem_kb, vcpus, disk_gb, virt_bridge, disk_path, append_string)


def add_tools_channel(server_id, action_id, dry_run=0):
    log_debug(3)
    if (not dry_run):
        subscribe_to_tools_channel(server_id)
    else:
        log_debug(4, "dry run requested")
    raise ShadowAction("Subscribed guest to tools channel.")
 07070100000128000081B40000000000000000000000015FBBE8EE00000C87000000000000000000000000000000000000003200000000spacewalk-backend/server/action/kickstart_host.py #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import sys
from spacewalk.common.rhnLog import log_debug
from uyuni.common.usix import raise_with_tb
from spacewalk.server.rhnLib import InvalidAction, ShadowAction
from spacewalk.server.action.utils import SubscribedChannel,\
    ChannelPackage, \
    PackageInstallScheduler, \
    NoActionInfo, \
    PackageNotFound
from spacewalk.server.rhnChannel import subscribe_to_tools_channel

__rhnexport__ = ['schedule_virt_host_pkg_install', 'add_tools_channel']


def add_tools_channel(server_id, action_id, dry_run=0):
    if (not dry_run):
        subscribe_to_tools_channel(server_id)
    else:
        log_debug(4, "dry run requested")
    raise ShadowAction("Subscribed server to tools channel.")


def schedule_virt_host_pkg_install(server_id, action_id, dry_run=0):
    """
        ShadowAction that schedules a package installation action for the
        rhn-virtualization-host and osad packages.
    """
    log_debug(3)

    virt_host_package_name = "mgr-virtualization-host"
    messaging_package_name = "mgr-osad"

    tools_channel = SubscribedChannel(server_id, "rhn-tools")
    found_tools_channel = tools_channel.is_subscribed_to_channel()

    if not found_tools_channel:
        raise InvalidAction("System not subscribed to the Tools channel.")

    rhn_v12n_package = ChannelPackage(server_id, virt_host_package_name)

    if not rhn_v12n_package.exists():
        raise InvalidAction("Could not find the mgr-virtualization-host package.")

    messaging_package = ChannelPackage(server_id, messaging_package_name)

    if not messaging_package.exists():
        raise InvalidAction("Could not find the mgr-osad package.")

    try:
        rhn_v12n_install_scheduler = PackageInstallScheduler(server_id, action_id, rhn_v12n_package)
        messaging_package = PackageInstallScheduler(server_id, action_id, messaging_package)
        if (not dry_run):
            rhn_v12n_install_scheduler.schedule_package_install()
            messaging_package.schedule_package_install()
        else:
            log_debug(4, "dry run requested")
    except NoActionInfo:
        nai = sys.exc_info()[1]
        raise_with_tb(InvalidAction(str(nai)), sys.exc_info()[2])
    except PackageNotFound:
        pnf = sys.exc_info()[1]
        raise_with_tb(InvalidAction(str(pnf)), sys.exc_info()[2])
    except Exception:
        e = sys.exc_info()[1]
        raise_with_tb(InvalidAction(str(e)), sys.exc_info()[2])

    log_debug(3, "Completed scheduling install of mgr-virtualization-host and mgr-osad!")
    raise ShadowAction("Scheduled installation of Virtualization Host packages.")
 07070100000129000081B40000000000000000000000015FBBE8EE000028BD000000000000000000000000000000000000002C00000000spacewalk-backend/server/action/packages.py   #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# package-related queuing functions
#
# As a response to a queue.get, retrieves/deletes a queued action from
# the DB.
#

from spacewalk.common.rhnLog import log_debug
from spacewalk.server import rhnSQL, rhnCapability
from spacewalk.server.rhnLib import InvalidAction

# the "exposed" functions
__rhnexport__ = ['update',
                 'remove',
                 'refresh_list',
                 'runTransaction',
                 'verify',
                 'setLocks']

_query_action_verify_packages = rhnSQL.Statement("""
  select distinct
           pn.name as name,
           pe.version as version,
           pe.release as release,
           pe.epoch as epoch,
           pa.label as arch
      from rhnActionPackage ap
 left join rhnPackageArch pa
        on ap.package_arch_id = pa.id,
           rhnPackageName pn,
           rhnPackageEVR pe
     where ap.action_id = :actionid
       and ap.evr_id = pe.id
       and ap.name_id = pn.id
""")


def verify(serverId, actionId, dry_run=0):
    log_debug(3, dry_run)
    h = rhnSQL.prepare(_query_action_verify_packages)
    h.execute(actionid=actionId)
    tmppackages = h.fetchall_dict()

    if not tmppackages:
        raise InvalidAction("invalid action %s for server %s" %
                            (actionId, serverId))

    packages = []

    for package in tmppackages:

        packages.append([package['name'],
                         package['version'],
                         package['release'],
                         package['epoch'] or '',
                         package['arch'] or ''])
    log_debug(4, packages)
    return packages


def handle_action(serverId, actionId, packagesIn, dry_run=0):
    log_debug(3, serverId, actionId, dry_run)

    client_caps = rhnCapability.get_client_capabilities()
    log_debug(3, "Client Capabilities", client_caps)
    multiarch = 0
    if client_caps and 'packages.update' in client_caps:
        cap_info = client_caps['packages.update']
        if int(cap_info['version']) > 1:
            multiarch = 1
    if not packagesIn:
        raise InvalidAction("Packages scheduled in action %s for server %s could not be found." %
                            (actionId, serverId))

    packages = []
    for package in packagesIn:
        # Fix the epoch
        if package['epoch'] is None:
            package['epoch'] = ""
        pkg_arch = ''
        if multiarch:
            pkg_arch = package['arch'] or ''

        packages.append([package['name'],
                         package['version'] or '',
                         package['release'] or '',
                         package['epoch'],
                         pkg_arch])

    log_debug(4, packages)
    return packages


def remove(serverId, actionId, dry_run=0):
    h = rhnSQL.prepare(_packageStatement_remove)
    h.execute(serverid=serverId, actionid=actionId)
    tmppackages = h.fetchall_dict()
    return handle_action(serverId, actionId, tmppackages, dry_run)


def update(serverId, actionId, dry_run=0):
    h = rhnSQL.prepare(_packageStatement_update)
    h.execute(serverid=serverId, actionid=actionId)
    tmppackages = h.fetchall_dict()
    return handle_action(serverId, actionId, tmppackages, dry_run)

_query_action_setLocks = rhnSQL.Statement("""
  SELECT DISTINCT
    pn.name AS name,
    pe.version AS version,
    pe.releASe AS releASe,
    pe.epoch AS epoch,
    pa.label AS arch
  FROM rhnActionPackage ap
    JOIN rhnLockedPackages lp
      ON ap.name_id = lp.name_id AND
         ap.evr_id  = lp.evr_id AND
         ap.package_arch_id = lp.arch_id
    LEFT JOIN rhnPackageArch pa
      ON ap.package_arch_id = pa.id,
         rhnPackageName pn,
         rhnPackageEVR pe
    WHERE
      ap.action_id = :actionid AND
      ap.evr_id    = pe.id AND
      ap.name_id   = pn.id AND
      lp.server_id = :serverid AND
      (lp.pending IS NULL OR lp.pending = 'L')
""")
def setLocks(serverId, actionId, dry_run=0):
    log_debug(3, serverId, actionId, dry_run)

    client_caps = rhnCapability.get_client_capabilities()
    log_debug(3,"Client Capabilities", client_caps)
    multiarch = 0
    if not client_caps or 'packages.setLocks' not in client_caps:
        raise InvalidAction("Client is not capable of locking packages.")

    h = rhnSQL.prepare(_query_action_setLocks)
    h.execute(actionid=actionId,serverid=serverId)
    tmppackages = h.fetchall_dict() or {}

    packages = []

    for package in tmppackages:
        packages.append([package['name'],
                         package['version'],
                         package['release'],
                         package['epoch'] or '',
                         package['arch'] or ''])
    log_debug(4, packages)
    return packages

def refresh_list(serverId, actionId, dry_run=0):
    """ Call the equivalent of up2date -p.

        I.e. update the list of a client's installed packages known by
        Red Hat's DB.
    """
    log_debug(3)
    return None


def runTransaction(server_id, action_id, dry_run=0):
    log_debug(3, server_id, action_id, dry_run)

    # Fetch package_delta_id
    h = rhnSQL.prepare("""
        select package_delta_id
        from rhnActionPackageDelta
        where action_id = :action_id
    """)
    h.execute(action_id=action_id)
    row = h.fetchone_dict()
    if row is None:
        raise InvalidAction("invalid packages.runTransaction action %s for server %s" %
                            (action_id, server_id))

    package_delta_id = row['package_delta_id']

    # Fetch packages
    h = rhnSQL.prepare("""
        select tro.label as operation, pn.name, pe.version, pe.release, pe.epoch,
               pa.label as package_arch
          from rhnPackageDeltaElement pde,
               rhnTransactionPackage rp
     left join rhnPackageArch pa
            on rp.package_arch_id = pa.id,
               rhnTransactionOperation tro, rhnPackageName pn, rhnPackageEVR pe
         where pde.package_delta_id = :package_delta_id
           and pde.transaction_package_id = rp.id
           and rp.operation = tro.id
           and rp.name_id = pn.id
           and rp.evr_id = pe.id
        order by tro.label, pn.name
    """)
    h.execute(package_delta_id=package_delta_id)

    result = []
    while 1:
        row = h.fetchone_dict()
        if not row:
            break

        operation = row['operation']

        # Need to map the operations into codes the client/rpm understands
        if operation == 'insert':
            operation = 'i'
        elif operation == 'delete':
            operation = 'e'
        elif operation == 'upgrade':
            operation = 'u'
        else:
            # Unsupported
            continue

        # Fix null epochs
        epoch = row['epoch']
        if epoch is None:
            epoch = ''

        name, version, release = row['name'], row['version'], row['release']
        # The package arch can be null now because of the outer join
        package_arch = row['package_arch'] or ""

        result.append([
            [name, version, release, epoch, package_arch],
            operation
        ])
    return {'packages': result}

# SQL statements -- used by update()
_packageStatement_update = """
    select distinct
        pn.name as name,
        pe.epoch as epoch,
        pe.version as version,
        pe.release as release,
        pa.label as arch
    from rhnActionPackage ap
left join rhnPackageArch pa
     on ap.package_arch_id = pa.id,
        rhnPackage p,
        rhnPackageName pn,
        rhnPackageEVR pe,
        rhnServerChannel sc,
        rhnChannelPackage cp
    where ap.action_id = :actionid
        and ap.evr_id is not null
        and ap.evr_id = p.evr_id
        and ap.evr_id = pe.id
        and ap.name_id = p.name_id
        and (ap.package_arch_id = p.package_arch_id or ap.package_arch_id is null)
        and ap.name_id = pn.id
        and p.id = cp.package_id
        and cp.channel_id = sc.channel_id
        and sc.server_id = :serverid
    union
    select distinct
        pn.name as name,
        null as version,
        null as release,
        null as epoch,
        pa.label as arch
   from rhnActionPackage ap
left join rhnPackageArch pa
     on ap.package_arch_id = pa.id,
        rhnPackage p,
        rhnPackageName pn,
        rhnServerChannel sc,
        rhnChannelPackage cp
    where ap.action_id = :actionid
        and ap.evr_id is null
        and ap.name_id = p.name_id
        and p.name_id = pn.id
        and (ap.package_arch_id = p.package_arch_id or ap.package_arch_id is null)
        and p.id = cp.package_id
        and cp.channel_id = sc.channel_id
        and sc.server_id = :serverid"""

_packageStatement_remove = """
    select distinct
        pn.name as name,
        pe.epoch as epoch,
        pe.version as version,
        pe.release as release,
        pa.label as arch
    from rhnActionPackage ap
left join rhnPackageArch pa
     on ap.package_arch_id = pa.id,
        rhnPackageName pn,
        rhnPackageEVR pe,
        rhnServerPackage sp
    where ap.action_id = :actionid
        and ap.evr_id is not null
        and ap.evr_id = pe.id
        and ap.name_id = pn.id
        and sp.server_id = :serverid
        and sp.name_id = ap.name_id
        and sp.evr_id = ap.evr_id
        and (sp.package_arch_id = ap.package_arch_id or sp.package_arch_id is null)
    union
    select distinct
        pn.name as name,
        null as version,
        null as release,
        null as epoch,
        pa.label as arch
    from rhnActionPackage ap
left join rhnPackageArch pa
     on ap.package_arch_id = pa.id,
        rhnPackageName pn,
        rhnServerPackage sp
    where ap.action_id = :actionid
        and ap.evr_id is null
        and sp.server_id = :serverid
        and (sp.package_arch_id = ap.package_arch_id or sp.package_arch_id is null)"""
   0707010000012A000081B40000000000000000000000015FBBE8EE0000032F000000000000000000000000000000000000002A00000000spacewalk-backend/server/action/reboot.py #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# reboot functions
#
#

from spacewalk.common.rhnLog import log_debug

# the "exposed" functions
__rhnexport__ = ['reboot']


def reboot(serverId, actionId, dry_run=0):
    log_debug(3)
    return None
 0707010000012B000081B40000000000000000000000015FBBE8EE00000438000000000000000000000000000000000000002E00000000spacewalk-backend/server/action/rhn_applet.py #
# Copyright (c) 2008--2013 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# rhn_applet related scheduled actions
#
# As a response to a queue.get, retrieves/deletes a queued action from
# the DB.
#

from spacewalk.common.rhnLog import log_debug

# the "exposed" functions
__rhnexport__ = ['use_satellite']


# tell the applet to copy up2date's configs,
# and tie the uuid to rhnServer.id
#
# effectively, a noop serverside until the scheduled action
# runs.
def use_satellite(serverId, actionId, dry_run=0):
    log_debug(3)
    return None
0707010000012C000081B40000000000000000000000015FBBE8EE000005A1000000000000000000000000000000000000002900000000spacewalk-backend/server/action/rhnsd.py  #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# reboot functions
#
#

from spacewalk.server import rhnSQL
from spacewalk.common.rhnLog import log_debug
from spacewalk.common.rhnException import rhnException

# the "exposed" functions
__rhnexport__ = ['configure']

_query_lookup_interval = rhnSQL.Statement("""
    select interval, case when restart = 'Y' then 1 else 0 end as restart
      from rhnActionDaemonConfig
     where action_id = :action_id
""")


def configure(serverId, actionId, dry_run=0):
    log_debug(3, dry_run)
    h = rhnSQL.prepare(_query_lookup_interval)
    h.execute(action_id=actionId)
    row = h.fetchone_dict()
    if not row:
        raise rhnException("rhnsd reconfig action scheduled, but no entries "
                           "in rhnActionDaemonConfig found")
    # Format: (interval, restart)
    return (row['interval'], row['restart'])
   0707010000012D000081B40000000000000000000000015FBBE8EE0000056D000000000000000000000000000000000000002C00000000spacewalk-backend/server/action/rollback.py   #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# rollback functions
#
#

from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.server.rhnLib import InvalidAction

# the "exposed" functions
__rhnexport__ = ['config', 'listTransactions', 'rollback']


def config(serverId, actionId, dry_run=0):
    log_debug(3)
    # XXX Not working
    return 1


def listTransactions(serverId, actionId, dry_run=0):
    log_debug(3)
    return None


def rollback(serverId, actionId, dry_run=0):
    log_debug(3, dry_run)
    # since rhnActionTransactions table is gone, this call have to fail
    log_error("Invalid rollback.rollback action %s for server id %s" %
              (actionId, serverId))
    raise InvalidAction(
        "Invalid rollback.rollback action %s for server id %s" %
        (actionId, serverId))
   0707010000012E000081B40000000000000000000000015FBBE8EE0000074B000000000000000000000000000000000000002800000000spacewalk-backend/server/action/scap.py   #
# Copyright (c) 2012--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

from spacewalk.common.rhnLog import log_debug
from spacewalk.server import rhnSQL
from spacewalk.server.rhnLib import InvalidAction

__rhnexport__ = ['xccdf_eval']


def xccdf_eval(server_id, action_id, dry_run=0):
    log_debug(3)
    statement = """
        select path, parameters
        from rhnActionScap
        where action_id = :action_id"""
    h = rhnSQL.prepare(statement)
    h.execute(action_id=action_id)
    d = h.fetchone_dict()
    if not d:
        raise InvalidAction("scap.xccdf_eval: Unknown action id "
                            "%s for server %s" % (action_id, server_id))
    return ({
        'path': d['path'],
        'id': action_id,
        'file_size': _scap_file_limit(server_id),
        'params': rhnSQL._fix_encoding(rhnSQL.read_lob(d['parameters']) or '')
    },)


def _scap_file_limit(server_id):
    statement = """
        select roc.scap_file_sizelimit as limit, roc.scapfile_upload_enabled as enabled
        from rhnOrgConfiguration roc,
             rhnServer rs
        where rs.id = :server_id
          and rs.org_id = roc.org_id"""
    h = rhnSQL.prepare(statement)
    h.execute(server_id=server_id)
    d = h.fetchone_dict()
    if not d or d['enabled'] != 'Y':
        return 0
    return d['limit']
 0707010000012F000081B40000000000000000000000015FBBE8EE00000627000000000000000000000000000000000000002A00000000spacewalk-backend/server/action/script.py #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# remote script functions
#

from spacewalk.common.rhnLog import log_debug
from spacewalk.server import rhnSQL

# the "exposed" functions
__rhnexport__ = ['run']

_query_action_script = rhnSQL.Statement("""
    select script, username, groupname, timeout,
           TO_CHAR(current_timestamp, 'YYYY-MM-DD HH24:MI:SS') as now
      from rhnActionScript
     where action_id = :action_id
""")


def run(server_id, action_id, dry_run=0):
    log_debug(3, dry_run)

    data = {}

    h = rhnSQL.prepare(_query_action_script)
    h.execute(action_id=action_id)

    info = h.fetchone_dict() or []

    if info:
        data['username'] = info['username']
        data['groupname'] = info['groupname']
        data['timeout'] = info['timeout'] or ''
        data['script'] = rhnSQL._fix_encoding(rhnSQL.read_lob(info['script']) or '')
        # used to make the resulting times make some sense in the db
        data['now'] = info['now']

    return action_id, data
 07070100000130000081B40000000000000000000000015FBBE8EE00002D57000000000000000000000000000000000000002900000000spacewalk-backend/server/action/utils.py  #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
from spacewalk.server import rhnSQL, rhnAction
from spacewalk.server.rhnDependency import find_package_with_arch
from spacewalk.server.rhnChannel import channels_for_server


class PackageNotFound(Exception):
    pass


class NoActionInfo(Exception):
    pass


class SubscribedChannel:

    """
        SubscribedChannel represents a channel to which the server is subscribed.
    """

    def __init__(self, server_id, channel_lookup_string):
        """
            Constructor.

            server_id is a string containing the unique number that the
            database has assigned to the server.

            channel_lookup_string is a string that the _get_channel_info function
            uses to look up the correct channel by channel label. It does NOT have
            to be the entire channel label, but it does have to occur at the beginning
            of the channel label. For instance "rhn-tools" would match any of the
            rhn-tools channels because they all begin with "rhn-tools". It can also be
            the entire channel label, of course.
        """
        self.server_id = server_id
        self.found_channel = None
        self.channel_id = None
        self.channel_lookup_string = channel_lookup_string
        self.channel_label = None

    def _get_channel_info(self):
        """
            Looks up the correct channel based on channel_lookup_string.
            Populates the id, label, and a boolean that tells whether the
            channel is found.
        """
        subscribed_channels = channels_for_server(self.server_id)

        # Our tools channels all start with "rhn-tools", which seems
        # to be the only way to reliably tell one channel from the other
        # automagically.
        self.found_tools_channel = False
        for channel_info in subscribed_channels:
            label_position = channel_info['label'].find(self.channel_lookup_string)
            if label_position > -1 and label_position == 0:
                self.found_channel = True
                self.channel_id = channel_info['id']
                self.channel_label = channel_info['label']

    def is_subscribed_to_channel(self):
        """
            Returns True if server_id is subscribed to the
            channel, False otherwise
        """
        if not self.found_channel:
            self._get_channel_info()
        return self.found_channel

    def get_channel_id(self):
        """
            Returns the channel's unique id.
        """
        if not self.channel_id:
            self._get_channel_info()
        return self.channel_id

    def get_channel_label(self):
        """
            Returns the channel's label.
        """
        if not self.channel_label:
            self._get_channel_info()
        return self.channel_label


class ChannelPackage:

    """
        Represents a package contained in a channel that the server is
        subscribed to.
    """

    def __init__(self, server_id, package_name):
        """
            Constructor.

            server_id is the unique value assigned to the server by the db.
            package_name is a string containing the name of the package
                to be looked up.
        """
        self.server_id = server_id
        self.package_name = package_name

        self.package_info = None
        self.id = None
        self.version = None
        self.release = None
        self.epoch = None
        self.arch = None

        self.name_id = None
        self.evr_id = None
        self.arch_id = None

        self.id_index = 0
        self.name_index = 1
        self.version_index = 2
        self.release_index = 3
        self.epoch_index = 4
        self.arch_index = 5

    def _get_package_info(self):
        """
            "Private" function that retrieves info about the package.
            Populates self.package_info, self.id, self.version, self.release, and self.epoch.
        """
        # Get info on the package we want to install.
        possible_packages = find_package_with_arch(self.server_id, [self.package_name])

        # There's a possibility, however slight, that more than one package
        # may be returned by find_by_packages. If that's the case, we only
        # want the info about package_name.
        package_info = None
        if self.package_name in possible_packages:
            for package in possible_packages[self.package_name]:
                if package[self.name_index] == self.package_name:
                    self.package_info = package
                    self.id = package[self.id_index]
                    self.version = package[self.version_index]
                    self.release = package[self.release_index]
                    self.epoch = package[self.epoch_index]
                    self.arch = package[self.arch_index]

    def _get_package_field_ids(self):
        """
            "Private" function that retrieves the database id's for the name, EVR, and
            package architecture and sets self.name_id, self.evr_id, and self.arch_id to
            their values.
        """
        package_id = self.get_id()

        if not package_id:
            raise PackageNotFound("ID for package %s was not found." % self.get_name())

        _package_info_query = rhnSQL.Statement("""
            select
                    p.name_id name_id,
                    p.evr_id evr_id,
                    p.package_arch_id arch_id
            from
                    rhnPackage p
            where
                    p.id = :package_id
        """)
        prepared_query = rhnSQL.prepare(_package_info_query)
        prepared_query.execute(package_id=package_id)
        package_info_results = prepared_query.fetchone_dict()

        if not package_info_results:
            raise PackageNotFound("Name, EVR, and Arch info not found for %s" % self.get_name())

        self.name_id = package_info_results['name_id']
        self.evr_id = package_info_results['evr_id']
        self.arch_id = package_info_results['arch_id']

    def exists(self):
        """
            Returns True if the package is available for the server according to the db,
            False otherwise.
        """
        if not self.package_info:
            self._get_package_info()

        if not self.package_info:
            return False
        else:
            return True

    def get_name_id(self):
        """
            Returns the name_id of the package.
        """
        if not self.name_id:
            self._get_package_field_ids()
        return self.name_id

    def get_evr_id(self):
        """
            Returns the evr_id of the package.
        """
        if not self.evr_id:
            self._get_package_field_ids()
        return self.evr_id

    def get_arch_id(self):
        """
            Returns the arch_id of the package.
        """
        if not self.arch_id:
            self._get_package_field_ids()
        return self.arch_id

    def get_id(self):
        """
            Returns the id of the package.
        """
        if not self.id:
            self._get_package_field_ids()
        return self.id

    def get_name(self):
        """
            Returns the name of the package.
        """
        return self.package_name

    def get_version(self):
        """
            Returns the version of the package.
        """
        if not self.version:
            self._get_package_info()
        return self.version

    def get_release(self):
        """
            Returns the release of the package.
        """
        if not self.release:
            self._get_package_info()
        return self.release

    def get_epoch(self):
        """
            Returns the epoch of the package.
        """
        if not self.epoch:
            self._get_package_info()
        return self.epoch

    def get_arch(self):
        """
            Returns the arch of the package.
        """
        if not self.arch:
            self._get_package_info()
        return self.arch


class PackageInstallScheduler:

    """
        Class responsible for scheduling package installs. Can
        only be used inside actions during a kickstart.
    """

    def __init__(self, server_id, this_action_id, package):
        """
            Constructor.

            server_id is the unique number assigned to the server by the database.
            this_action_id is the unique number assigned to the current action.
            package is an instance of ChannelPackage.
        """
        self.server_id = server_id
        self.package = package
        self.this_action_id = this_action_id
        self.new_action_id = None

    def _get_action_info(self, action_id):
        """
            Private function that returns the org_id and scheduler for action_id.
        """
        h = rhnSQL.prepare("""
            select  org_id, scheduler
            from    rhnAction
            where   id = :id
        """)
        h.execute(id=action_id)
        row = h.fetchone_dict()
        if not row:
            raise NoActionInfo("Couldn't find org_id or scheduler for action %s." % str(action_id))
        return (row['org_id'], row['scheduler'])

    def schedule_package_install(self):
        """
            Public function that schedules self.package for installation during the next rhn_check.
        """
        org_id, scheduler = self._get_action_info(self.this_action_id)

        self.new_action_id = rhnAction.schedule_server_action(
            self.server_id,
            action_type="packages.update",
            action_name="Scheduling install of virtualization host packages.",
            delta_time=0,
            scheduler=scheduler,
            org_id=org_id
        )

        self._add_package_to_install_action(self.new_action_id)

    def _add_package_to_install_action(self, action_id):
        """
            Private function that adds self.package to the rhnActionPackage table.
        """
        name_id = self.package.get_name_id()
        package_arch_id = self.package.get_arch_id()
        evr_id = self.package.get_evr_id()

        insert_package_query = rhnSQL.Statement("""
            insert into rhnActionPackage(id,
                                         action_id,
                                         parameter,
                                         name_id,
                                         evr_id,
                                         package_arch_id)
            values (sequence_nextval('rhn_act_p_id_seq'),
                    :action_id,
                    'install',
                    :name_id,
                    :evr_id,
                    :package_arch_id)
        """)
        prepared_query = rhnSQL.prepare(insert_package_query)
        prepared_query.execute(action_id=str(action_id),
                               name_id=str(name_id),
                               evr_id=str(evr_id),
                               package_arch_id=str(package_arch_id))
 07070100000131000081B40000000000000000000000015FBBE8EE00001F16000000000000000000000000000000000000002800000000spacewalk-backend/server/action/virt.py   #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import sys
from spacewalk.common.rhnLog import log_debug
from spacewalk.server import rhnSQL
from spacewalk.server.rhnLib import InvalidAction
from uyuni.common.usix import raise_with_tb

__rhnexport__ = ['refresh',
                 'shutdown',
                 'reboot',
                 'resume',
                 'start',
                 'schedulePoller',
                 'suspend',
                 'destroy',
                 'setMemory',
                 'setVCPUs'
                 ]

###########################################################################
# SQL Queries for each virtualization action type.
###########################################################################
_query_refresh = rhnSQL.Statement("""
    select  avf.action_id,
    from    rhnActionVirtRefresh
    where   avf.action_id = :action_id
""")

_query_shutdown = rhnSQL.Statement("""
    select  avs.action_id,
            avs.uuid
    from    rhnActionVirtShutdown avs
    where   avs.action_id = :action_id
""")

_query_suspend = rhnSQL.Statement("""
    select  avs.action_id,
            avs.uuid
    from    rhnActionVirtSuspend avs
    where   avs.action_id = :action_id
""")

_query_resume = rhnSQL.Statement("""
    select  avr.action_id,
            avr.uuid
    from    rhnActionVirtResume avr
    where   avr.action_id = :action_id
""")

_query_reboot = rhnSQL.Statement("""
    select  avr.action_id,
            avr.uuid
    from    rhnActionVirtReboot avr
    where   avr.action_id = :action_id

""")

_query_destroy = rhnSQL.Statement("""
    select  avd.action_id,
            avd.uuid
    from    rhnActionVirtDestroy avd
    where   avd.action_id = :action_id
""")

_query_start = rhnSQL.Statement("""
    select  avs.action_id,
            avs.uuid
    from    rhnActionVirtStart avs
    where   avs.action_id = :action_id
""")

_query_setMemory = rhnSQL.Statement("""
    select  asm.action_id,
            asm.uuid,
            asm.memory
    from    rhnActionVirtSetMemory asm
    where   asm.action_id = :action_id
""")

_query_getVCPUs = rhnSQL.Statement("""
    select  av.action_id,
            av.uuid,
            av.vcpu
    from    rhnActionVirtVCPU av
    where   av.action_id = :action_id
""")

_query_schedulePoller = rhnSQL.Statement("""
    select  asp.action_id,
            asp.minute,
            asp.hour,
            asp.dom,
            asp.month,
            asp.dow
    from    rhnActionVirtSchedulePoller asp
    where   asp.action_id = :action_id
""")

##########################################################################
# Functions that return the correct parameters that the actions are
# called with. They all take in the server_id and action_id as params.
##########################################################################


class NoUUIDException(Exception):

    def __init__(self):
        Exception.__init__(self)


class NoRowFoundException(Exception):

    def __init__(self):
        Exception.__init__(self)


def _get_uuid(query_str, action_id):
    log_debug(3)

    prepared_query = rhnSQL.prepare(query_str)
    prepared_query.execute(action_id=action_id)
    row = prepared_query.fetchone_dict()

    if not row:
        raise NoRowFoundException()

    if 'uuid' not in row:
        raise NoUUIDException()

    uuid = row['uuid']
    return uuid

# Returns an empty tuple, since the virt.refresh action has no params.


def refresh(server_id, action_id, dry_run=0):
    log_debug(3, dry_run)

    prepared_query = rhnSQL.prepare(_query_refresh)
    prepared_query.execute(action_id=action_id)
    row = prepared_query.fetchone_dict()

    if not row:
        raise NoRowFoundException()

    # Sanity check. If this doesn't pass then something is definitely screwed up.
    if not row['action_id']:
        raise InvalidAction("Refresh action is missing an action_id.")

    return ()

# Returns a uuid


def action(action_name, query, server_id, action_id, dry_run=0):
    log_debug(3, action_name, dry_run)
    try:
        uuid = _get_uuid(query, action_id)
    except NoRowFoundException:
        raise_with_tb(InvalidAction("No %s actions found." % action_name.lower()), sys.exc_info()[2])
    except NoUUIDException:
        raise_with_tb(InvalidAction("%s action %s has no uuid associated with it." %
                            (action_name, str(action_id))), sys.exc_info()[2])
    return (uuid,)


def start(server_id, action_id, dry_run=0):
    return action("Start", _query_start, server_id, action_id, dry_run=0)


def shutdown(server_id, action_id, dry_run=0):
    return action("Shutdown", _query_shutdown, server_id, action_id, dry_run=0)


def suspend(server_id, action_id, dry_run=0):
    return action("Suspend", _query_suspend, server_id, action_id, dry_run=0)


def resume(server_id, action_id, dry_run=0):
    return action("Resume", _query_resume, server_id, action_id, dry_run=0)


def reboot(server_id, action_id, dry_run=0):
    return action("Reboot", _query_reboot, server_id, action_id, dry_run=0)


def destroy(server_id, action_id, dry_run=0):
    return action("Destroy", _query_destroy, server_id, action_id, dry_run=0)

# Returns a uuid and the amount of memory to allocate to the domain.


def setMemory(server_id, action_id, dry_run=0):
    log_debug(3, dry_run)

    prepared_query = rhnSQL.prepare(_query_setMemory)
    prepared_query.execute(action_id=action_id)
    row = prepared_query.fetchone_dict()

    if not row:
        raise InvalidAction("No setMemory actions found.")

    if 'uuid' not in row:
        raise InvalidAction("Set Memory action %s has no uuid." % str(action_id))

    if 'memory' not in row:
        raise InvalidAction("setMemory action %s has no memory set." % str(action_id))

    uuid = row['uuid']
    memory = row['memory']

    return (uuid, memory)

# Returns a uuid and the amount of VCPUs to allocate to the domain.


def setVCPUs(server_id, action_id, dry_run=0):
    log_debug(3, dry_run)

    prepared_query = rhnSQL.prepare(_query_getVCPUs)
    prepared_query.execute(action_id=action_id)
    row = prepared_query.fetchone_dict()

    if not row:
        raise InvalidAction("No VCPU actions found.")

    return row['uuid'], row['vcpu']


# Returns the minute, hour, dom, month, and dow to call schedulePoller with.
def schedulePoller(server_id, action_id, dry_run=0):
    log_debug(3, dry_run)

    prepared_query = rhnSQL.prepare(_query_schedulePoller)
    prepared_query.execute(action_id=action_id)
    row = prepared_query.fetchone_dict()

    if not row:
        raise InvalidAction("No schedulePoller actions found.")

    if 'minute' not in row:
        raise InvalidAction("schedulePoller action %s has no minute associated with it." % str(action_id))

    if 'hour' not in row:
        raise InvalidAction("schedulePoller action %s has no hour associated with it." % str(action_id))

    if 'dom' not in row:
        raise InvalidAction("schedulePoller action %s has no day of the month associated with it." % str(action_id))

    if 'month' not in row:
        raise InvalidAction("schedulePoller action %s has no month associated with it." % str(action_id))

    if 'dow' not in row:
        raise InvalidAction("schedulePoller action %s has no day of the week associated with it." % str(action_id))

    return (row['minute'], row['hour'], row['dom'], row['month'], row['dow'])
  07070100000132000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002B00000000spacewalk-backend/server/action_extra_data    07070100000133000081B40000000000000000000000015FBBE8EE0000015A000000000000000000000000000000000000003400000000spacewalk-backend/server/action_extra_data/Makefile   # Makefile for the action handlers module
#

TOP	= ../..
SUBDIR	= server/action_extra_data

SPACEWALK_FILES	= __init__ configfiles kickstart kickstart_guest packages errata hardware reboot \
          rollback up2date_config script rhnsd rhn_applet virt kickstart_host scap image \
          distupgrade clientcert

include $(TOP)/Makefile.defs

  07070100000134000081B40000000000000000000000015FBBE8EE00000263000000000000000000000000000000000000003700000000spacewalk-backend/server/action_extra_data/__init__.py    #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
 07070100000135000081B40000000000000000000000015FBBE8EE0000031A000000000000000000000000000000000000003900000000spacewalk-backend/server/action_extra_data/clientcert.py  #
# Copyright (c) 2014--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.

from spacewalk.common.rhnLog import log_debug

__rhnexport__ = ['update_client_cert']


def update_client_cert(server_id, action_id, data={}):
    log_debug(3, action_id)
    return
  07070100000136000081B40000000000000000000000015FBBE8EE000028AC000000000000000000000000000000000000003A00000000spacewalk-backend/server/action_extra_data/configfiles.py #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# config file-related error handling functions
#

from spacewalk.common import rhnFlags
from spacewalk.common.rhnLog import log_debug, log_error
from uyuni.common.stringutils import to_string
from spacewalk.server import rhnSQL
from spacewalk.server.rhnServer import server_kickstart

# the "exposed" functions
__rhnexport__ = ['upload', 'deploy', 'verify', 'diff', 'mtime_upload']

_query_reset_upload_files = rhnSQL.Statement("""
    update rhnActionConfigFileName
       set failure_id = NULL
     where server_id = :server_id
       and action_id = :action_id
""")
_query_mark_upload_files = rhnSQL.Statement("""
    update rhnActionConfigFileName
       set failure_id = :failure_id
     where server_id = :server_id
       and action_id = :action_id
       and config_file_name_id = lookup_config_filename(:path)
""")


def upload(server_id, action_id, data={}):
    log_debug(3)

    # First, unmark any file as being failed
    h = rhnSQL.prepare(_query_reset_upload_files)
    h.execute(server_id=server_id, action_id=action_id)

    if not data:
        log_debug(4, "No data sent by client")
        return

    log_debug(6, 'data', data)

    failure_table = rhnSQL.Table('rhnConfigFileFailure', 'label')
    h = rhnSQL.prepare(_query_mark_upload_files)
    # We don't do executemany here, since we want to know if each update has
    # actually touched a row

    reason_map = {'missing_files': 'missing',
                  'files_too_large': 'too_big',
                  'quota_failed': 'insufficient_quota',
                  }

    for reason in list(reason_map.keys()):
        log_debug(6, 'reason', reason)
        failed_files = data.get(reason)
        log_debug(6, 'failed_files', failed_files)
        if not failed_files:
            continue

        failure_id = failure_table[reason_map[reason]]['id']
        log_debug(6, 'failure_id', failure_id)

        for path in failed_files:
            log_debug(6, 'path', path)
            ret = h.execute(server_id=server_id, action_id=action_id,
                            failure_id=failure_id, path=path)
            if not ret:
                log_error("Could not find file %s for server %s, action %s" %
                          (path, server_id, action_id))


_query_any_action_config_filenames = rhnSQL.Statement("""
    select config_file_name_id
      from rhnActionConfigFileName
     where server_id = :server_id
       and action_id = :action_id
""")
_query_clear_action_config_filenames = rhnSQL.Statement("""
    delete from rhnActionConfigFileName
     where server_id = :server_id
       and action_id = :action_id
""")
_query_create_action_config_filename = rhnSQL.Statement("""
    insert into rhnActionConfigFileName (action_id, config_file_name_id, server_id)
    values (:action_id, lookup_config_filename(:path), :server_id)
""")


def mtime_upload(server_id, action_id, data={}):
    # at this point in time, no rhnActionConfigFileName entries exist, because
    # we didn't know them at schedule time...  go ahead and create them now, and then
    # just use the main upload to handle the updating of the state...
    paths = data.get('attempted_paths') or []

    if not paths:
        log_debug(6, "no matched files")
        return

    log_debug(6, 'attempted paths', paths)

    # if there are already rhnActionConfigFileName entries for this sid+aid,
    # it's most likely a rescheduled action, and we'll need to blow away the old
    # entries (they might not be valid any longer)
    h = rhnSQL.prepare(_query_any_action_config_filenames)
    h.execute(server_id=server_id, action_id=action_id)
    already_filenames = h.fetchone_dict() or []

    if already_filenames:
        h = rhnSQL.prepare(_query_clear_action_config_filenames)
        h.execute(server_id=server_id, action_id=action_id)

    num_paths = len(paths)

    h = rhnSQL.prepare(_query_create_action_config_filename)
    h.executemany(**{
        'action_id': [action_id] * num_paths,
        'server_id': [server_id] * num_paths,
        'path': paths,
    })

    upload(server_id, action_id, data)


def deploy(server_id, action_id, data={}):
    log_debug(3)

    action_status = rhnFlags.get('action_status')
    server_kickstart.update_kickstart_session(server_id,
                                              action_id, action_status, kickstart_state='complete',
                                              next_action_type=None)
    return


def diff(server_id, action_id, data={}):
    log_debug(3)
    if not data:
        # Nothing to do here
        return
    status = rhnFlags.get('action_status')
    if status == 2:
        # Completed
        _reset_diff_errors(server_id, action_id)
        missing_files = data.get('missing_files') or []
        _mark_missing_diff_files(server_id, action_id, missing_files)
        diffs = data.get('diffs') or {}
        _process_diffs(server_id, action_id, diffs)

verify = diff

_query_reset_diff_errors = rhnSQL.Statement("""
    update rhnActionConfigRevision
       set failure_id = NULL
     where server_id = :server_id
       and action_id = :action_id
""")


def _reset_diff_errors(server_id, action_id):
    h = rhnSQL.prepare(_query_reset_diff_errors)
    h.execute(server_id=server_id, action_id=action_id)

_query_lookup_diff_files = rhnSQL.Statement("""
    select acr.id, cfn.path
      from rhnConfigFileName cfn,
           rhnConfigFile cf,
           rhnConfigRevision cr,
           rhnActionConfigRevision acr
     where acr.server_id = :server_id
       and acr.action_id = :action_id
       and acr.config_revision_id = cr.id
       and cr.config_file_id = cf.id
       and cf.config_file_name_id = cfn.id
""")
_query_mark_failed_diff_files = rhnSQL.Statement("""
    update rhnActionConfigRevision
       set failure_id = :failure_id
     where id = :action_config_revision_id
""")


def _mark_missing_diff_files(server_id, action_id, missing_files):
    if not missing_files:
        # Nothing to do
        log_debug(4, "No missing files reported by client")
        return
    # First, fetch all of the files scheduled
    h = rhnSQL.prepare(_query_lookup_diff_files)
    h.execute(server_id=server_id, action_id=action_id)
    hash = {}
    while 1:
        row = h.fetchone_dict()
        if not row:
            break
        action_config_revision_id, path = row['id'], row['path']
        if path in hash:
            # This shouldn't really happen
            log_error("Duplicate path for diff "
                      "(scheduler did not resolve config files? %s, %s" %
                      (hash[path], action_config_revision_id))
        else:
            hash[path] = action_config_revision_id

    ids = []
    for path in missing_files:
        if path not in hash:
            log_error("Client reports missing a file "
                      "that was not scheduled for diff? %s" % path)
            continue
        ids.append(hash[path])
    if not ids:
        log_debug(4, "No missing files found")
        return
    failure_table = rhnSQL.Table('rhnConfigFileFailure', 'label')
    failure_id = failure_table['missing']['id']
    failure_ids = [failure_id] * len(ids)

    h = rhnSQL.prepare(_query_mark_failed_diff_files)
    h.executemany(**{
        'action_config_revision_id': ids,
        'failure_id': failure_ids,
    })


def _process_diffs(server_id, action_id, diffs):
    _disable_old_diffs(server_id)
    for file_path, diff in list(diffs.items()):
        action_config_revision_id = _lookup_action_revision_id(server_id,
                                                               action_id, file_path)
        if action_config_revision_id is None:
            log_error(
                "Missing config file for action id %s, server id %s, path %s"
                % (server_id, action_id, file_path))
            continue
        _add_result(action_config_revision_id, diff)

_query_lookup_action_revision_id = rhnSQL.Statement("""
    select acr.id
      from rhnConfigRevision cr, rhnConfigFile cf, rhnActionConfigRevision acr
     where acr.action_id = :action_id
       and acr.server_id = :server_id
       and acr.config_revision_id = cr.id
       and cr.config_file_id = cf.id
       and cf.config_file_name_id = lookup_config_filename(:path)
""")


def _lookup_action_revision_id(server_id, action_id, path):
    h = rhnSQL.prepare(_query_lookup_action_revision_id)
    h.execute(server_id=server_id, action_id=action_id, path=path)
    row = h.fetchone_dict()
    if not row:
        return None
    return row['id']

_query_add_result_diff = rhnSQL.Statement("""
    insert into rhnActionConfigRevisionResult
           (action_config_revision_id, result)
    values (:action_config_revision_id, :result)
""")


def _add_result(action_config_revision_id, diff):

    log_debug(4, action_config_revision_id, diff)

    if diff:
        blob_map = {'result': 'result'}
        diff = to_string(diff)
    else:
        blob_map = None
        diff = None

    h = rhnSQL.prepare(_query_add_result_diff, blob_map=blob_map)
    h.execute(action_config_revision_id=action_config_revision_id,
              result=diff)

_query_lookup_old_diffs = rhnSQL.Statement("""
    select acr.id
      from rhnActionConfigRevision acr
     where acr.server_id = :server_id
""")

_query_delete_old_diffs = rhnSQL.Statement("""
    delete from rhnActionConfigRevisionResult
     where action_config_revision_id = :action_config_revision_id
""")


def _disable_old_diffs(server_id):
    h = rhnSQL.prepare(_query_lookup_old_diffs)
    h.execute(server_id=server_id)
    old_acr_ids = [x['id'] for x in h.fetchall_dict() or []]
    if not old_acr_ids:
        # Nothing to do here
        return

    h = rhnSQL.prepare(_query_delete_old_diffs)
    h.executemany(**{'action_config_revision_id': old_acr_ids})
07070100000137000081B40000000000000000000000015FBBE8EE00000869000000000000000000000000000000000000003A00000000spacewalk-backend/server/action_extra_data/distupgrade.py #
# Copyright (c) 2012 SUSE LLC
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
#

import sys
from spacewalk.common import rhnFlags
from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.server import rhnSQL
from spacewalk.server.rhnChannel import subscribe_channels, unsubscribe_channels

__rhnexport__ = ['upgrade']

_query_dup_data = rhnSQL.Statement("""
    SELECT id, dry_run
      FROM rhnActionDup
     WHERE action_id = :action_id
""")

_query_channel_changes = rhnSQL.Statement("""
    SELECT c.id, c.label, c.parent_channel, adc.task
      FROM rhnActionDupChannel adc
      JOIN rhnChannel c ON adc.channel_id = c.id
     WHERE adc.action_dup_id = :action_dup_id
""")

def upgrade(serverId, actionId, data={}):
    log_debug(3)

    h = rhnSQL.prepare(_query_dup_data)
    h.execute(action_id=actionId)
    row = h.fetchone_dict() or None
    if not row:
        log_error("Unable to find action data")
        return

    if row['dry_run'] == 'Y':
        _restore_channels(serverId, row['id'])


def _restore_channels(serverId, action_dup_id):
    log_debug(3)
    h = rhnSQL.prepare(_query_channel_changes)
    h.execute(action_dup_id=action_dup_id)
    channel_changes = h.fetchall_dict() or None

    if not channel_changes:
        # something goes wrong
        log_error("nothing to rollback for channels")
        return

    # we need to rollback the changes from action
    # therefore unsubscribe task 'S' and
    # subscribe task 'U'
    to_unsubscribe = [x for x in channel_changes if x['task'] == 'S']
    to_subscribe = [x for x in channel_changes if x['task'] == 'U']

    try:
        unsubscribe_channels(serverId, to_unsubscribe)
        subscribe_channels(serverId, to_subscribe)
    except Exception as e:
        log_error(str(e), sys.exc_info()[2])

    return
   07070100000138000081B40000000000000000000000015FBBE8EE000003CA000000000000000000000000000000000000003500000000spacewalk-backend/server/action_extra_data/errata.py  #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# errata-related error handling functions
#

from spacewalk.common.rhnLog import log_debug

# the "exposed" functions
__rhnexport__ = ['update']


def update(server_id, action_id, data={}):
    if not data:
        return
    log_debug(2, "action_error.errata.update: Should do something "
              "useful with this data", server_id, action_id, data)
  07070100000139000081B40000000000000000000000015FBBE8EE000003B2000000000000000000000000000000000000003700000000spacewalk-backend/server/action_extra_data/hardware.py    #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

from spacewalk.common.rhnLog import log_debug

# the "exposed" functions
__rhnexport__ = ['refresh_list']


def refresh_list(server_id, action_id, data={}):
    if not data:
        return
    log_debug(2, "action_error.hardware.refresh_list: Should do something "
              "useful with this data", server_id, action_id, data)
  0707010000013A000081B40000000000000000000000015FBBE8EE000003C6000000000000000000000000000000000000003400000000spacewalk-backend/server/action_extra_data/image.py   #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# errata-related error handling functions
#

from spacewalk.common.rhnLog import log_debug

# the "exposed" functions
__rhnexport__ = ['deploy']


def deploy(server_id, action_id, data={}):
    if not data:
        return
    log_debug("action_error.image.deploy: Should do something "
              "useful with this data", server_id, action_id, data)
  0707010000013B000081B40000000000000000000000015FBBE8EE00000546000000000000000000000000000000000000003800000000spacewalk-backend/server/action_extra_data/kickstart.py   #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# Kickstart-related error handling functions
#

from spacewalk.common import rhnFlags
from spacewalk.common.rhnLog import log_debug
from spacewalk.server.rhnServer import server_kickstart

# the "exposed" functions
__rhnexport__ = ['initiate', 'schedule_sync']


def initiate(server_id, action_id, data={}):
    log_debug(3, action_id)

    action_status = rhnFlags.get('action_status')
    server_kickstart.update_kickstart_session(server_id, action_id,
                                              action_status, kickstart_state='injected',
                                              next_action_type='reboot.reboot')

# This one will never be called


def schedule_sync(server_id, action_id, data={}):
    log_debug(3, action_id)
  0707010000013C000081B40000000000000000000000015FBBE8EE00000795000000000000000000000000000000000000003E00000000spacewalk-backend/server/action_extra_data/kickstart_guest.py #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
from spacewalk.common import rhnFlags
from spacewalk.common.rhnLog import log_debug
from spacewalk.server.rhnServer import server_kickstart

__rhnexport__ = ['initiate', 'add_tools_channel', 'schedule_virt_guest_pkg_install']


def _action(action_name, server_id, action_id, success_state, success_type):
    log_debug(3, action_name, server_id, action_id)

    action_status = rhnFlags.get('action_status')

    if action_status == 3:
        ks_state = 'failed'
        next_action_type = None
    else:
        ks_state = success_state
        next_action_type = success_type

    server_kickstart.update_kickstart_session(server_id, action_id,
                                              action_status, kickstart_state=ks_state,
                                              next_action_type=next_action_type)


def schedule_virt_guest_pkg_install(server_id, action_id, data={}):
    _action('schedule_virt_guest_pkg_install', server_id, action_id,
            'complete', None)


def add_tools_channel(server_id, action_id, data={}):
    _action('add_tools_channel', server_id, action_id,
            'complete', 'kickstart_guest.schedule_virt_guest_pkg_install')


def initiate(server_id, action_id, data={}):
    _action('initiate', server_id, action_id,
            'in_progress', 'kickstart_guest.add_tools_channel')
   0707010000013D000081B40000000000000000000000015FBBE8EE00000391000000000000000000000000000000000000003D00000000spacewalk-backend/server/action_extra_data/kickstart_host.py  #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
from spacewalk.common.rhnLog import log_debug

__rhnexport__ = ['schedule_virt_host_pkg_install', 'add_tools_channel']


def schedule_virt_host_pkg_install(server_id, action_id, data={}):
    log_debug(3, action_id)


def add_tools_channel(server_id, action_id, data={}):
    log_debug(3, action_id)
   0707010000013E000081B40000000000000000000000015FBBE8EE00004591000000000000000000000000000000000000003700000000spacewalk-backend/server/action_extra_data/packages.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

import sys
import re
import sys

from uyuni.common.usix import ListType, IntType

from spacewalk.common import rhnFlags
from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.common.rhnException import rhnException
from spacewalk.server import rhnSQL
from spacewalk.server.rhnServer import server_kickstart

# the "exposed" functions
__rhnexport__ = ['remove',
                 'update',
                 'refresh_list',
                 'delta',
                 'runTransaction',
                 'verify',
                 'setLocks']


class InvalidDep(Exception):
    pass

_query_insert_attribute_verify_results = rhnSQL.Statement("""
insert into rhnServerActionVerifyResult (
    server_id, action_id,
    package_name_id,
    package_evr_id,
    package_arch_id,
    package_capability_id,
    attribute, size_differs, mode_differs, checksum_differs,
    devnum_differs, readlink_differs, uid_differs,
    gid_differs, mtime_differs
)
values (
      :server_id, :action_id,
      lookup_package_name(:package_name),
      lookup_evr(:epoch || '', :version, :release),
      lookup_package_arch(:arch),
      lookup_package_capability(:filename),
      :attrib, :test_S, :test_M, :test_5,
      :test_D, :test_L, :test_U,
      :test_G, :test_T
)
""")

_query_insert_missing_verify_results = rhnSQL.Statement("""
insert into rhnServerActionVerifyMissing (
    server_id,
    action_id,
    package_name_id,
    package_evr_id,
    package_arch_id,
    package_capability_id
)
values (
    :server_id,
    :action_id,
    lookup_package_name(:package_name),
    lookup_evr(:epoch || '', :version, :release),
    lookup_package_arch(:arch),
    lookup_package_capability(:filename)
)
""")

_query_delete_verify_results = rhnSQL.Statement("""
    delete from rhnServerActionVerifyResult
     where server_id = :server_id
       and action_id = :action_id
""")

_query_delete_verify_missing = rhnSQL.Statement("""
    delete from rhnServerActionVerifyMissing
     where server_id = :server_id
       and action_id = :action_id
""")


def verify(server_id, action_id, data={}):
    log_debug(3, action_id)

    if (not data) or ('verify_info' not in data):
        # some data should have been passed back...
        log_error("Insufficient package verify information returned",
                  server_id, action_id, data)
        return

    log_debug(4, "pkg verify data", data)

    # Remove old results
    h = rhnSQL.prepare(_query_delete_verify_results)
    h.execute(server_id=server_id, action_id=action_id)

    h = rhnSQL.prepare(_query_delete_verify_missing)
    h.execute(server_id=server_id, action_id=action_id)

    attrib_tests = ['S', 'M', '5', 'D', 'L', 'U', 'G', 'T']

    # Store the values for executemany() for the attribute-failures
    verify_attribs = {'server_id': [], 'action_id': [], 'package_name': [],
                      'epoch': [], 'version': [], 'release': [], 'arch': [],
                      'filename': [], 'attrib': [], }
    for test in attrib_tests:
        verify_attribs["test_" + test] = []

    # Store the "missing xxxx" results for executemany()
    missing_files = {'server_id': [], 'action_id': [], 'package_name': [],
                     'epoch': [], 'version': [], 'release': [], 'arch': [],
                     'filename': []}

    # Uniquify the packages
    uq_packages = {}

    for package_spec, responses in data['verify_info']:
        package_spec = list(package_spec)
        # Fix the epoch
        if package_spec[3] == '':
            package_spec[3] = None
        package_spec = tuple(package_spec)
        if package_spec in uq_packages:
            # Been here already
            continue

        # We need to uniquify the file names within a package too
        hash = {}
        for response in responses:
            try:
                dict = _parse_response_line(response, attrib_tests)
            except InvalidResponseLine:
                log_error("packages.verify: (%s, %s): invalid line %s"
                          % (server_id, action_id, response))
                continue

            hash[dict['filename']] = dict

        # Add the rest of the variables to the dictionaries
        for filename, dict in list(hash.items()):
            dict['server_id'] = server_id
            dict['action_id'] = action_id

            dict['package_name'] = package_spec[0]
            dict['version'] = package_spec[1]
            dict['release'] = package_spec[2]
            dict['epoch'] = package_spec[3]
            dict['arch'] = package_spec[4]

            if 'missing' not in dict:
                _hash_append(verify_attribs, dict)
            else:
                _hash_append(missing_files, dict)

        # This package was visited, store it
        uq_packages[package_spec] = None

    if verify_attribs['action_id']:
        h = rhnSQL.prepare(_query_insert_attribute_verify_results)
        h.executemany(**verify_attribs)

    if missing_files['action_id']:
        h = rhnSQL.prepare(_query_insert_missing_verify_results)
        h.executemany(**missing_files)

    rhnSQL.commit()

_query_set_locks = rhnSQL.Statement("""
    UPDATE rhnLockedPackages
      SET pending = NULL
      WHERE rhnLockedPackages.server_id = :server_id AND
        rhnLockedPackages.pkg_id IN (
        SELECT pkg_id
          FROM rhnLockedPackages JOIN rhnActionPackage
            ON rhnLockedPackages.name_id = rhnActionPackage.name_id
            AND rhnLockedPackages.evr_id = rhnActionPackage.evr_id
            AND rhnLockedPackages.arch_id = rhnActionPackage.package_arch_id
          WHERE rhnActionPackage.action_id = :action_id
            AND rhnLockedPackages.server_id = :server_id
            AND rhnActionPackage.parameter = 'lock'
            AND rhnLockedPackages.pending = 'L'
      )
""")
_query_remove_locks = rhnSQL.Statement("""
    DELETE FROM rhnLockedPackages
      WHERE rhnLockedPackages.server_id = :server_id AND
        rhnLockedPackages.pkg_id IN (
        SELECT pkg_id
          FROM rhnLockedPackages JOIN rhnActionPackage
            ON rhnLockedPackages.name_id = rhnActionPackage.name_id
            AND rhnLockedPackages.evr_id = rhnActionPackage.evr_id
            AND rhnLockedPackages.arch_id = rhnActionPackage.package_arch_id
          WHERE rhnActionPackage.action_id = :action_id
            AND rhnLockedPackages.server_id = :server_id
            AND rhnActionPackage.parameter = 'lock'
            AND rhnLockedPackages.pending = 'U'
      )
""")
def setLocks(server_id, action_id, data={}):
    log_debug(3, action_id)

    h = rhnSQL.prepare(_query_set_locks)
    h.execute(server_id = server_id, action_id = action_id)

    h = rhnSQL.prepare(_query_remove_locks)
    h.execute(server_id = server_id, action_id = action_id)

# Exception raised when an invalid line is found


class InvalidResponseLine(Exception):
    pass


def _parse_response_line(response, tests):
    # Parses a single line of output from rpmverify
    # Returns a dictionary of values that can be plugged into the SQL query

    # response looks like:
    # 'S.5....T c /usr/share/rhn/up2date_client/iutil.pyc'
    # or
    # '....L...   /var/www/html'
    # or
    # 'missing    /usr/include/curl/types.h'
    # or
    # 'missing  c /var/www/html/index.html'
    #
    #
    #   or something like S.5....T.   /usr/lib/anaconda-runtime/boot/boot.msg
    # with the last line being a . or a C, depending on selinux context
    # see #155952
    #

    res_re = re.compile("^(?P<ts>[\S]+)\s+(?P<attr>[cdglr]?)\s* (?P<filename>[\S]+)$")

    m = res_re.match(response)

    if not m:
        raise InvalidResponseLine

    ts, attr, filename = m.groups()
    # clean up attr, as it can get slightly fudged in the

    if ts == 'missing':
        return {'filename': filename, 'missing': None}

    # bug 155952: SELinux will return an extra flag
    # FIXME: need to support the extra selinux context flag
    # I think this is just being paranoid, but to avoid changing schema for
    # bug 155952 we going to remove the 9th char if we get it
    # ahem, ignore the last flag if we 9 chars
    if len(ts) < len(tests):
        raise InvalidResponseLine

    if not filename:
        raise InvalidResponseLine

    dict = {
        'attrib': attr or None,  # convert empty attribute to None
        'filename': filename,
    }
    # Add the tests
    for i in range(len(tests)):
        val = ts[i]
        t_name = tests[i]
        if val == t_name:
            val = 'Y'
        elif val == '.':
            val = 'N'
        elif val != '?':
            raise InvalidResponseLine
        dict["test_" + t_name] = val

    return dict


def _hash_append(dst, src):
    # Append the values of src to dst
    for k, list in list(dst.items()):
        list.append(src[k])


def update(server_id, action_id, data={}):
    log_debug(3, server_id, action_id)

    action_status = rhnFlags.get('action_status')

    if action_status == 3:
        # Action failed
        kickstart_state = 'failed'
        next_action_type = None
    else:
        kickstart_state = 'deployed'

        # This is horrendous, but in order to fix it I would have to change almost all of the
        # actions code, which we don't have time to do for the 500 beta. --wregglej
        try:
            ks_session_type = server_kickstart.get_kickstart_session_type(server_id, action_id)
        except rhnException:
            re = sys.exc_info()[1]
            ks_session_type = None

        if ks_session_type is None:
            next_action_type = "None"
        elif ks_session_type == 'para_guest':
            next_action_type = 'kickstart_guest.initiate'
        else:
            next_action_type = 'kickstart.initiate'

    log_debug(4, "next_action_type: %s" % next_action_type)

    # More hideous hacked together code to get around our inflexible actions "framework".
    # If next_action_type is "None", we're assuming that we're *not* in a kickstart session
    # at this point, so we don't want to update a non-existant kickstart session.
    # I feel so dirty.  --wregglej
    if next_action_type != "None":
        server_kickstart.update_kickstart_session(server_id, action_id,
                                                  action_status, kickstart_state=kickstart_state,
                                                  next_action_type=next_action_type)

        _mark_dep_failures(server_id, action_id, data)


def remove(server_id, action_id, data={}):
    log_debug(3, action_id, data.get('name'))
    _mark_dep_failures(server_id, action_id, data)


_query_delete_dep_failures = rhnSQL.Statement("""
    delete from rhnActionPackageRemovalFailure
    where server_id = :server_id and action_id = :action_id
""")
_query_insert_dep_failures = rhnSQL.Statement("""
    insert into rhnActionPackageRemovalFailure (
        server_id, action_id, name_id, evr_id, capability_id,
        flags, suggested, sense)
    values (
        :server_id, :action_id, LOOKUP_PACKAGE_NAME(:name),
        LOOKUP_EVR(:epoch, :version, :release),
        LOOKUP_PACKAGE_CAPABILITY(:needs_name, :needs_version),
        :flags, LOOKUP_PACKAGE_NAME(:suggested, :ignore_null), :sense)
""")


def _mark_dep_failures(server_id, action_id, data):
    if not data:
        log_debug(4, "Nothing to do")
        return
    failed_deps = data.get('failed_deps')
    if not failed_deps:
        log_debug(4, "No failed deps")
        return

    if not isinstance(failed_deps, ListType):
        # Not the right format
        log_error("action_extra_data.packages.remove: server %s, action %s: "
                  "wrong type %s" % (server_id, action_id, type(failed_deps)))
        return

    inserts = {}
    for f in ('server_id', 'action_id',
              'name', 'version', 'release', 'epoch',
              'needs_name', 'needs_version', 'ignore_null',
              'flags', 'suggested', 'sense'):
        inserts[f] = []

    for failed_dep in failed_deps:
        try:
            pkg, needs_pkg, flags, suggested, sense = _check_dep(server_id,
                                                                 action_id, failed_dep)
        except InvalidDep:
            continue

        inserts['server_id'].append(server_id)
        inserts['action_id'].append(action_id)
        inserts['name'] .append(pkg[0])
        inserts['version'].append(pkg[1])
        inserts['release'].append(pkg[2])
        inserts['epoch'].append(None)

        inserts['needs_name'].append(needs_pkg[0])
        inserts['needs_version'].append(needs_pkg[1])

        inserts['flags'].append(flags)
        inserts['suggested'].append(suggested)
        inserts['ignore_null'].append(1)
        inserts['sense'].append(sense)

    h = rhnSQL.prepare(_query_delete_dep_failures)
    rowcount = h.execute(server_id=server_id, action_id=action_id)
    log_debug(5, "Removed old rows", rowcount)

    h = rhnSQL.prepare(_query_insert_dep_failures)

    h.executemany(**inserts)


def _check_dep(server_id, action_id, failed_dep):
    log_debug(5, failed_dep)
    if not failed_dep:
        return
    if not isinstance(failed_dep, ListType):
        # Not the right format
        log_error("action_extra_data.packages.remove: server %s, action %s: "
                  "failed dep type error: %s" % (
                      server_id, action_id, type(failed_dep)))
        raise InvalidDep

    # This is boring, but somebody's got to do it
    if len(failed_dep) < 5:
        log_error("action_extra_data.packages.remove: server %s, action %s: "
                  "failed dep: not enough entries: %s" % (
                      server_id, action_id, len(failed_dep)))
        raise InvalidDep

    pkg, needs_pkg, flags, suggested, sense = failed_dep[:5]

    if not isinstance(pkg, ListType) or len(pkg) < 3:
        log_error("action_extra_data.packages.remove: server %s, action %s: "
                  "failed dep: bad package spec %s (type %s, len %s)" % (
                      server_id, action_id, pkg, type(pkg), len(pkg)))
        raise InvalidDep
    pkg = list(map(str, pkg[:3]))

    if not isinstance(needs_pkg, ListType) or len(needs_pkg) < 2:
        log_error("action_extra_data.packages.remove: server %s, action %s: "
                  "failed dep: bad needs package spec %s (type %s, len %s)" % (
                      server_id, action_id, needs_pkg, type(needs_pkg),
                      len(needs_pkg)))
        raise InvalidDep
    needs_pkg = list(map(str, needs_pkg[:2]))

    if not isinstance(flags, IntType):
        log_error("action_extra_data.packages.remove: server %s, action %s: "
                  "failed dep: bad flags type %s" % (server_id, action_id, type(flags)))
        raise InvalidDep

    if not isinstance(sense, IntType):
        log_error("action_extra_data.packages.remove: server %s, action %s: "
                  "failed dep: bad sense type %s" % (server_id, action_id, type(sense)))
        raise InvalidDep

    return pkg, needs_pkg, flags, str(suggested), sense


def refresh_list(server_id, action_id, data={}):
    if not data:
        return
    log_debug(2, "action_extra_data.packages.refresh_list: Should do something "
              "useful with this data", server_id, action_id, data)


def delta(server_id, action_id, data={}):
    if not data:
        return
    log_debug(2, "action_extra_data.packages.delta: Should do something "
              "useful with this data", server_id, action_id, data)


def runTransaction(server_id, action_id, data={}):
    log_debug(3, action_id)

    # If it's a kickstart-related transaction, mark the kickstart session as
    # completed
    action_status = rhnFlags.get('action_status')
    ks_session_id = _next_kickstart_step(server_id, action_id, action_status)

    # Cleanup package profile
    server_kickstart.cleanup_profile(server_id, action_id, ks_session_id,
                                     action_status)

    _mark_dep_failures(server_id, action_id, data)

# Determine the next step to be executed in the kickstart code


def _next_kickstart_step(server_id, action_id, action_status):
    if action_status == 3:  # Failed
        # Nothing more to do here
        return server_kickstart.update_kickstart_session(server_id,
                                                         action_id, action_status, kickstart_state='complete',
                                                         next_action_type=None)

    # Fetch kickstart session id
    ks_session_id = server_kickstart.get_kickstart_session_id(server_id,
                                                              action_id)

    if ks_session_id is None:
        return server_kickstart.update_kickstart_session(server_id,
                                                         action_id, action_status, kickstart_state='complete',
                                                         next_action_type=None)

    # Get the current server profile
    server_profile = server_kickstart.get_server_package_profile(server_id)

    server_kickstart.schedule_config_deploy(server_id, action_id,
                                            ks_session_id, server_profile=server_profile)
    return ks_session_id
   0707010000013F000081B40000000000000000000000015FBBE8EE00000489000000000000000000000000000000000000003500000000spacewalk-backend/server/action_extra_data/reboot.py  #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

from spacewalk.common import rhnFlags
from spacewalk.common.rhnLog import log_debug
from spacewalk.server.rhnServer import server_kickstart

# the "exposed" functions
__rhnexport__ = ['reboot']


def reboot(server_id, action_id, data={}):
    log_debug(3, action_id)

    action_status = rhnFlags.get('action_status')
    server_kickstart.update_kickstart_session(server_id, action_id,
                                              action_status, kickstart_state='restarted',
                                              next_action_type=None)
   07070100000140000081B40000000000000000000000015FBBE8EE0000032B000000000000000000000000000000000000003900000000spacewalk-backend/server/action_extra_data/rhn_applet.py  #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

from spacewalk.common.rhnLog import log_debug

# the "exposed" functions
__rhnexport__ = ['use_satellite']

# noop


def use_satellite(server_id, action_id, data={}):
    log_debug(3, action_id)
 07070100000141000081B40000000000000000000000015FBBE8EE0000030F000000000000000000000000000000000000003400000000spacewalk-backend/server/action_extra_data/rhnsd.py   #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

from spacewalk.common.rhnLog import log_debug

__rhnexport__ = ['configure']

# the "exposed" functions


def configure(serverId, actionId, data={}):
    log_debug(3)
 07070100000142000081B40000000000000000000000015FBBE8EE0000058E000000000000000000000000000000000000003700000000spacewalk-backend/server/action_extra_data/rollback.py    #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

from spacewalk.common.rhnLog import log_debug

# the "exposed" functions
__rhnexport__ = ['config', 'listTransactions', 'rollback']


def config(server_id, action_id, data={}):
    if not data:
        return
    log_debug(2, "action_error.rollback.config: Should do something "
              "useful with this data", server_id, action_id, data)


def listTransactions(server_id, action_id, data={}):
    if not data:
        return
    log_debug(2, "action_error.rollback.listTransactions: Should do something "
              "useful with this data", server_id, action_id, data)


def rollback(server_id, action_id, data={}):
    if not data:
        return
    log_debug(2, "action_error.rollback.listTransactions: Should do something "
              "useful with this data", server_id, action_id, data)
  07070100000143000081B40000000000000000000000015FBBE8EE000019A0000000000000000000000000000000000000003300000000spacewalk-backend/server/action_extra_data/scap.py    #
# Copyright (c) 2012--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

import xml.dom.minidom
from base64 import decodestring
from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.server import rhnSQL

__rhnexport__ = ['xccdf_eval']


def xccdf_eval(server_id, action_id, data={}):
    log_debug(3)
    h = rhnSQL.prepare(_query_clear_tresult)
    h.execute(server_id=server_id, action_id=action_id)
    if not data:
        log_debug(4, "No data sent by client")
        return

    for item in ('resume', 'errors'):
        data[item] = decodestring(data[item].encode()).decode()

    resume = xml.dom.minidom.parseString(data['resume'])
    benchmark = resume.getElementsByTagName('benchmark-resume')[0]
    profiles = benchmark.getElementsByTagName('profile') or [_dummyDefaultProfile()]
    testresults = benchmark.getElementsByTagName('TestResult')
    if len(profiles) < 1 or len(testresults) < 1:
        log_error('Scap report misses profile or testresult element')
        return
    if len(profiles) != 1 or len(testresults) != 1:
        log_error('Scap report containst multiple results',
                  len(profiles), len(testresults))
    _process_testresult(testresults[0], server_id, action_id, benchmark,
                        profiles[0], data['errors'])


def _process_testresult(tr, server_id, action_id, benchmark, profile, errors):
    start_time = None
    if tr.hasAttribute('start-time'):
        start_time = tr.getAttribute('start-time')

    h = rhnSQL.prepare(_query_insert_tresult, blob_map={'errors': 'errors'})
    h.execute(server_id=server_id,
              action_id=action_id,
              bench_id=_truncate(benchmark.getAttribute('id'), 120),
              bench_version=_truncate(benchmark.getAttribute('version'), 80),
              profile_id=profile.getAttribute('id'),
              profile_title=_truncate(profile.getAttribute('title'), 120),
              identifier=_truncate(tr.getAttribute('id'), 120),
              start_time=start_time.replace('T', ' '),
              end_time=tr.getAttribute('end-time').replace('T', ' '),
              errors=errors
              )
    h = rhnSQL.prepare(_query_get_tresult)
    h.execute(server_id=server_id, action_id=action_id)
    testresult_id = h.fetchone()[0]
    if not _process_ruleresults(testresult_id, tr):
        h = rhnSQL.prepare(_query_update_errors, blob_map={'errors': 'errors'})
        h.execute(testresult_id=testresult_id,
                  errors=errors +
                  '\nSome text strings were truncated when saving to the database.')

truncated = False


def _process_ruleresults(testresult_id, tr):
    global truncated
    truncated = False
    inserts = {'rr_id': [], 'system': [], 'ident': []}
    for result in tr.childNodes:
        for rr in result.childNodes:
            rr_id = _create_rresult(testresult_id, result.nodeName)

            inserts['rr_id'].append(rr_id)
            inserts['system'].append('#IDREF#')
            inserts['ident'].append(_truncate(rr.getAttribute('id'), 255))
            for ident in rr.childNodes:
                trunc_ident = _truncate(_get_text(ident), 255)
                if not trunc_ident:
                    continue
                inserts['rr_id'].append(rr_id)
                inserts['system'].append(_truncate(ident.getAttribute('system'), 80))
                inserts['ident'].append(trunc_ident)
    _store_idents(inserts)
    return not truncated


def _truncate(string, max_len):
    global truncated
    if len(string) > max_len:
        truncated = True
        return string[:max_len - 3] + "..."
    return string


def _create_rresult(testresult_id, result_label):
    rr_id = rhnSQL.Sequence("rhn_xccdf_rresult_id_seq")()
    h = rhnSQL.prepare(_query_insert_rresult)
    h.execute(rr_id=rr_id, testresult_id=testresult_id,
              result_label=result_label)
    return rr_id


def _store_idents(data):
    h = rhnSQL.prepare(_query_insert_identmap)
    h.executemany(**data)

def _get_text(node):
    rc = []
    for node in node.childNodes:
        if node.nodeType == node.TEXT_NODE:
            rc.append(node.data)
    return ''.join(rc)


class _dummyDefaultProfile:

    def getAttribute(self, name):
        if name == 'id':
            return 'None'
        elif name == 'title':
            return 'No profile selected. Using defaults.'
        return ''

_query_clear_tresult = rhnSQL.Statement("""
delete from rhnXccdfTestresult
 where server_id = :server_id
   and action_scap_id = (
    select id from rhnActionScap
     where action_id = :action_id)
""")

_query_insert_tresult = rhnSQL.Statement("""
insert into rhnXccdfTestresult(
    id,
    server_id,
    action_scap_id,
    benchmark_id,
    profile_id,
    identifier,
    start_time,
    end_time,
    errors)
values (
    sequence_nextval('rhn_xccdf_tresult_id_seq'),
    :server_id,
    (select ras.id
       from rhnActionScap ras
      where ras.action_id = :action_id),
    lookup_xccdf_benchmark(:bench_id, :bench_version),
    lookup_xccdf_profile(:profile_id, :profile_title),
    :identifier,
    TO_TIMESTAMP(:start_time, 'YYYY-MM-DD HH24:MI:SS'),
    TO_TIMESTAMP(:end_time, 'YYYY-MM-DD HH24:MI:SS'),
    :errors
    )
""")

_query_get_tresult = rhnSQL.Statement("""
select id from rhnXccdfTestresult
    where server_id = :server_id
    and action_scap_id = (
        select ras.id
            from rhnActionScap ras
             where ras.action_id = :action_id
    )
""")

_query_insert_rresult = """
insert into rhnXccdfRuleresult (id, testresult_id, result_id)
values (
    :rr_id,
    :testresult_id,
    (select rt.id
        from rhnXccdfRuleresultType rt
        where rt.label = :result_label)
    )
"""

_query_insert_identmap = rhnSQL.Statement("""
insert into rhnXccdfRuleIdentMap (rresult_id, ident_id)
values (
    :rr_id,
    lookup_xccdf_ident(:system, :ident)
    )
""")

_query_update_errors = rhnSQL.Statement("""
update rhnXccdfTestresult
set errors = :errors
where id = :testresult_id
""")
07070100000144000081B40000000000000000000000015FBBE8EE000009D4000000000000000000000000000000000000003500000000spacewalk-backend/server/action_extra_data/script.py  #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

import base64

from spacewalk.common.rhnLog import log_debug
from spacewalk.server import rhnSQL

# the "exposed" functions
__rhnexport__ = ['run']

_query_clear_output = rhnSQL.Statement("""
delete from rhnServerActionScriptResult
 where server_id = :server_id
   and action_script_id = (
     select id from rhnActionScript where action_id = :action_id
   )
""")

_query_initial_store = rhnSQL.Statement("""
insert into rhnServerActionScriptResult (
    server_id,
    action_script_id,
    output,
    start_date,
    stop_date,
    return_code
  )
values (
       :server_id,
       (select ascript.id
          from rhnActionScript ascript
         where ascript.action_id = :action_id),
       :output,
       TO_TIMESTAMP(:process_start, 'YYYY-MM-DD HH24:MI:SS'),
       TO_TIMESTAMP(:process_end, 'YYYY-MM-DD HH24:MI:SS'),
       :return_code)
""")


def run(server_id, action_id, data={}):
    log_debug(3)

    # clear any previously received output
    h = rhnSQL.prepare(_query_clear_output)
    h.execute(server_id=server_id, action_id=action_id)

    if not data:
        log_debug(4, "No data sent by client")
        return

    output = data.get('output')

    # newer clients should always be setting
    # this flag and encoding the results,
    # otherwise xmlrpc isn't very happy on certain characters
    if 'base64enc' in data:
        output = base64.decodestring(output.encode()).decode()

    return_code = data.get('return_code')
    process_end = data.get('process_end')
    process_start = data.get('process_start')

    log_debug(4, "script output", output)

    h = rhnSQL.prepare(_query_initial_store, blob_map={'output': 'output'})
    h.execute(server_id=server_id,
              action_id=action_id,
              process_start=process_start,
              process_end=process_end,
              return_code=return_code,
              output=output
              )
07070100000145000081B40000000000000000000000015FBBE8EE000004B1000000000000000000000000000000000000003D00000000spacewalk-backend/server/action_extra_data/up2date_config.py  #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# errata-related error handling functions
#

from spacewalk.common.rhnLog import log_debug

# the "exposed" functions
__rhnexport__ = ['get', 'update', ]


def get(server_id, action_id, data={}):
    if not data:
        return
    log_debug(2, "action_error.up2date_config.get: Should do something "
              "useful with this data", server_id, action_id, data)


def update(server_id, action_id, data={}):
    if not data:
        return
    log_debug(2, "action_error.up2date_config.update: Should do something "
              "useful with this data", server_id, action_id, data)
   07070100000146000081B40000000000000000000000015FBBE8EE0000079F000000000000000000000000000000000000003300000000spacewalk-backend/server/action_extra_data/virt.py    #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

from spacewalk.common import rhnFlags
from spacewalk.common.rhnLog import log_debug


__rhnexport__ = ['schedulePoller',
                 'reboot',
                 'resume',
                 'start',
                 'suspend',
                 'shutdown',
                 'destroy',
                 'setMemory',
                 'setVCPUs'
                 ]


def _do_nothing(server_id, action_id):
    log_debug(4, action_id)
    action_status = rhnFlags.get('action_status')
    log_debug(4, "Action ID: %s, Action Status: %s" % (str(action_id), str(action_status)))


def schedulePoller(server_id, action_id, data={}):
    _do_nothing(server_id, action_id)


def reboot(server_id, action_id, data={}):
    _do_nothing(server_id, action_id)


def resume(server_id, action_id, data={}):
    _do_nothing(server_id, action_id)


def start(server_id, action_id, data={}):
    _do_nothing(server_id, action_id)


def suspend(server_id, action_id, data={}):
    _do_nothing(server_id, action_id)


def shutdown(server_id, action_id, data={}):
    _do_nothing(server_id, action_id)


def destroy(server_id, action_id, data={}):
    _do_nothing(server_id, action_id)


def setMemory(server_id, action_id, data={}):
    _do_nothing(server_id, action_id)


def setVCPUs(server_id, action_id, data={}):
    _do_nothing(server_id, action_id)
 07070100000147000081B40000000000000000000000015FBBE8EE00002009000000000000000000000000000000000000002700000000spacewalk-backend/server/apacheAuth.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

import time
import re

from spacewalk.common import rhnFlags
from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.common.rhnConfig import CFG
from spacewalk.common.rhnException import rhnFault
from spacewalk.common.rhnTranslate import _

from .rhnLib import computeSignature


def splitProxyAuthToken(token):
    """ given a token:hostname, split it into a token-list, hostname """

    token = token.split(':')
    hostname = ''
    if len(token) > 5:
        hostname = token[-1]
        token = token[:-1]
    else:
        # Spacewalk Proxy v1.1 (route tracking unsupported)
        hostname = None
    return token, hostname


def _verifyProxyAuthToken(auth_token):
    """ verifies the validity of a proxy auth token

        NOTE: X-RHN-Proxy-Auth described in proxy/broker/rhnProxyAuth.py
    """

    log_debug(4, auth_token)
    token, hostname = splitProxyAuthToken(auth_token)
    hostname = hostname.strip()
    ipv4_regex = '^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])$'
    # This ipv6 regex was develeoped by Stephen Ryan at Dataware.
    # (http://forums.intermapper.com/viewtopic.php?t=452) It is licenced
    # under a Creative Commons Attribution-ShareAlike 3.0 Unported
    # License, so we are free to use it as long as we attribute it to him.
    ipv6_regex = '^((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?$'
    hostname_is_ip_address = re.match(ipv4_regex, hostname) or re.match(ipv6_regex, hostname)

    headers = rhnFlags.get('outputTransportOptions')
    if len(token) < 5:
        # Bad auth information; decline any action
        log_debug(4, "incomplete proxy authentication token: %s"
                  % auth_token)
        headers['X-RHN-Proxy-Auth-Error'] = '%s:%s' % (
            1003, _("incomplete proxy authentication token: %s") % auth_token)
        if not hostname_is_ip_address:
            headers['X-RHN-Proxy-Auth-Origin'] = hostname
        raise rhnFault(1003)  # Invalid session key

    log_debug(5, "proxy auth token: %s,  hostname: %s"
                 % (repr(token), hostname or 'n/a'))

    proxyId, proxyUser, rhnServerTime, expireOffset, signature = token[:5]
    computed = computeSignature(CFG.SECRET_KEY, proxyId, proxyUser,
                                rhnServerTime, expireOffset)

    if computed != signature:
        log_error("Proxy signature failed: proxy id='%s', proxy user='%s'" %
                  (proxyId, proxyUser))
        log_debug(4, "Sent proxy signature %s does not match ours %s." % (
            signature, computed))
        headers['X-RHN-Proxy-Auth-Error'] = '%s:%s' % (
            1003, _("Sent proxy signature %s does not match ours %s.") % (
                signature, computed))
        if not hostname_is_ip_address:
            headers['X-RHN-Proxy-Auth-Origin'] = hostname
        raise rhnFault(1003)  # Invalid session key

    # Convert the expiration/time to floats:
    rhnServerTime = float(rhnServerTime)
    expireOffset = float(expireOffset)

    if rhnServerTime + expireOffset < time.time():
        log_debug(4, "Expired proxy authentication token")
        headers['X-RHN-Proxy-Auth-Error'] = '%s:%s' % (1004, "Expired")
        if not hostname_is_ip_address:
            headers['X-RHN-Proxy-Auth-Origin'] = hostname
        raise rhnFault(1004)  # Expired client authentication token

    log_debug(4, "Proxy auth OK: sigs match; not an expired token")
    return 1


def auth_proxy():
    """ Authenticates a proxy carrying a clients request. For a valid or
        unsigned request, this function returns 1 (OK), otherwise it raises
        rhnFault

        NOTE: X-RHN-Proxy-Auth described in proxy/broker/rhnProxyAuth.py
    """

    log_debug(3)
    headers = rhnFlags.get('outputTransportOptions')
    if not rhnFlags.test('X-RHN-Proxy-Auth'):
        # No auth information; decline any action
        log_debug(4, "declined proxy authentication")
        headers['X-RHN-Proxy-Auth-Error'] = '%s:%s' % (
            1003, _("declined proxy authentication"))
        raise rhnFault(1003)  # Invalid session key

    # NOTE:
    #   - < v3.1 RHN proxies send only 1 token in this header
    #   - > v3.1: we send the route of the requests via multiple tokens
    #     "token1:hostname1,token2:hostname2" the first tuple is the first
    #     proxy hit.

    tokens = rhnFlags.get('X-RHN-Proxy-Auth').split(',')
    tokens = [token for token in tokens if token]

    for auth_token in tokens:
        _verifyProxyAuthToken(auth_token)

    # if no rhnFault was raised then the tokens all passed
    return 1


def auth_client():
    """ Authenticates a request from a client
        For an unsigned request, this function returns 0 (request should be
        coming from a client).
    """

    log_debug(3)
    if not rhnFlags.test("AUTH_SESSION_TOKEN"):
        # No auth information; decline any GET action (XMLRPC requests
        # ignore this error).
        log_debug(4, "declined client authentication for GET requests")
        return 0

    token = dict((k.lower(),v) for k,v in list(rhnFlags.get("AUTH_SESSION_TOKEN").items()))
    # Check to see if everything we need to compute the signature is there
    for k in ('x-rhn-server-id',
              'x-rhn-auth-user-id',
              'x-rhn-auth',
              'x-rhn-auth-server-time',
              'x-rhn-auth-expire-offset'):
        if k not in token:
            # No auth information; decline any action
            log_debug(4, "Declined auth of client for GET requests; "
                         "incomplete header info.")
            return 0

    clientId = token['x-rhn-server-id']
    username = token['x-rhn-auth-user-id']
    signature = token['x-rhn-auth']
    rhnServerTime = token['x-rhn-auth-server-time']
    expireOffset = token['x-rhn-auth-expire-offset']


    computed = computeSignature(CFG.SECRET_KEY, clientId, username,
                                rhnServerTime, expireOffset)
    if computed != signature:
        log_debug(4, "Sent client signature %s does not match ours %s." % (
            signature, computed))
        raise rhnFault(33, "Invalid client session key")

    # Convert the expiration/time to floats:
    rhnServerTime = float(rhnServerTime)
    expireOffset = float(expireOffset)

    if rhnServerTime + expireOffset < time.time():
        log_debug(4, "Expired client authentication token")
        raise rhnFault(34, "Expired client authentication token")

    log_debug(4, "Client auth OK")
    return 1
   07070100000148000081B40000000000000000000000015FBBE8EE00001F87000000000000000000000000000000000000002A00000000spacewalk-backend/server/apacheHandler.py #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import sys
import os
import time

from spacewalk.common import apache, rhnApache, rhnTB, rhnFlags
from spacewalk.common.rhnException import rhnException, rhnFault
from spacewalk.common.rhnConfig import CFG, initCFG
from spacewalk.common.rhnLog import log_debug, log_error, initLOG, log_setreq

# local module imports
from . import rhnSQL

from .apacheRequest import apacheGET, apachePOST, HandlerNotFoundError
from . import rhnCapability

# a lame timer function for pretty logs


def timer(last):
    if not last:
        return 0
    log_debug(2, "%.2f sec" % (time.time() - last,))
    return 0


class apacheSession(rhnApache):

    """ a class that extends rhnApache with several support functions used
     by the main handler class. This class deals with the processing of
     the request and setup for the real action handled in the
     apacheHandler class below. """
    _lang_catalog = "server"


class apacheHandler(apacheSession):

    """ main Apache XMLRPC point of entry for the server """

    def __init__(self):
        # First call the inherited constructor:
        apacheSession.__init__(self)
        self._req_processor = None

    ###
    # HANDLERS, in the order which they are called:
    # headerParserHandler, handler, and cleanupHandler.
    ###

    def headerParserHandler(self, req):

        log_setreq(req)
        # We need to init CFG and Logging
        options = req.get_options()
        # if we are initializing out of a <Location> handler don't
        # freak out
        if "RHNComponentType" not in options:
            # clearly nothing to do
            return apache.OK
        initCFG(options["RHNComponentType"])
        initLOG(CFG.LOG_FILE, CFG.DEBUG)

        """ parse the request, init database and figure out what can we call """
        log_debug(2, req.the_request)
        # call method from inherited class
        ret = apacheSession.headerParserHandler(self, req)
        if ret != apache.OK:
            return ret
        # make sure we have DB connection
        if not CFG.SEND_MESSAGE_TO_ALL:
            try:
                rhnSQL.initDB()
            except rhnSQL.SQLConnectError:
                rhnTB.Traceback(mail=1, req=req, severity="schema")
                return apache.HTTP_INTERNAL_SERVER_ERROR
        else:
            # If in outage mode, close the DB connections
            rhnSQL.closeDB()

        # Store client capabilities
        client_cap_header = 'X-RHN-Client-Capability'
        if client_cap_header in req.headers_in:
            client_caps = req.headers_in[client_cap_header]
            client_caps = [_f.strip() for _f in client_caps.split(',') if _f.strip()]
            rhnCapability.set_client_capabilities(client_caps)

        # Enabling the input header flags associated with the redirects/newer clients
        redirect_support_flags = ['X-RHN-Redirect', 'X-RHN-Transport-Capability']
        for flag in redirect_support_flags:
            if flag in req.headers_in:
                rhnFlags.set(flag, str(req.headers_in[flag]))

        return apache.OK

    def _init_request_processor(self, req):
        log_debug(3)
        # Override the parent class's behaviour
        # figure out what kind of request handler we need to instantiate
        if req.method == "POST":
            self._req_processor = apachePOST(self.clientVersion, req)
            return apache.OK
        if req.method == "GET":
            try:
                self._req_processor = apacheGET(self.clientVersion, req)
            except HandlerNotFoundError:
                e = sys.exc_info()[1]
                log_error("Unable to handle GET request for server %s" %
                          (e.args[0], ))
                return apache.HTTP_METHOD_NOT_ALLOWED
            token = self._setSessionToken(req.headers_in)
            if token is None:
                return apache.HTTP_METHOD_NOT_ALLOWED
            return apache.OK

        log_error("Method not allowed", req.method)
        return apache.HTTP_METHOD_NOT_ALLOWED

    def _cleanup_request_processor(self):
        """ Clean up the request processor """
        self._req_processor = None
        return apache.OK

    def handler(self, req):
        """ main Apache handler """
        log_debug(2)
        ret = apacheSession.handler(self, req)
        if ret != apache.OK:
            return ret

        if not CFG.SEND_MESSAGE_TO_ALL:
            # Need to get any string template overrides here, before any app
            # code gets executed, as the rhnFault error messages use the
            # templates
            # If send_message_to_all, we don't have DB connectivity though
            h = rhnSQL.prepare("select label, value from rhnTemplateString")
            h.execute()

            templateStrings = {}
            while 1:
                row = h.fetchone_dict()
                if not row:
                    break

                templateStrings[row['label']] = row['value']

            if templateStrings:
                rhnFlags.set('templateOverrides', templateStrings)

            log_debug(4, "template strings:  %s" % templateStrings)

        if not CFG.SECRET_KEY:
            # Secret key not defined, complain loudly
            try:
                raise rhnException("Secret key not found!")
            except:
                rhnTB.Traceback(mail=1, req=req, severity="schema")
                req.status = 500
                req.send_http_header()
                return apache.OK

        # Try to authenticate the proxy if it this request passed
        # through a proxy.
        if self.proxyVersion:
            try:
                ret = self._req_processor.auth_proxy()
            except rhnFault:
                f = sys.exc_info()[1]
                return self._req_processor.response(f.getxml())

        # Decide what to do with the request: try to authenticate the client.
        # NOTE: only upon GET requests is there Signature information to
        #       authenticate. XMLRPC requests DO NOT use signature
        #       authentication.
        if req.method == "GET":
            try:
                ret = self._req_processor.auth_client()
            except rhnFault:
                f = sys.exc_info()[1]
                return self._req_processor.response(f.getxml())
            # be safe rather than sorry
            if not ret:
                log_error("Got a GET call, but auth_client declined",
                          req.path_info)
                return apache.HTTP_METHOD_NOT_ALLOWED

        # Avoid leaving Oracle deadlocks
        try:
            ret = self._req_processor.process()
            rhnSQL.rollback()
        except Exception as exc:
            if not CFG.SEND_MESSAGE_TO_ALL:
                rhnSQL.rollback()
            raise
        log_debug(4, "Leave with return value", ret)
        return ret

    def cleanupHandler(self, req):
        """ Clean up stuff before we close down the session when we are called
        from apacheServer.Cleanup() """
        log_debug(2)
        # kill all of our child processes (if any)
        while 1:
            pid = status = -1
            try:
                (pid, status) = os.waitpid(-1, 0)
            except OSError:
                break
            else:
                log_error("Reaped child process %d with status %d" % (
                          pid, status))
        ret = apacheSession.cleanupHandler(self, req)
        return ret
 07070100000149000081B40000000000000000000000015FBBE8EE0000672F000000000000000000000000000000000000002A00000000spacewalk-backend/server/apacheRequest.py #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# This module implements requests handlers for GET and POST methods.
#

# system modules
import os
import sys
import base64
try:
    #  python 2
    import xmlrpclib
except ImportError:
    #  python3
    import xmlrpc.client as xmlrpclib
from rhn.rpclib import transports

# common modules
from uyuni.common.usix import raise_with_tb
from spacewalk.common import apache, rhnFlags
from spacewalk.common.rhnConfig import CFG
from spacewalk.common import byterange
from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.common.rhnException import rhnFault, rhnNotFound,\
    redirectException  # to catch redirect exception
from spacewalk.common.rhnTranslate import _
from uyuni.common.rhnLib import setHeaderValue
from spacewalk.common.rhnTB import Traceback

# local modules
from . import rhnRepository
from . import rhnImport
from . import rhnSQL
from . import rhnCapability
from . import apacheAuth

# Exceptions


class UnknownXML(Exception):

    def __init__(self, value):
        Exception.__init__(self)
        self.__value = value

    def __repr__(self):
        return _("Invalid request received (%s).") % self.__value
    __str__ = __repr__


class HandlerNotFoundError(Exception):
    pass

# base class for requests


class apacheRequest:

    def __init__(self, client_version, req):
        self.client = client_version
        self.req = req
        # grab an Input object
        self.input = transports.Input(req.headers_in)
        # make sure we have a parser and a decoder available
        self.parser, self.decoder = xmlrpclib.getparser()
        # Make sure the decoder doesn't assume UTF-8 data, that would break if
        # non-UTF-8 chars are sent (bug 139370)
        self.decoder._encoding = None

        # extract the server we're talking to and the root directory
        # from the request configuration options
        req_config = req.get_options()
        # XXX: attempt to catch these KeyErrors sometime when there is
        # time to play nicely
        self.server = req_config["SERVER"]
        # Load the server classes
        # XXX: some day we're going to trust the timestamp stuff...
        self.servers = None
        self._setup_servers()

    def _setup_servers(self):
        self.servers = rhnImport.load("server/handlers",
                                      interface_signature='rpcClasses')

    # return a reference to a method name. The method in the base
    def method_ref(self, method):
        raise UnknownXML("Could not find reference definition"
                         "for method '%s'" % method)

    # call a function with parameters
    def call_function(self, method, params):
        # short-circuit everything if sending a system-wide message.
        if CFG.SEND_MESSAGE_TO_ALL:
            # Make sure the applet doesn't see the message
            if method == 'applet.poll_status':
                return self.response({
                    'checkin_interval': 3600,
                    'server_status': 'normal'
                })
            if method == 'applet.poll_packages':
                return self.response({'use_cached_copy': 1})

            # Fetch global message being sent to clients if applicable.
            msg = open(CFG.MESSAGE_TO_ALL).read()
            log_debug(3, "Sending message to all clients: %s" % msg)
            # Send the message as a fault.
            response = xmlrpclib.Fault(
                -1, _("IMPORTANT MESSAGE FOLLOWS:\n%s") % msg)
            # and now send everything back
            ret = self.response(response)
            log_debug(4, "Leave with return value", ret)
            return ret

        # req: where the response is sent to
        log_debug(2, method)

        # Now we have the reference, call away
        force_rollback = 1
        func = None
        try:
            # now get the function reference and call it
            func = self.method_ref(method)
            response = func(*params)
        except (TypeError, ValueError, KeyError, IndexError, UnknownXML):
            # report exception back to server
            fault = 1

            if sys.version_info[0] == 3:
                exctype = sys.exc_info()[0]
            else:
                exctype = sys.exc_info()[0]

            if exctype == UnknownXML:
                fault = -1
            e_type, e_value = sys.exc_info()[:2]
            response = xmlrpclib.Fault(fault, _(
                "While running '%s': caught\n%s : %s\n") % (
                method, e_type, e_value))
            Traceback(method, self.req,
                      extra="Response sent back to the caller:\n%s\n" % (
                          response.faultString,),
                      severity="notification")
        except rhnNotFound:
            e = sys.exc_info()[1]
            return apache.HTTP_NOT_FOUND
        # pkilambi:catch exception if redirect
        except redirectException:
            re = sys.exc_info()[1]
            log_debug(3, "redirect exception caught", re.path)
            response = re.path

        except rhnFault:
            f = sys.exc_info()[1]
            response = f.getxml()
        except rhnSQL.SQLSchemaError:
            e = sys.exc_info()[1]
            f = None
            if e.errno == 20200:
                log_debug(2, "User Group Membership EXCEEDED")
                f = rhnFault(43, e.errmsg)
            if not f:
                log_error("rhnSQL.SQLSchemaError caught", e)
                rhnSQL.rollback()
                # generate the traceback report
                Traceback(method, self.req,
                          extra="SQL Error generated: %s" % e,
                          severity="schema")
                return apache.HTTP_INTERNAL_SERVER_ERROR
            response = f.getxml()
        except rhnSQL.SQLError:
            e = sys.exc_info()[1]
            log_error("rhnSQL.SQLError caught", e)
            rhnSQL.rollback()
            Traceback(method, self.req,
                      extra="SQL Error generated: %s" % e,
                      severity="schema")
            return apache.HTTP_INTERNAL_SERVER_ERROR
        except Exception:
            e = sys.exc_info()[1]
            log_error("Unhandled exception", e)
            rhnSQL.rollback()
            # otherwise we do a full stop
            Traceback(method, self.req, severity="unhandled")
            return apache.HTTP_INTERNAL_SERVER_ERROR
        else:
            # if no exception, we don't need to rollback
            force_rollback = 0
        if force_rollback:
            rhnSQL.rollback()

        # and now send everything back
        ret = self.response(response)

        log_debug(4, "Leave with return value", ret)
        return ret

    # process the request
    def process(self):
        # this is just a stub we'd better override
        return apache.HTTP_NOT_IMPLEMENTED

    # convert a response to the right type for passing back to
    # rpclib.xmlrpclib.dumps
    def normalize(self, response):
        if isinstance(response, xmlrpclib.Fault):
            return response
        return (response,)

    # send a file out
    def response_file(self, response):
        log_debug(3, response.name)
        # We may set the content type remotely
        if rhnFlags.test("Content-Type"):
            self.req.content_type = rhnFlags.get("Content-Type")
        else:
            # Safe default
            self.req.content_type = "application/octet-stream"

        # find out the size of the file
        if response.length == 0:
            response.file_obj.seek(0, 2)
            file_size = response.file_obj.tell()
            response.file_obj.seek(0, 0)
        else:
            file_size = response.length

        success_response = apache.OK
        response_size = file_size

        # Respond to if-modified-since requests
        if ("If-Modified-Since" in self.req.headers_in and
                "Last-Modified" in rhnFlags.get("outputTransportOptions") and
                rhnFlags.get("outputTransportOptions")['Last-Modified'] == self.req.headers_in['If-Modified-Since']):
            return apache.HTTP_NOT_MODIFIED

        # Serve up the requested byte range
        if "Range" in self.req.headers_in:
            try:
                range_start, range_end = \
                    byterange.parse_byteranges(self.req.headers_in["Range"],
                                               file_size)
                response_size = range_end - range_start
                self.req.headers_out["Content-Range"] = \
                    byterange.get_content_range(range_start, range_end, file_size)
                self.req.headers_out["Accept-Ranges"] = "bytes"

                response.file_obj.seek(range_start)

                # We'll want to send back a partial content rather than ok
                # if this works
                self.req.status = apache.HTTP_PARTIAL_CONTENT
                success_response = apache.HTTP_PARTIAL_CONTENT

            # For now we will just return the file file on the following exceptions
            except byterange.InvalidByteRangeException:
                pass
            except byterange.UnsatisfyableByteRangeException:
                pass

        self.req.headers_out["Content-Length"] = str(response_size)

        # if we loaded this from a real fd, set it as the X-Replace-Content
        # check for "name" since sometimes we get xmlrpclib.transports.File's that have
        # a stringIO as the file_obj, and they dont have a .name (ie,
        # fileLists...)
        if response.name:
            self.req.headers_out["X-Package-FileName"] = response.name

        xrepcon = "X-Replace-Content-Active" in self.req.headers_in \
            and rhnFlags.test("Download-Accelerator-Path")
        if xrepcon:
            fpath = rhnFlags.get("Download-Accelerator-Path")
            log_debug(1, "Serving file %s" % fpath)
            self.req.headers_out["X-Replace-Content"] = fpath
            # Only set a byte rate if xrepcon is active
            byte_rate = rhnFlags.get("QOS-Max-Bandwidth")
            if byte_rate:
                self.req.headers_out["X-Replace-Content-Throttle"] = str(byte_rate)

        # send the headers
        self.req.send_http_header()

        if "Range" in self.req.headers_in:
            # and the file
            read = 0
            while read < response_size:
                # We check the size here in case we're not asked for the entire file.
                if (read + CFG.BUFFER_SIZE > response_size):
                    to_read = read + CFG.BUFFER_SIZE - response_size
                else:
                    to_read = CFG.BUFFER_SIZE
                buf = response.read(CFG.BUFFER_SIZE)
                if not buf:
                    break
                try:
                    self.req.write(buf)
                    read = read + CFG.BUFFER_SIZE
                except IOError:
                    if xrepcon:
                        # We're talking to a proxy, so don't bother to report
                        # a SIGPIPE
                        break
                    return apache.HTTP_BAD_REQUEST
            response.close()
        else:
            if 'wsgi.file_wrapper' in self.req.headers_in:
                self.req.output = self.req.headers_in['wsgi.file_wrapper'](response, CFG.BUFFER_SIZE)
            else:
                self.req.output = iter(lambda: response.read(CFG.BUFFER_SIZE), '')

        return success_response

    # send the response (common code)
    def response(self, response):
        # Send the xml-rpc response back
        log_debug(3, type(response))
        needs_xmlrpc_encoding = not rhnFlags.test("XMLRPC-Encoded-Response")
        compress_response = rhnFlags.test("compress_response")
        # Init an output object; we'll use it for sending data in various
        # formats
        if isinstance(response, transports.File):
            if not hasattr(response.file_obj, 'fileno') and compress_response:
                # This is a StringIO that has to be compressed, so read it in
                # memory; mark that we don't have to do any xmlrpc encoding
                response = response.file_obj.read()
                needs_xmlrpc_encoding = 0
            else:
                # Just treat is as a file
                return self.response_file(response)

        output = transports.Output()

        # First, use the same encoding/transfer that the client used
        output.set_transport_flags(
            transfer=transports.lookupTransfer(self.input.transfer),
            encoding=transports.lookupEncoding(self.input.encoding))

        if isinstance(response, xmlrpclib.Fault):
            log_debug(4, "Return FAULT",
                      response.faultCode, response.faultString)
            # No compression for faults because we'd like them to pop
            # up in clear text on the other side just in case
            output.set_transport_flags(output.TRANSFER_NONE, output.ENCODE_NONE)
        elif compress_response:
            # check if we have to compress this result
            log_debug(4, "Compression on for client version", self.client)
            if self.client > 0:
                output.set_transport_flags(output.TRANSFER_BINARY,
                                           output.ENCODE_ZLIB)
            else:  # original clients had the binary transport support broken
                output.set_transport_flags(output.TRANSFER_BASE64,
                                           output.ENCODE_ZLIB)

        # We simply add the transport options to the output headers
        output.headers.update(rhnFlags.get('outputTransportOptions').dict())

        if needs_xmlrpc_encoding:
            # Normalize the response
            response = self.normalize(response)
            try:
                response = xmlrpclib.dumps(response, methodresponse=1)
            except TypeError:
                e = sys.exc_info()[1]
                log_debug(4, "Error \"%s\" encoding response = %s" % (e, response))
                Traceback("apacheHandler.response", self.req,
                          extra="Error \"%s\" encoding response = %s" % (e, response),
                          severity="notification")
                return apache.HTTP_INTERNAL_SERVER_ERROR
            except Exception as exc:
                # Uncaught exception; signal the error
                Traceback("apacheHandler.response", self.req,
                          severity="unhandled")
                return apache.HTTP_INTERNAL_SERVER_ERROR

        # we're about done here, patch up the headers
        output.process(response)
        # Copy the rest of the fields
        for k, v in list(output.headers.items()):
            if k.lower() == 'content-type':
                # Content-type
                self.req.content_type = v
            else:
                setHeaderValue(self.req.headers_out, k, v)

        if 5 <= CFG.DEBUG < 10:
            log_debug(5, "The response: %s[...SNIP (for sanity) SNIP...]%s" % (response[:100], response[-100:]))
        elif CFG.DEBUG >= 10:
            # if you absolutely must have that whole response in the log file
            log_debug(10, "The response: %s" % response)

        # send the headers
        self.req.send_http_header()
        try:
            # XXX: in case data is really large maybe we should split
            # it in smaller chunks instead of blasting everything at
            # once. Not yet a problem...
            self.req.write(output.data)
        except IOError:
            # send_http_header is already sent, so it doesn't make a lot of
            # sense to return a non-200 error; but there is no better solution
            return apache.HTTP_BAD_REQUEST
        del output
        return apache.OK

    def auth_client(self):
        return apacheAuth.auth_client()

    def auth_proxy(self):
        return apacheAuth.auth_proxy()

# handles the POST requests


class apachePOST(apacheRequest):
    # Decode the request. Returns a tuple of (params, methodName).

    def decode(self, data):
        try:
            self.parser.feed(data)
        except IndexError:
            # malformed XML data
            raise_with_tb(xmlrpclib.ResponseError, sys.exc_info()[2])

        self.parser.close()
        # extract the method and arguments; we pass the exceptions through
        params = self.decoder.close()
        method = self.decoder.getmethodname()
        return params, method

    # get the function reference for the POST request
    def method_ref(self, method):
        # Execute the right function (from xml-rpc request) in the right class.
        # NOTE: All functions should do their own logging
        log_debug(3, self.server, method)
        if method[-8:] == '.__str__':
            # Ignore these, they are just some code trying to stringify an
            # XML-RPC function
            log_error("Ignoring call for method", method)
            raise rhnFault(-1, "Ignoring call for a __str__ method", explain=0)
        if self.server is None:
            raise UnknownXML("Method `%s' is not bound to a server "
                             "(server = %s)" % (method, self.server))
        classes = self.servers[self.server]
        if classes is None:
            raise UnknownXML("Server %s is not a valid XML-RPC receiver" %
                             (self.server,))

        try:
            classname, funcname = method.split('.', 1)
        except:
            raise_with_tb(UnknownXML("method '%s' doesn't have a class and function" %
                             (method,)), sys.exc_info()[2])
        if not classname or not funcname:
            raise UnknownXML(method)

        log_debug(4, "Class name: %s; function name: %s" % (classname,
                                                            funcname))
        c = classes.get(classname)
        if c is None:
            raise UnknownXML("class %s.%s is not defined (function = %s)" % (
                self.server, classname, funcname))

        # Initialize the handlers object
        serverHandlers = c()
        # we need this for sat handler
        serverHandlers.remote_hostname = self.req.get_remote_host(apache.REMOTE_DOUBLE_REV)
        f = serverHandlers.get_function(funcname)
        if f is None:
            raise UnknownXML("function: %s invalid" % (method,))
        # Send the client this server's capabilities
        rhnCapability.set_server_capabilities()
        return f

    # handle the POST requests
    def process(self):
        log_debug(3)
        # nice thing that req has a read() method, so it makes it look just
        # like an fd
        try:
            fd = self.input.decode(self.req)
        except IOError:  # client timed out
            log_error("IOError: client timed out?")
            return apache.HTTP_BAD_REQUEST

        # Read the data from the request
        # pylint: disable=E1103
        _body = fd.read()
        fd.close()

        # In this case, we talk to a client (maybe through a proxy)
        # make sure we have something to decode
        if _body is None or len(_body) == 0:
            log_error("Empty body in post request")
            return apache.HTTP_BAD_REQUEST

        # Decode the request; avoid logging crappy responses
        try:
            params, method = self.decode(_body)
        except xmlrpclib.ResponseError:
            log_error("Got bad XML-RPC blob of len = %d" % len(_body))
            return apache.HTTP_BAD_REQUEST
        else:
            if params is None:
                params = ()
        # make the actual function call and return the result
        return self.call_function(method, params)


class apacheGET:

    def __init__(self, client_version, req):
        # extract the server we're talking to and the root directory
        # from the request configuration options
        req_config = req.get_options()
        self.server = req_config["SERVER"]
        # XXX: some day we're going to trust the timestamp stuff...
        self.handler_classes = rhnImport.load("server/handlers",
                                              interface_signature='getHandler')
        log_debug(3, "Handler classes", self.handler_classes)

        self.handler = None
        if self.server not in self.handler_classes:
            raise HandlerNotFoundError(self.server)

        handler_class = self.handler_classes[self.server]
        if handler_class is None:
            # Was set just so that we make the logs quiet
            raise HandlerNotFoundError(self.server)
        log_debug(3, "Handler class", handler_class, type(handler_class))
        self.handler = handler_class(client_version, req)

    def __getattr__(self, name):
        return getattr(self.handler, name)


class GetHandler(apacheRequest):
    # we require our own init since we depend on a channel

    def __init__(self, client_version, req):
        apacheRequest.__init__(self, client_version, req)
        self.channel = None

    def _setup_servers(self):
        # Nothing to do here
        pass

    # get a function reference for the GET request
    def method_ref(self, method):
        log_debug(3, self.server, method)

        # Init the repository
        server_id = rhnFlags.get("AUTH_SESSION_TOKEN")['X-RHN-Server-Id']
        username = rhnFlags.get("AUTH_SESSION_TOKEN")['X-RHN-Auth-User-Id']
        repository = rhnRepository.Repository(self.channel, server_id,
                                              username)
        repository.set_qos()
        meth = method.replace('.', '_')
        f = repository.get_function(meth)
        if f is None:
            raise UnknownXML("function '%s' invalid; path_info is %s" % (
                method, self.req.path_info))
        return f

    # handle the GET requests
    def process(self):
        log_debug(3)
        # Query repository; only after a clients signature has been
        # authenticated.

        try:
            method, params = self._get_method_params()
        except rhnFault:
            f = sys.exc_info()[1]
            log_debug(2, "Fault caught")
            response = f.getxml()
            self.response(response)
            return apache.HTTP_NOT_FOUND
        except Exception as exc:
            e = sys.exc_info()[1]
            rhnSQL.rollback()
            # otherwise we do a full stop
            Traceback(method, self.req, severity="unhandled")
            return apache.HTTP_INTERNAL_SERVER_ERROR
        # make the actual function call and return the result
        return self.call_function(method, params)

    def _get_method_params(self):
        # Returns the method name and params for this call

        # Split the request into parts
        array = self.req.path_info.split('/')
        if len(array) < 4:
            log_error("Invalid URI for GET request", self.req.path_info)
            raise rhnFault(21, _("Invalid URI %s" % self.req.path_info))

        self.channel, method = (array[2], array[3])
        if method == "getPackage":
            params = tuple([os.path.join(*array[4:])])
        else:
            params = tuple(array[4:])
        return method, params

    # send the response out for the GET requests
    def response(self, response):
        log_debug(3)
        # pkilambi:if redirectException caught returns path(<str>)
        if isinstance(response, str):
            method, params = self._get_method_params()
            if method == "getPackage":
                return self.redirect(self.req, response)

        # GET requests resulting in a Fault receive special treatment
        # since we have to stick the error message in the HTTP header,
        # and to return an Apache error code

        if isinstance(response, xmlrpclib.Fault):
            log_debug(4, "Return FAULT",
                      response.faultCode, response.faultString)
            retcode = apache.HTTP_NOT_FOUND
            if abs(response.faultCode) in (33, 34, 35, 37, 39, 41):
                retcode = apache.HTTP_UNAUTHORIZED

            self.req.headers_out["X-RHN-Fault-Code"] = \
                str(response.faultCode)
            faultString = base64.encodestring(response.faultString.encode()).decode().strip()
            # Split the faultString into multiple lines
            for line in faultString.split('\n'):
                self.req.headers_out.add("X-RHN-Fault-String",
                                             line.strip())
            # And then send all the other things
            for k, v in list(rhnFlags.get('outputTransportOptions').items()):
                setHeaderValue(self.req.headers_out, k, v)
            return retcode
        # Otherwise we're pretty much fine with the standard response
        # handler

        # Copy the fields from the transport options, if necessary
        for k, v in list(rhnFlags.get('outputTransportOptions').items()):
            setHeaderValue(self.req.headers_out, k, v)
        # and jump into the base handler
        return apacheRequest.response(self, response)

    # pkilambi: redirect request back to client with edge network url
    def redirect(self, req, url, temporary=1):
        log_debug(3, "url input to redirect is ", url)
        if req.sent_bodyct:
            raise IOError("Cannot redirect after headers have already been sent.")

        # akamize the url with the new tokengen before sending the redirect response
        import tokengen.Generator
        arl = tokengen.Generator.generate_auth_url(url)
        req.headers_out["Location"] = arl
        log_debug(3, "Akamized url to redirect is ", arl)
        if temporary:
            req.status = apache.HTTP_MOVED_TEMPORARILY
        else:
            req.status = apache.HTTP_MOVED_PERMANENTLY
        return req.status
 0707010000014A000081B40000000000000000000000015FBBE8EE00000547000000000000000000000000000000000000002900000000spacewalk-backend/server/apacheServer.py  #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

# global module imports
from spacewalk.common import apache

# common module imports
from spacewalk.common.rhnConfig import CFG, initCFG
from spacewalk.common.rhnTB import Traceback
from spacewalk.common.rhnLog import initLOG, log_setreq

from .apacheHandler import apacheHandler
apache_server = apacheHandler()
HeaderParserHandler = apache_server.headerParserHandler
Handler = apache_server.handler
CleanupHandler = apache_server.cleanupHandler
LogHandler = apache_server.logHandler


# Instantiate external entry points:
#HeaderParserHandler = HandlerWrap("headerParserHandler", init=1)
#Handler             = HandlerWrap("handler")
#CleanupHandler      = HandlerWrap("cleanupHandler")
#LogHandler          = HandlerWrap("logHandler")
 0707010000014B000081B40000000000000000000000015FBBE8EE00001695000000000000000000000000000000000000002F00000000spacewalk-backend/server/apacheUploadServer.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

import sys
from spacewalk.common import apache

from . import rhnSession

from spacewalk.common import rhnFlags
from spacewalk.common.rhnLog import log_debug, log_error, log_setreq, initLOG
from spacewalk.common.rhnConfig import CFG, initCFG
from spacewalk.common.rhnException import rhnFault
from spacewalk.common.rhnTB import Traceback
from spacewalk.server import rhnImport


class UploadHandler:

    def __init__(self):
        self.servers = {}
        self.server = None

    def headerParserHandler(self, req):
        log_setreq(req)
        # init configuration options with proper component
        options = req.get_options()
        # if we are initializing out of a <Location> handler don't
        # freak out
        if "RHNComponentType" not in options:
            # clearly nothing to do
            return apache.OK
        initCFG(options["RHNComponentType"])
        initLOG(CFG.LOG_FILE, CFG.DEBUG)
        if req.method == 'GET':
            # This is the ping method
            return apache.OK
        self.servers = rhnImport.load("upload_server/handlers",
                                      interface_signature='upload_class')
        if 'SERVER' not in options:
            log_error("SERVER not set in the apache config files!")
            return apache.HTTP_INTERNAL_SERVER_ERROR
        server_name = options['SERVER']
        if server_name not in self.servers:
            log_error("Unable to load server %s from available servers %s" %
                      (server_name, self.servers))
            return apache.HTTP_INTERNAL_SERVER_ERROR
        server_class = self.servers[server_name]
        self.server = server_class(req)
        return self._wrapper(req, "headerParserHandler")

    def handler(self, req):
        if req.method == 'GET':
            # This is the ping method
            log_debug(1, "GET method received, returning")
            req.headers_out['Content-Length'] = '0'
            # pkilambi:check for new version of rhnpush to differentiate
            # new sats from old satellites.
            req.headers_out['X-RHN-Check-Package-Exists'] = '1'
            req.send_http_header()
            return apache.OK
        return self._wrapper(req, "handler")

    def cleanupHandler(self, req):
        if req.method == 'GET':
            # This is the ping method
            return apache.OK
        retval = self._wrapper(req, "cleanupHandler")
        # Reset the logger to stderr
        initLOG()
        self.server = None
        return retval

    def logHandler(self, req):
        if req.method == 'GET':
            # This is the ping method
            return apache.OK
        retval = self._wrapper(req, "logHandler")
        return retval

    def _wrapper(self, req, function_name):
        #log_debug(1, "_wrapper", req, function_name)
        if not hasattr(self.server, function_name):
            log_error("%s doesn't have a %s function" %
                      (self.server, function_name))
            return apache.HTTP_NOT_FOUND
        function = getattr(self.server, function_name)
        try:
            log_debug(5, "Calling", function)
            ret = function(req)
        except rhnFault:
            e = sys.exc_info()[1]
            log_debug(4, "rhnFault caught: %s" % (e, ))
            error_string = self._exception_to_text(e)
            error_code = e.code
            self._error_to_headers(req.err_headers_out, error_code, error_string)
            ret = rhnFlags.get("apache-return-code")
            if not ret:
                ret = apache.HTTP_INTERNAL_SERVER_ERROR
            req.status = ret
            log_debug(4, "_wrapper %s exited with apache code %s" %
                      (function_name, ret))
        except rhnSession.ExpiredSessionError:
            e = sys.exc_info()[1]
            # if session expires we catch here and return a forbidden
            # abd make it re-authenticate
            log_debug(4, "Expire Session Error Caught: %s" % (e, ))
            return 403
        except:
            Traceback("server.apacheUploadServer._wrapper", req=req)
            log_error("Unhandled exception")
            return apache.HTTP_INTERNAL_SERVER_ERROR
        return ret

    # Adds an error code and error string to the headers passed in
    def _error_to_headers(self, headers, error_code, error_string):
        error_string = error_string.strip()
        import base64
        error_string = base64.encodestring(error_string.encode()).decode().strip()
        for line in error_string.split('\n'):
            headers.add(self.server.error_header_prefix + '-String', line.strip())
        headers[self.server.error_header_prefix + '-Code'] = str(error_code)

    def _exception_to_text(self, exception):
        return """\
Error Message:
    %s
Error Class Code: %s
Error Class Info: %s
""" % (exception.text.strip(), exception.code,
            exception.arrayText.rstrip())

# Instantiate external entry points:
apache_server = UploadHandler()

HeaderParserHandler = apache_server.headerParserHandler
Handler = apache_server.handler
CleanupHandler = apache_server.cleanupHandler
LogHandler = apache_server.logHandler
   0707010000014C000081B40000000000000000000000015FBBE8EE000010AF000000000000000000000000000000000000002E00000000spacewalk-backend/server/basePackageUpload.py #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

from rhn.UserDictCase import UserDictCase

from spacewalk.common import apache
from spacewalk.common.rhnLog import log_debug
from spacewalk.common.rhnException import rhnFault


class BasePackageUpload:

    def __init__(self, req):
        self.header_prefix = "X-RHN-Upload"
        self.error_header_prefix = 'X-RHN-Upload-Error'
        self.prefix = 'rhn/repository'
        self.is_source = 0
        self.rel_package_path = None
        self.package_path = None
        self.required_fields = [
            "Package-Name",
            "Package-Version",
            "Package-Release",
            "Package-Arch",
            "File-Checksum",
            "File-Checksum-Type",
        ]
        self.field_data = UserDictCase()
        self.org_id = None

    def headerParserHandler(self, req):
        """ This whole function is ugly as hell. The Auth field in the header used to be required, but now
            it must have either the Auth field or the Auth-Session field.
        """
        # Initialize the logging
        log_debug(3, "Method", req.method)

        # Header string. This is what the Auth-Session field will look like in the header.
        session_header = "%s-%s" % (self.header_prefix, "Auth-Session")

        # legacy rhnpush sends File-MD5sum; translate it into File-Checksum
        md5sum_header = "%s-%s" % (self.header_prefix, "File-MD5sum")
        if md5sum_header in req.headers_in:
            req.headers_in["%s-%s" % (self.header_prefix, "File-Checksum-Type")] = 'md5'
            req.headers_in["%s-%s" % (self.header_prefix, "File-Checksum")] = \
                req.headers_in[md5sum_header]

        for f in self.required_fields:
            hf = "%s-%s" % (self.header_prefix, f)
            if hf not in req.headers_in:
                # If the current field is Auth and Auth-Session field isn't present, something is wrong.
                if f == "Auth" and (session_header not in req.headers_in):
                    log_debug(4, "Required field %s missing" % f)
                    raise rhnFault(500, f)

                # The current field is Auth and the Auth-Session field is present, so everything is good.
                elif f == "Auth" and (session_header in req.headers_in):
                    self.field_data["Auth-Session"] = req.headers_in[session_header]
                    continue

                # The current field being looked for isn't the Auth field and it's missing, so something is wrong.
                else:
                    log_debug(4, "Required field %s missing" % f)
                    raise rhnFault(500, f)

            if not (f == "Auth" and (hf not in req.headers_in)):
                self.field_data[f] = req.headers_in[hf]
            else:
                if session_header in req.headers_in:
                    self.field_data[f] = req.headers_in[hf]

        self.package_name = self.field_data["Package-Name"]
        self.package_version = self.field_data["Package-Version"]
        self.package_release = self.field_data["Package-Release"]
        self.package_arch = self.field_data["Package-Arch"]
        self.file_checksum_type = self.field_data["File-Checksum-Type"]
        self.file_checksum = self.field_data["File-Checksum"]
        # 4/18/05 wregglej. if 1051 is in the header's keys, then it's a nosrc package.
        self.is_source = (self.package_arch == 'src' or self.package_arch == 'nosrc')
        return apache.OK

    def handler(self, req):
        log_debug(3, "Method", req.method)
        return apache.OK

    def cleanupHandler(self, req):
        return apache.OK

    def logHandler(self, req):
        return apache.OK
 0707010000014D000081B40000000000000000000000015FBBE8EE00004E17000000000000000000000000000000000000002F00000000spacewalk-backend/server/configFilesHandler.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Config file handler (base class)
#

import base64
import os
try:
    #  python 2
    import xmlrpclib
except ImportError:
    #  python3
    import xmlrpc.client as xmlrpclib
import sys
import hashlib

from uyuni.common.usix import raise_with_tb
from spacewalk.common import rhnFlags
from spacewalk.common.rhnLog import log_debug
from spacewalk.common.rhnConfig import CFG
from uyuni.common.checksum import getStringChecksum
from spacewalk.common.rhnException import rhnFault, rhnException

from spacewalk.server import rhnSQL, rhnUser, rhnCapability
from spacewalk.server.rhnHandler import rhnHandler

from spacewalk.server.config_common.templated_document import ServerTemplatedDocument, var_interp_prep


from . import rhnSession

# Exceptions


class BaseConfigFileError(Exception):

    def __init__(self, args):
        Exception.__init__(self, *args)


class ConfigFileError(BaseConfigFileError):

    def __init__(self, file, *args):
        BaseConfigFileError.__init__(self, args)
        self.file = file


class ConfigFileExistsError(ConfigFileError):
    pass


class ConfigFileVersionMismatchError(ConfigFileError):
    pass


class ConfigFileMissingDelimError(ConfigFileError):
    pass


class ConfigFileMissingInfoError(ConfigFileError):
    pass


class ConfigFileMissingContentError(ConfigFileError):
    pass


class ConfigFileTooLargeError(ConfigFileError):
    pass


class ConfigFileExceedsQuota(ConfigFileError):
    pass


class ConfigFilePathIncomplete(ConfigFileError):
    pass

# Base handler class


class ConfigFilesHandler(rhnHandler):

    def __init__(self):
        log_debug(3)
        rhnHandler.__init__(self)
        self.functions = {
            'rhn_login': 'login',
            'test_session': 'test_session',
            'max_upload_fsize': 'max_upload_file_size',
        }
        self.org_id = None

    # Returns a reference to a callable method
    def get_function(self, function):
        if function not in self.functions:
            return None

        # Turn compression on by default
        rhnFlags.set('compress_response', 1)
        return getattr(self, self.functions[function])

    # returns max filesize that will be uploaded
    def max_upload_file_size(self):
        return self._get_maximum_file_size()

    # Generic login function
    def login(self, dict):
        log_debug(1)
        username = dict.get('username')
        password = dict.get('password')
        self.user = rhnUser.search(username)
        if not self.user or not (self.user.check_password(password)):
            raise rhnFault(2)
        if rhnUser.is_user_disabled(username):
            msg = _("""
                   %s Account has been deactivated on this server.
                   Please contact your Org administrator for more help.""")
            raise rhnFault(1, msg % username, explain=0)

        # Good to go
        session = self.user.create_session()
        return session.get_session()

    def test_session(self, dict):
        log_debug(3)

        try:
            self._validate_session(dict.get('session'))
        except (rhnSession.InvalidSessionError, rhnSession.ExpiredSessionError):
            return 0

        return 1

    # Helper functions
    def _get_delimiters(self):
        return {
            'delim_start': CFG.config_delim_start,
            'delim_end': CFG.config_delim_end,
        }

    def _validate_session(self, session):
        # session_reload will toss an exception if the session
        # token is invalid... I guess we're letting it percolate
        # up...
        # --bretm
        self.user = rhnUser.session_reload(session)
        self.org_id = self.user.contact['org_id']
        self._check_user_role()

    def _check_user_role(self):
        pass

    def _is_file(self, file):
        return str(file['config_file_type_id']) == '1'

    def _is_link(self, file):
        return str(file['config_file_type_id']) == '3'

    _query_current_selinux_lookup = rhnSQL.Statement("""
       select ci.selinux_ctx from rhnConfigInfo ci, rhnConfigRevision cr, rhnConfigFile cf
       where ci.id = cr.config_info_id
         and cf.id = cr.config_file_id
         and cf.config_file_name_id = lookup_config_filename(:path)
         and cr.revision = (
           select max(mcr.revision) from rhnConfigRevision mcr, rhnConfigFile mcf
           where mcf.id = mcr.config_file_id
             and mcf.config_file_name_id = cf.config_file_name_id
      )
    """)

    def _push_file(self, config_channel_id, file):
        if not file:
            # Nothing to do
            return {}

        # Check for full path on the file
        path = file.get('path')
        if not (path[0] == os.sep):
            raise ConfigFilePathIncomplete(file)

        if 'config_file_type_id' not in file:
            log_debug(4, "Client does not support config directories, so set file_type_id to 1")
            file['config_file_type_id'] = '1'
        # Check if delimiters are present
        if self._is_file(file) and \
           not (file.get('delim_start') and file.get('delim_end')):
            # Need delimiters
            raise ConfigFileMissingDelimError(file)

        if not (file.get('user') and file.get('group') and
                file.get('mode') is not None) and not self._is_link(file):
            raise ConfigFileMissingInfoError(file)

        # Oracle doesn't like certain binding variables
        file['username'] = file.get('user', '')
        file['groupname'] = file.get('group', '')
        file['file_mode'] = str(file.get('mode', ''))
        # if the selinux flag is not sent by the client it is set to the last file
        # revision (or to None (i.e. NULL) in case of first revision) - see the bug
        # 644985 - SELinux context cleared from RHEL4 rhncfg-client
        file['selinux_ctx'] = file.get('selinux_ctx', None)
        if not file['selinux_ctx']:
            # RHEL4 or RHEL5+ with disabled selinux - set from the last revision
            h = rhnSQL.prepare(self._query_current_selinux_lookup)
            h.execute(**file)
            row = h.fetchone_dict()
            if row:
                file['selinux_ctx'] = row['selinux_ctx']
            else:
                file['selinux_ctx'] = None
        result = {}

        try:

            if self._is_file(file):
                self._push_contents(file)
            elif self._is_link(file):
                file['symlink'] = file.get('symlink') or ''
        except ConfigFileTooLargeError:
            result['file_too_large'] = 1

        t = rhnSQL.Table('rhnConfigFileState', 'label')
        state_id_alive = t['alive']['id']

        file['state_id'] = state_id_alive
        file['config_channel_id'] = config_channel_id

        try:
            self._push_config_file(file)
            self._push_revision(file)
        except rhnSQL.SQLSchemaError:
            e = sys.exc_info()[1]
            log_debug(4, "schema error", e)
            rhnSQL.rollback()  # blow away the contents that got inserted
            if e.errno == 20267:
                # ORA-20267: (not_enough_quota) - Insufficient available quota
                # for the specified action
                raise ConfigFileExceedsQuota(file)
            raise

        return {}

    # A wrapper around _push_file, that also catches exceptions
    def push_file(self, config_channel_id, file):
        try:
            result = self._push_file(config_channel_id, file)
        except ConfigFilePathIncomplete:
            e = sys.exc_info()[1]
            raise_with_tb(rhnFault(4015, "Full path of file '%s' must be specified" % e.file.get('path'),
                          explain=0), sys.exc_info()[2])

        except ConfigFileExistsError:
            e = sys.exc_info()[1]
            raise_with_tb(rhnFault(4013, "File %s already uploaded" % e.file.get('path'),
                          explain=0), sys.exc_info()[2])
        except ConfigFileVersionMismatchError:
            e = sys.exc_info()[1]
            raise_with_tb(rhnFault(4012, "File %s uploaded with a different "
                           "version" % e.file.get('path'), explain=0), sys.exc_info()[2])
        except ConfigFileMissingDelimError:
            e = sys.exc_info()[1]
            raise_with_tb(rhnFault(4008, "Delimiter not specified for file %s" %
                           e.file.get('path'), explain=0), sys.exc_info()[2])
        except ConfigFileMissingContentError:
            e = sys.exc_info()[1]
            raise_with_tb(rhnFault(4007, "No content sent for file %s" %
                           e.file.get('path'), explain=0), sys.exc_info()[2])
        except ConfigFileExceedsQuota:
            e = sys.exc_info()[1]
            raise_with_tb(rhnFault(4014, "File size of %s exceeds free quota space" %
                           e.file.get('path'), explain=0), sys.exc_info()[2])
        except ConfigFileTooLargeError:
            e = sys.exc_info()[1]
            raise_with_tb(rhnFault(4003, "File size of %s larger than %s bytes" %
                                         (e.file.get('path'), self._get_maximum_file_size()),
                                   explain=0), sys.exc_info()[2])

        rhnSQL.commit()
        return result

    _query_content_lookup = rhnSQL.Statement("""
        select cc.id, cv.checksum_type, cv.checksum, file_size, contents, is_binary, delim_start, delim_end
          from rhnConfigContent cc, rhnChecksumView cv
         where cv.checksum = :checksum
           and cv.checksum_type = :checksum_type
           and file_size = :file_size
           and checksum_id = cv.id
    """)

    _query_insert_content = rhnSQL.Statement("""
        insert into rhnConfigContent
               (id, checksum_id, file_size, contents, is_binary, delim_start, delim_end)
        values (:config_content_id, lookup_checksum(:checksum_type, :checksum),
                :file_size, :contents, :is_binary, :delim_start, :delim_end)
    """)

    def _push_contents(self, file):

        checksum_type = 'sha256'  # FIXME: this should be configuration option

        file['file_size'] = 0
        file['is_binary'] = 'N'

        file_path = file.get('path')
        file_contents = file.get('file_contents') or ''

        if 'enc64' in file and file_contents:
            file_contents = base64.decodestring(file_contents.encode())

        if 'config_file_type_id' not in file:
            log_debug(4, "Client does not support config directories, so set file_type_id to 1")
            file['config_file_type_id'] = '1'

        file['checksum_type'] = checksum_type
        file['checksum'] = getStringChecksum(checksum_type, file_contents or '')

        if file_contents:
            file['file_size'] = len(file_contents)

            if file['file_size'] > self._get_maximum_file_size():
                raise ConfigFileTooLargeError(file_path, file['file_size'])

            # Is the content binary data?
            # XXX We may need a heuristic; this is what the web site does, and we
            # have to be consistent
            # XXX Yes this is iterating over a string
            try:
                file_contents.decode('UTF-8')
            except Exception:
                file['is_binary'] = 'Y'

        h = rhnSQL.prepare(self._query_content_lookup)
        h.execute(**file)
        row = h.fetchone_dict()

        if row:
            db_contents = rhnSQL._fix_encoding(rhnSQL.read_lob(row['contents']) or '')
            if file_contents == db_contents:
                # Same content
                file['config_content_id'] = row['id']
                log_debug(5, "same content")
                return

        # We have to insert a new file now
        content_seq = rhnSQL.Sequence('rhn_confcontent_id_seq')
        config_content_id = content_seq.next()
        file['config_content_id'] = config_content_id
        file['contents'] = file_contents

        h = rhnSQL.prepare(self._query_insert_content,
                           blob_map={'contents': 'contents'})
        h.execute(**file)

    _query_lookup_symlink_config_info = rhnSQL.Statement("""
        select lookup_config_info(null, null, null, :selinux_ctx, lookup_config_filename(:symlink)) id
          from dual
    """)

    _query_lookup_non_symlink_config_info = rhnSQL.Statement("""
        select lookup_config_info(:username, :groupname, :file_mode, :selinux_ctx, null) id
          from dual
    """)

    _query_lookup_config_file = rhnSQL.Statement("""
        select id
          from rhnConfigFile
         where config_channel_id = :config_channel_id
           and config_file_name_id = lookup_config_filename(:path)
    """)

    def _push_config_file(self, file):
        config_info_query = self._query_lookup_non_symlink_config_info
        if self._is_link(file) and file.get("symlink"):
            config_info_query = self._query_lookup_symlink_config_info

        # Look up the config info first
        h = rhnSQL.prepare(config_info_query)
        h.execute(**file)
        row = h.fetchone_dict()
        if not row:
            # Hmm
            raise rhnException("This query should always return a row")
        config_info_id = row['id']
        file['config_info_id'] = config_info_id

        # Look up the config file itself
        h = rhnSQL.prepare(self._query_lookup_config_file)
        h.execute(**file)
        row = h.fetchone_dict()
        if row:
            # Yay we already have this file
            # Later down the road, we're going to update modified for this
            # table
            file['config_file_id'] = row['id']
            return

        # Have to insert this config file, gotta use the api to keep quotas up2date...
        insert_call = rhnSQL.Function("rhn_config.insert_file",
                                      rhnSQL.types.NUMBER())
        file['config_file_id'] = insert_call(file['config_channel_id'], file['path'])

    _query_lookup_revision = rhnSQL.Statement("""
        select id, revision, config_content_id, config_info_id,
               config_file_type_id
          from rhnConfigRevision
         where config_file_id = :config_file_id
         order by revision desc
    """)

    def _push_revision(self, file):
        # Assume we don't have any revision for now
        file['revision'] = 1
        h = rhnSQL.prepare(self._query_lookup_revision)
        h.execute(**file)
        row = h.fetchone_dict()
        if row:
            # Is it the same revision as this one?

            fields = ['config_content_id', 'config_info_id', 'config_file_type_id']

            if 'config_file_type_id' not in file:
                log_debug(4, "Client does not support config directories, so set file_type_id to 1")
                file['config_file_type_id'] = '1'

            for f in fields:
                if file.get(f) != row.get(f):
                    break
            else:  # for
                # All fields are equal
                file['config_revision_id'] = row['id']
                self._update_revision(file)
                self._update_config_file(file)
                return

            # A revision already exists, but it's different. Just update the
            # revision number

            revision = row['revision'] + 1
            file['revision'] = revision

        # If we got here, we need a new revision
        self._insert_revision(file)

        if self.user and hasattr(self.user, 'getid'):
            self._add_author(file, self.user)
        self._update_config_file(file)

    _query_update_revision = rhnSQL.Statement("""
        update rhnConfigRevision
           set modified = current_timestamp
         where id = :config_revision_id
    """)

    def _update_revision(self, file):
        h = rhnSQL.prepare(self._query_update_revision)
        h.execute(**file)

    def _insert_revision(self, file):
        insert_call = rhnSQL.Function("rhn_config.insert_revision",
                                      rhnSQL.types.NUMBER())
        file['config_revision_id'] = insert_call(file['revision'],
                                                 file['config_file_id'],
                                                 file.get('config_content_id', None),
                                                 file['config_info_id'],
                                                 file['config_file_type_id'])

    _query_update_revision_add_author = rhnSQL.Statement("""
        update rhnConfigRevision
            set changed_by_id = :user_id
        where id = :rev_id
    """)

    def _add_author(self, file, author):
        h = rhnSQL.prepare(self._query_update_revision_add_author)
        h.execute(user_id=author.getid(), rev_id=file['config_revision_id'])

    _query_update_config_file = rhnSQL.Statement("""
        update rhnConfigFile
           set latest_config_revision_id = :config_revision_id,
               state_id = :state_id
         where config_channel_id = :config_channel_id
           and config_file_name_id = lookup_config_filename(:path)
    """)

    def _update_config_file(self, file):
        h = rhnSQL.prepare(self._query_update_config_file)
        h.execute(**file)

    def _format_file_results(self, row):
        server = None
        if self.server:
            server = var_interp_prep(self.server)

        return format_file_results(row, server=server)

    def _get_maximum_file_size(self):
        return CFG.maximum_config_file_size

    def new_config_channel_id(self):
        return rhnSQL.Sequence('rhn_confchan_id_seq').next()


def format_file_results(row, server=None):
    encoding = ''
    contents = None
    contents = rhnSQL._fix_encoding(rhnSQL.read_lob(row['file_contents']) or '')
    checksum = row['checksum'] or ''

    if server and (row['is_binary'] == 'N') and contents:

        interpolator = ServerTemplatedDocument(server,
                                               start_delim=row['delim_start'],
                                               end_delim=row['delim_end'])
        contents = interpolator.interpolate(contents)
        if row['checksum_type']:
            checksummer = hashlib.new(row['checksum_type'])
            checksummer.update(contents.encode())
            checksum = checksummer.hexdigest()

    if contents:
        client_caps = rhnCapability.get_client_capabilities()
        if client_caps and 'configfiles.base64_enc' in client_caps:
            encoding = 'base64'
            contents = base64.encodestring(contents.encode()).decode()
    if row.get('modified', False):
        m_date = xmlrpclib.DateTime(str(row['modified']))
    else:
        m_date = ''

    return {
        'path': row['path'],
        'config_channel': row['config_channel'],
        'file_contents': contents,
        'symlink': row['symlink'] or '',
        'checksum_type': row['checksum_type'] or '',
        'checksum': checksum,
        'verify_contents': True,
        'delim_start': row['delim_start'] or '',
        'delim_end': row['delim_end'] or '',
        'revision': row['revision'] or '',
        'username': row['username'] or '',
        'groupname': row['groupname'] or '',
        'filemode': row['filemode'] or '',
        'encoding': encoding or '',
        'filetype': row['label'],
        'selinux_ctx': row['selinux_ctx'] or '',
        'modified': m_date,
        'is_binary': row['is_binary'] or '',
    }
 0707010000014E000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002700000000spacewalk-backend/server/config_common    0707010000014F000081B40000000000000000000000015FBBE8EE000000BB000000000000000000000000000000000000003000000000spacewalk-backend/server/config_common/Makefile   # Makefile for the config-common module
#

TOP	= ../..
SUBDIR	= server/config_common

SPACEWALK_FILES	= __init__ base_templated_document templated_document

include $(TOP)/Makefile.defs

 07070100000150000081B40000000000000000000000015FBBE8EE00000273000000000000000000000000000000000000003300000000spacewalk-backend/server/config_common/__init__.py    #
# Copyright (c) 2008--2013 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

__all__ = []
 07070100000151000081B40000000000000000000000015FBBE8EE00001735000000000000000000000000000000000000004200000000spacewalk-backend/server/config_common/base_templated_document.py #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Templating code for the configuration management project
#

import re
import sys

from spacewalk.common.rhnLog import log_error


class BaseTemplatedDocument:
    compiled_regexes = {}

    def __init__(self, start_delim=None, end_delim=None):
        self.start_delim = None
        self.end_delim = None
        self.set_delims(start_delim, end_delim)
        self.functions = {}
        # To be overridden in a child class
        self.set_functions()

    def set_functions(self):
        pass

    def set_delims(self, start_delim=None, end_delim=None):
        if '%' in (start_delim, end_delim):
            raise ValueError("Cannot use `%' as a delimiter")
        if self.start_delim is None and start_delim is None:
            start_delim = '{{'
        if self.start_delim is None or start_delim is not None:
            self.start_delim = start_delim
        # if start_delim is None and self.start_denim is set, don't overwrite

        if self.end_delim is None and end_delim is None:
            end_delim = '{{'
        if self.end_delim is None or end_delim is not None:
            self.end_delim = end_delim

        # delims might have special characters that are regexp-relevant,
        # need to escape those
        escaped_start_delim = re.escape(self.start_delim)
        escaped_end_delim = re.escape(self.end_delim)

        regex_key = (self.start_delim, self.end_delim)

        # At this point, self.start_delim and self.end_delim are non-null
        if regex_key in self.compiled_regexes:
            # We already have the regex compiled
            self.regex = self.compiled_regexes[regex_key]
            return

        # We have to convince .* to match as few repetitions as possible,
        # otherwise it's possible to match end_delims too; using .*? then
        self.regex = re.compile(escaped_start_delim + r"(.*?)" + escaped_end_delim)
        self.compiled_regexes[regex_key] = self.regex

        self.compiled_regexes[self.start_delim] = re.compile("(%s)" % escaped_start_delim)
        self.compiled_regexes[self.end_delim] = re.compile("(%s)" % escaped_end_delim)

    def repl_func(self, match_object):
        try:
            return self._repl_func(match_object)
        except ValueError:
            e = sys.exc_info()[1]
            log_error("cfg variable interpolation error", e)
            return match_object.group()

    def _repl_func(self, match_object):
        return ""

    def interpolate(self, data):
        return self.regex.sub(self.repl_func, data)


class TemplatedDocument(BaseTemplatedDocument):
    func_regex = re.compile("^(?P<fname>[^=]+)(=(?P<defval>.*))?$")
    funcname_regex = re.compile("^[A-Za-z][\w._]*$")

    def _repl_func(self, match_object):
        funcname = match_object.groups()[0]
        funcname = funcname.strip()
        fname, params, defval = self.parse_func_name(funcname)
        return self.call(fname, params, defval)

    def parse_func_name(self, fstr):
        mo = self.func_regex.match(fstr)
        if not mo:
            # XXX raise exceptions
            return (None, None, None)
        dict = mo.groupdict()
        fname = dict.get('fname')
        defval = dict.get('defval')

        fname = self.strip(fname)
        defval = self.unquote(defval)
        params = None

        if fname[-1] == ')':
            # Params are present
            i = fname.rfind('(')
            if i < 0:
                raise ValueError("Missing (")

            params = fname[i + 1:-1]
            fname = fname[:i].strip()

            # Parse the params
            params = list(map(self.unquote, [_f for _f in params.split(',') if _f]))

        # Validate the function name
        if not self.funcname_regex.match(fname):
            raise ValueError("Invalid function name %s" % fname)

        return fname, params, defval

    def null_call(self, fname, params, defval):
        val = fname
        if params:
            val = "%s(%s)" % (val, ', '.join(params))
        if defval is not None:
            val = "%s = %s" % (val, defval)
        return "%s %s %s" % (self.start_delim, val, self.end_delim)

    def lookup_function(self, fname):
        return self.functions.get(fname)

    def call(self, fname, params, defval):
        f = self.lookup_function(fname)
        if f is None:
            return str(self.fallback_call(fname, params, defval))
        if params is None:
            params = ()

        result = f(*params)

        if result is None:
            if defval:
                return defval
            return ''

        return str(result)

    # What to do when the function was not found?
    # To be overridden in subclasses
    def fallback_call(self, fname, params, defval):
        raise InvalidFunctionError(fname)

    def test(self):
        escaped = self.regex.sub(self.repl_func, 'abc @@ aa @@ def')
        print(escaped)

    def strip(self, s):
        if s is None:
            return None
        return s.strip()

    def unquote(self, s):
        if s is None:
            return None
        s = s.strip()
        if len(s) <= 1:
            # Nothing to unquote
            return s

        if s[0] == s[-1] and s[0] in ['"', "'"]:
            # Strip quotes
            return s[1:-1]

        return s


class InvalidFunctionError(Exception):
    pass
   07070100000152000081B40000000000000000000000015FBBE8EE00001AD5000000000000000000000000000000000000003D00000000spacewalk-backend/server/config_common/templated_document.py  #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
#

from .base_templated_document import TemplatedDocument

from spacewalk.common.rhnLog import log_debug

from spacewalk.server.rhnServer.server_hardware import NetIfaceInformation

RHN_PREFIX = 'rhn.system.'


def var_interp_prep(server):
    # make sure we have the necessary data in the server obj
    server.reload_hardware_byid(server.getid())
    server.load_custom_info()
    return server


class ServerTemplatedDocument(TemplatedDocument):

    def __init__(self, server, start_delim=None, end_delim=None):
        TemplatedDocument.__init__(self, start_delim=start_delim, end_delim=end_delim)

        self.server = server

    def fallback_call(self, fname, params, defval):
        # Re-compose the macro if we don't know the function
        return self.null_call(fname, params, defval)

    def set_functions(self):
        self.functions.clear()
        self.functions.update({
            RHN_PREFIX + 'sid': self.sid,
            RHN_PREFIX + 'profile_name': self.profile_name,
            RHN_PREFIX + 'description': self.description,
            RHN_PREFIX + 'hostname': self.hostname,
            RHN_PREFIX + 'ip_address': self.ipaddr,
            RHN_PREFIX + 'ip6_address': self.ip6addr,
            RHN_PREFIX + 'custom_info': self.custom_info,
            RHN_PREFIX + 'net_interface.ip_address': self.net_intf_ipaddr,
            RHN_PREFIX + 'net_interface.netmask': self.net_intf_netmask,
            RHN_PREFIX + 'net_interface.broadcast': self.net_intf_broadcast,
            RHN_PREFIX + 'net_interface.hardware_address': self.net_intf_hwaddr,
            RHN_PREFIX + 'net_interface.driver_module': self.net_intf_module,
            RHN_PREFIX + 'net_interface.ip6_address': self.net_intf_ip6addr,
            RHN_PREFIX + 'net_interface.ip6_netmask': self.net_intf_ip6netmask,
        })

    #######################
    # HANDLER FUNCTIONS
    #
    # If any of these can't come up w/ a good value, they should return None
    # If None is returned, the default value will be used if provided
    # Otherwise, the empty string '' will be substituted
    def sid(self):
        return self.server.server['id']

    def profile_name(self):
        return self.server.server['name']

    def description(self):
        return self.server.server['description']

    def hostname(self):
        return self.server.server['hostname']

    def ipaddr(self):
        return self.server.addr['ipaddr']

    def ip6addr(self):
        return self.server.addr['ip6addr']

    def custom_info(self, key):
        if self.server.custom_info is None:
            log_debug(4, "no custom info", self.server)
            raise "didn't load custom info"

        if key in self.server.custom_info:
            return self.server.custom_info[key]

        return None

    def _interface_info(self, interface_name):
        infos = self.server.hardware_by_class(NetIfaceInformation)
        if infos:
            network_interfaces = infos[0].db_ifaces
        else:
            return None

        for iface in network_interfaces:
            if iface['name'] == interface_name:
                return iface
        return None

    def net_intf_ipaddr(self, interface_name):
        ipv4 = self._get_interface_info_attr(interface_name, 'ipv4')
        return self._get_interface_address_attr(ipv4, 'address')

    def net_intf_netmask(self, interface_name):
        ipv4 = self._get_interface_info_attr(interface_name, 'ipv4')
        return self._get_interface_address_attr(ipv4, 'netmask')

    def net_intf_broadcast(self, interface_name):
        ipv4 = self._get_interface_info_attr(interface_name, 'ipv4')
        return self._get_interface_address_attr(ipv4, 'broadcast')

    def net_intf_ip6addr(self, interface_name, scope='universe', order=0):
        """ get IPv6 address

        interface_name is name of interface, e.g. 'eth0'
        scope is either 'link', 'universe' or 'host'
        order is zero based index as there can be more than one IP address
             for given scope and interface
        """
        ipv6 = self._get_interface_info_attr(interface_name, 'ipv6')
        return self._get_interface_address6_attr(ipv6, scope, order, 'address')

    def net_intf_ip6netmask(self, interface_name, scope='universe', order=0):
        """ get IPv6 netmask

        interface_name is name of interface, e.g. 'eth0'
        scope is either 'link', 'universe' or 'host'
        order is zero based index as there can be more than one IP address
             for given scope and interface
        """
        ipv6 = self._get_interface_info_attr(interface_name, 'ipv6')
        return self._get_interface_address6_attr(ipv6, scope, order, 'netmask')

    def net_intf_hwaddr(self, interface_name):
        return self._get_interface_info_attr(interface_name, 'hw_addr')

    def net_intf_module(self, interface_name):
        return self._get_interface_info_attr(interface_name, 'module')

    def _get_interface_info_attr(self, interface_name, attr):
        iface = self._interface_info(interface_name)

        if not iface:
            return None

        return iface[attr]

    def _get_interface_address_attr(self, address, attr):
        if (address is None) or (len(address.db_ifaces) == 0) or (attr not in address.db_ifaces[0]):
            return None
        else:
            return address.db_ifaces[0][attr]

    def _get_interface_address6_attr(self, address, scope, order, attr):
        """ return attribute of given address

        address is list of interfaces
        e.g.: [{'scope': 'universe', 'netmask': '64', 'address': '2620:52:0:2223:20c:29ff:fecb:d06e',
        'interface_id': 127}, {'scope': 'link', 'netmask': '64', 'address':
        'fe80::20c:29ff:fecb:d06e', 'interface_id': 127}]
        scope is either 'link', 'universe' or 'host'
        order is zero based index as there can be more than one IP address
             for given scope and interface
        attr is attribute, e.g "netmask"
        """
        if (address is None):
            return None
        ifaces = [i for i in address.db_ifaces if (i['scope'] == scope)]
        if (order >= len(ifaces)) or (attr not in ifaces[order]):
            return None
        else:
            return ifaces[order][attr]
   07070100000153000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002200000000spacewalk-backend/server/handlers 07070100000154000081B40000000000000000000000015FBBE8EE000000E2000000000000000000000000000000000000002B00000000spacewalk-backend/server/handlers/Makefile    # Makefile for the xmlrpc handlers
#

TOP	= ../..
SUBDIR	= server/handlers

FILES	= __init__

SUBDIRS = \
		  app \
		  applet \
		  config \
		  config_mgmt \
                  sat \
		  xmlrpc

include $(TOP)/Makefile.defs

  07070100000155000081B40000000000000000000000015FBBE8EE000002C0000000000000000000000000000000000000002E00000000spacewalk-backend/server/handlers/__init__.py #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# init module for the XML-RPC handlers. Bare.
#

# we stat all dirs anyway...
__all__ = []
07070100000156000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002600000000spacewalk-backend/server/handlers/app 07070100000157000081B40000000000000000000000015FBBE8EE00000087000000000000000000000000000000000000002F00000000spacewalk-backend/server/handlers/app/Makefile    # Makefile for the app module
#

TOP	= ../../..
SUBDIR	= server/handlers/app

FILES	= __init__ packages

include $(TOP)/Makefile.defs

 07070100000158000081B40000000000000000000000015FBBE8EE00000317000000000000000000000000000000000000003200000000spacewalk-backend/server/handlers/app/__init__.py #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# This file defines the classes available for the XMLRPC receiver
#

__all__ = []

from . import packages

rpcClasses = {
    "packages": packages.Packages,
}

getHandler = None
 07070100000159000081B40000000000000000000000015FBBE8EE00005D39000000000000000000000000000000000000003200000000spacewalk-backend/server/handlers/app/packages.py #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Package uploading functions.
# Package info checking routines.
#

import os
import sys
from uyuni.common.usix import TupleType, raise_with_tb

from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.common.rhnConfig import CFG
from spacewalk.common.rhnException import rhnFault
from spacewalk.common.RPC_Base import RPC_Base

from spacewalk.server import rhnSQL, rhnPackageUpload, rhnUser, rhnSession

from spacewalk.server.importlib.backendOracle import SQLBackend
from spacewalk.server.importlib.importLib import Collection, IncompatibleArchError,\
    Channel, IncompletePackage, InvalidChannelError
from spacewalk.server.importlib.packageImport import ChannelPackageSubscription

from spacewalk.server.importlib.packageUpload import uploadPackages, listChannels, listChannelsSource, listChannelsChecksum
from spacewalk.server.importlib.userAuth import UserAuth
from spacewalk.server.importlib.errataCache import schedule_errata_cache_update

# 12/22/05 wregglej 173287
# I made a decent number of changes to this file to implement session authentication.
# One of the requirements for this was to maintain backwards compatibility, so older
# versions of rhnpush can still talk to a newer satellite. This meant that I had to
# add new versions of each XMLRPC call that did authentication by sessions rather than
# username/password. I noticed that the only real difference between the two was the
# authentication scheme that the functions used, so rather than copy-n-paste a bunch of code,
# I separated the functionality from the authentication and just pass a authentication object
# to the function that actually does stuff.


class Packages(RPC_Base):

    def __init__(self):
        log_debug(3)
        RPC_Base.__init__(self)
        self.functions.append('uploadPackageInfo')
        self.functions.append('uploadPackageInfoBySession')
        self.functions.append('uploadSourcePackageInfo')
        self.functions.append('uploadSourcePackageInfoBySession')
        self.functions.append('listChannel')
        self.functions.append('listChannelBySession')
        self.functions.append('listChannelChecksum')
        self.functions.append('listChannelChecksumBySession')
        self.functions.append('listChannelSource')
        self.functions.append('listChannelSourceBySession')
        self.functions.append('listMissingSourcePackages')
        self.functions.append('listMissingSourcePackagesBySession')
        self.functions.append('channelPackageSubscription')
        self.functions.append('channelPackageSubscriptionBySession')
        self.functions.append('no_op')
        self.functions.append('test_login')
        self.functions.append('test_new_login')
        self.functions.append('test_check_session')
        self.functions.append('login')
        self.functions.append('check_session')
        self.functions.append('getPackageChecksum')
        self.functions.append('getPackageChecksumBySession')
        self.functions.append('getSourcePackageChecksum')
        self.functions.append('getSourcePackageChecksumBySession')
        # old MD5 compatibility functions
        self.functions.append('getPackageMD5sum')
        self.functions.append('getPackageMD5sumBySession')
        self.functions.append('getSourcePackageMD5sum')
        self.functions.append('getSourcePackageMD5sumBySession')

    def no_op(self):
        """ This is so the client can tell if the satellite supports session tokens or not.

            This was used in rhnpush-5.5.26 and older. When there will be no such version of rhnpush in wild,
            then this function can be safely removed."""
        return 1

    def uploadPackageInfo(self, username, password, info):
        """ Upload a collection of binary packages. """
        log_debug(5, username, info)
        authobj = auth(username, password)
        return self._uploadPackageInfo(authobj, info)

    def uploadPackageInfoBySession(self, session_string, info):
        log_debug(5, session_string)
        authobj = auth_session(session_string)
        return self._uploadPackageInfo(authobj, info)

    def _uploadPackageInfo(self, authobj, info):
        # Authorize the org id passed
        authobj.authzOrg(info)
        # Get the channels
        channels = info.get('channels')
        if channels:
            authobj.authzChannels(channels)
        force = 0
        if 'force' in info:
            force = info['force']
        return uploadPackages(info, force=force,
                              caller="server.app.uploadPackageInfo")

    def uploadSourcePackageInfo(self, username, password, info):
        """ Upload a collection of source packages. """
        log_debug(5, username, info)
        authobj = auth(username, password)
        return self._uploadSourcePackageInfo(authobj, info)

    def uploadSourcePackageInfoBySession(self, session_string, info):
        log_debug(5, session_string)
        authobj = auth_session(session_string)
        return self._uploadSourcePackageInfo(authobj, info)

    def _uploadSourcePackageInfo(self, authobj, info):
        # Authorize the org id passed
        authobj.authzOrg(info)
        force = 0
        if 'force' in info:
            force = info['force']
        return uploadPackages(info, source=1, force=force,
                              caller="server.app.uploadSourcePackageInfo")

    def listChannelSource(self, channelList, username, password):
        log_debug(5, channelList, username)
        authobj = auth(username, password)
        return self._listChannelSource(authobj, channelList)

    def listChannelSourceBySession(self, channelList, session_string):
        log_debug(5, channelList, session_string)
        authobj = auth_session(session_string)
        return self._listChannelSource(authobj, channelList)

    def _listChannelSource(self, authobj, channelList):
        authobj.authzChannels(channelList)
        ret = listChannelsSource(channelList)
        return ret

    def listChannel(self, channelList, username, password):
        """ List packages of a specified channel. """
        log_debug(5, channelList, username)
        authobj = auth(username, password)
        return self._listChannel(authobj, channelList)

    def listChannelBySession(self, channelList, session_string):
        log_debug(5, channelList, session_string)
        authobj = auth_session(session_string)
        return self._listChannel(authobj, channelList)

    def _listChannel(self, authobj, channelList):
        authobj.authzChannels(channelList)
        return listChannels(channelList)

    def listChannelChecksum(self, channelList, username, password):
        """ List packages of a specified channel. """
        log_debug(5, channelList, username)
        authobj = auth(username, password)
        return self._listChannelChecksum(authobj, channelList)

    def listChannelChecksumBySession(self, channelList, session_string):
        log_debug(5, channelList, session_string)
        authobj = auth_session(session_string)
        return self._listChannelChecksum(authobj, channelList)

    def _listChannelChecksum(self, authobj, channelList):
        authobj.authzChannels(channelList)
        return listChannelsChecksum(channelList)

    def login(self, username, password):
        """ This function that takes in the username
            and password and returns a session string if they are correct. It raises a
            rhnFault if the user/pass combo is not acceptable.
        """
        log_debug(5, username)
        user = rhnUser.search(username)
        if not user or not user.check_password(password):
            raise rhnFault(2)
        if rhnUser.is_user_disabled(username):
            msg = _("""
                   %s Account has been deactivated on this server.
                   Please contact your Org administrator for more help.""")
            raise rhnFault(1, msg % username, explain=0)
        if rhnUser.is_user_read_only(user.username):
            raise rhnFault(702)
        session = user.create_session()
        return session.get_session()

    def check_session(self, session):
        """ Checks a session string to make sure it is authentic expired. """
        try:
            user = rhnUser.session_reload(session)
        except (rhnSession.InvalidSessionError, rhnSession.ExpiredSessionError):
            return 0
        return 1

    def test_login(self, username, password):
        log_debug(5, username)
        try:
            authobj = auth(username, password)
        except:
            return 0
        return 1

    def test_new_login(self, username, password, session=None):
        """ rhnpush's --extended-test will call this function. """
        log_debug(5, "testing new login")
        return self.login(username, password)

    def test_check_session(self, session):
        """ rhnpush's --extended-test will call this function. """
        log_debug(5, "testing check session")
        return self.check_session(session)

    ###listMissingSourcePackages###
    def listMissingSourcePackages(self, channelList, username, password):
        """ List source packages for a list of channels. """
        log_debug(5, channelList, username)
        authobj = auth(username, password)
        return self._listMissingSourcePackages(authobj, channelList)

    def listMissingSourcePackagesBySession(self, channelList, session_string):
        log_debug(5, channelList, session_string)
        authobj = auth_session(session_string)
        return self._listMissingSourcePackages(authobj, channelList)

    def _listMissingSourcePackages(self, authobj, channelList):
        authobj.authzChannels(channelList)

        h = rhnSQL.prepare("""
            select distinct sr.name source_rpm
              from rhnChannel c
              join rhnChannelNewestPackage cnp
                on cnp.channel_id = c.id
              join rhnPackage p
                on cnp.package_id = p.id
              join rhnSourceRPM sr
                on p.source_rpm_id = sr.id
              left join rhnPackageSource ps
                on p.source_rpm_id = ps.source_rpm_id
               and (p.org_id = ps.org_id or
                    (p.org_id is null and ps.org_id is null)
                   )
             where c.label = :channel_label
               and ps.source_rpm_id is null
        """)
        missing_packages = []
        for c in channelList:
            h.execute(channel_label=c)
            while 1:
                row = h.fetchone_dict()
                if not row:
                    break

                missing_packages.append([row['source_rpm'], c])

        return missing_packages

    def channelPackageSubscription(self, username, password, info):
        """ Uploads an RPM package. """
        log_debug(3)
        authobj = auth(username, password)
        return self._channelPackageSubscription(authobj, info)

    def channelPackageSubscriptionBySession(self, session_string, info):
        log_debug(3, info)
        authobj = auth_session(session_string)
        return self._channelPackageSubscription(authobj, info)

    def _channelPackageSubscription(self, authobj, info):
        # Authorize the org id passed
        authobj.authzOrg(info)

        packageList = info.get('packages') or []
        if not packageList:
            log_debug(1, "No packages found; done")
            return 0

        if 'channels' not in info or not info['channels']:
            log_debug(1, "No channels found; done")
            return 0

        channelList = info['channels']
        authobj.authzChannels(channelList)

        # Have to turn the channel list into a list of Channel objects
        channelList = [Channel().populate({'label': x}) for x in channelList]

        # Since we're dealing with superusers, we allow them to change the org
        # id
        # XXX check if we don't open ourselves too much (misa 20030422)
        org_id = info.get('orgId')
        if org_id == '':
            org_id = None

        batch = Collection()
        package_keys = ['name', 'version', 'release', 'epoch', 'arch']
        for package in packageList:
            for k in package_keys:
                if k not in package:
                    raise Exception("Missing key %s" % k)
                if k == 'epoch':
                    if package[k] is not None:
                        if package[k] == '':
                            package[k] = None
                        else:
                            package[k] = str(package[k])
                else:
                    package[k] = str(package[k])

            if package['arch'] == 'src' or package['arch'] == 'nosrc':
                # Source package - no reason to continue
                continue
            _checksum_sql_filter = ""
            if 'md5sum' in package:  # for old rhnpush compatibility
                package['checksum_type'] = 'md5'
                package['checksum'] = package['md5sum']

            exec_args = {
                'name':    package['name'],
                'pkg_epoch':   package['epoch'],
                'pkg_version': package['version'],
                'pkg_rel':     package['release'],
                'pkg_arch':    package['arch'],
                'orgid':       org_id
            }

            if 'checksum' in package and CFG.ENABLE_NVREA:
                _checksum_sql_filter = """and c.checksum = :checksum
                                          and c.checksum_type = :checksum_type"""
                exec_args.update({'checksum_type': package['checksum_type'],
                                  'checksum':      package['checksum']})

            h = rhnSQL.prepare(self._get_pkg_info_query %
                               _checksum_sql_filter)
            h.execute(**exec_args)
            row = h.fetchone_dict()

            package['checksum_type'] = row['checksum_type']
            package['checksum'] = row['checksum']
            package['org_id'] = org_id
            package['channels'] = channelList
            batch.append(IncompletePackage().populate(package))

        caller = "server.app.channelPackageSubscription"

        backend = SQLBackend()
        importer = ChannelPackageSubscription(batch, backend, caller=caller)
        try:
            importer.run()
        except IncompatibleArchError:
            e = sys.exc_info()[1]
            raise_with_tb(rhnFault(50, ' '.join(e.args), explain=0), sys.exc_info()[2])
        except InvalidChannelError:
            e = sys.exc_info()[1]
            raise_with_tb(rhnFault(50, str(e), explain=0), sys.exc_info()[2])

        affected_channels = importer.affected_channels

        log_debug(3, "Computing errata cache for systems affected by channels",
                  affected_channels)

        schedule_errata_cache_update(affected_channels)
        rhnSQL.commit()

        return 0

    def getAnyChecksum(self, info, username=None, password=None, session=None, is_source=0):
        """ returns checksum info of available packages
            also does an existance check on the filesystem.
        """
        log_debug(3)

        pkg_infos = info.get('packages')
        channels = info.get('channels', [])
        force = info.get('force', 0)
        orgid = info.get('org_id')

        if orgid == 'null':
            null_org = 1
        else:
            null_org = None

        if not session:
            org_id, force = rhnPackageUpload.authenticate(username, password,
                                                          channels=channels,
                                                          null_org=null_org,
                                                          force=force)
        else:
            try:
                org_id, force = rhnPackageUpload.authenticate_session(
                    session, channels=channels, null_org=null_org, force=force)
            except rhnSession.InvalidSessionError:
                raise_with_tb(rhnFault(33), sys.exc_info()[2])
            except rhnSession.ExpiredSessionError:
                raise_with_tb(rhnFault(34), sys.exc_info()[2])

        if is_source:
            ret = self._getSourcePackageChecksum(org_id, pkg_infos)
        else:
            ret = self._getPackageChecksum(org_id, pkg_infos)
        return ret

    def getPackageChecksum(self, username, password, info):
        return self.getAnyChecksum(info, username=username, password=password)

    def getPackageMD5sum(self, username, password, info):
        """ bug#177762 gives md5sum info of available packages.
            also does an existance check on the filesystem.
        """
        log_debug(3)
        self._MD5sum2Checksum_info(info)
        return self._Checksum2MD5sum_list(
            self.getPackageChecksum(username, password, info))

    def getPackageChecksumBySession(self, session_string, info):
        return self.getAnyChecksum(info, session=session_string)

    def getPackageMD5sumBySession(self, session_string, info):
        log_debug(3)
        self._MD5sum2Checksum_info(info)
        return self._Checksum2MD5sum_list(
            self.getPackageChecksumBySession(session_string, info))

    _get_pkg_info_query = """
        select
               c.checksum_type,
               c.checksum,
               p.path path
         from
               rhnPackageEVR pe,
               rhnPackageName pn,
               rhnPackage p,
               rhnPackageArch pa,
               rhnChecksumView c
         where
               pn.name     = :name
          and  ( pe.epoch  = :pkg_epoch or
                ( pe.epoch is null and :pkg_epoch is null )
               )
          and  pe.version  = :pkg_version
          and  pe.release  = :pkg_rel
          and  ( p.org_id  = :orgid or
                ( p.org_id is null and :orgid is null )
               )
          and  p.name_id   = pn.id
          and  p.evr_id    = pe.id
          and  p.package_arch_id = pa.id
          and  pa.label    = :pkg_arch
          and  p.checksum_id = c.id
          %s
    """

    def _getPackageChecksum(self, org_id, pkg_infos):
        log_debug(3)
        row_list = {}
        checksum_exists = 0
        for pkg in list(pkg_infos.keys()):

            pkg_info = pkg_infos[pkg]
            pkg_epoch = pkg_info['epoch']
            if pkg_epoch is not None:
                # Force empty strings to None (NULLs in database)
                if pkg_epoch == '':
                    pkg_epoch = None
                # and force numbers to strings
                else:
                    pkg_epoch = str(pkg_epoch)

            query_args = {
                'name':     pkg_info['name'],
                'pkg_epoch':    pkg_epoch,
                'pkg_version':  str(pkg_info['version']),
                'pkg_rel':      str(pkg_info['release']),
                'pkg_arch':     pkg_info['arch'],
                'orgid':       org_id,
            }

            _checksum_sql_filter = ""
            if 'checksum' in pkg_info and CFG.ENABLE_NVREA:
                _checksum_sql_filter = """and c.checksum = :checksum
                                          and c.checksum_type = :checksum_type"""
                query_args.update({
                    'checksum_type':    pkg_info['checksum_type'],
                    'checksum':         pkg_info['checksum'],
                })

            h = rhnSQL.prepare(self._get_pkg_info_query % _checksum_sql_filter)
            row_list[pkg] = self._get_package_checksum(h, query_args)

        return row_list

    def _get_package_checksum(self, h, query_args):
        h.execute(**query_args)
        row = h.fetchone_dict()
        if not row:
            ret = ''
        elif row.get('path'):
            filePath = os.path.join(CFG.MOUNT_POINT, row['path'])
            if os.access(filePath, os.R_OK):
                if 'checksum' in row:
                    ret = (row['checksum_type'], row['checksum'])
                else:
                    ret = 'on-disk'
            else:
                # Package not found on the filesystem
                log_error("Package not found", filePath)
                ret = ''
        else:
            log_error("Package path null for package", query_args['name'])
            ret = ''
        return ret

    def _MD5sum2Checksum_info(self, info):
        log_debug(5)
        pkg_infos = info.get('packages')
        for pkg in list(pkg_infos.keys()):
            if 'md5sum' in pkg_infos[pkg]:
                pkg_infos[pkg]['checksum_type'] = 'md5'
                pkg_infos[pkg]['checksum'] = pkg_infos[pkg]['md5sum']
                del(pkg_infos[pkg]['md5sum'])

    def _Checksum2MD5sum_list(self, checksum_list):
        log_debug(5)
        row_list = {}
        for k in list(checksum_list.keys()):
            if checksum_list[k] == '' or checksum_list[k] == 'on-disk':
                row_list[k] = checksum_list[k]
            elif type(checksum_list[k]) == TupleType and checksum_list[k][0] == 'md5':
                row_list[k] = checksum_list[k][1]
            else:
                row_list[k] = ''
        return row_list

    def getSourcePackageChecksum(self, username, password, info):
        return self.getAnyChecksum(info, username=username, password=password, is_source=1)

    def getSourcePackageMD5sum(self, username, password, info):
        log_debug(3)
        self._MD5sum2Checksum_info(info)
        return self._Checksum2MD5sum_list(
            self.getSourcePackageChecksum(username, password, info))

    def getSourcePackageChecksumBySession(self, session_string, info):
        return self.getAnyChecksum(info, session=session_string, is_source=1)

    def getSourcePackageMD5sumBySession(self, session_string, info):
        log_debug(3)
        self._MD5sum2Checksum_info(info)
        return self._Checksum2MD5sum_list(
            self.getSourcePackageChecksumBySession(session_string, info))

    def _getSourcePackageChecksum(self, org_id, pkg_infos):
        """ Gives checksum info of available source packages.
            Also does an existance check on the filesystem.
        """

        log_debug(3)

        statement = """
            select
                ps.path path,
                c.checksum,
                c.checksum_type
            from
                rhnSourceRpm sr,
                rhnPackageSource ps,
                rhnChecksumView c
            where
                 sr.name = :name
             and ps.source_rpm_id = sr.id
             and ( ps.org_id  = :orgid or
                   ( ps.org_id is null and :orgid is null )
                 )
             and ps.checksum_id = c.id
             """
        h = rhnSQL.prepare(statement)
        row_list = {}
        for pkg in list(pkg_infos.keys()):
            row_list[pkg] = self._get_package_checksum(h,
                                                       {'name': pkg, 'orgid': org_id})
        return row_list


def auth(login, password):
    """ Authorize this user. """
    authobj = UserAuth()
    authobj.auth(login, password)
    return authobj


def auth_session(session_string):
    """ Authenticate based on a session. """
    authobj = UserAuth()
    authobj.auth_session(session_string)
    return authobj
   0707010000015A000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002900000000spacewalk-backend/server/handlers/applet  0707010000015B000081B40000000000000000000000015FBBE8EE0000008B000000000000000000000000000000000000003200000000spacewalk-backend/server/handlers/applet/Makefile # Makefile for the applet module
#

TOP	= ../../..
SUBDIR	= server/handlers/applet

FILES	= __init__ applet

include $(TOP)/Makefile.defs

 0707010000015C000081B40000000000000000000000015FBBE8EE00000311000000000000000000000000000000000000003500000000spacewalk-backend/server/handlers/applet/__init__.py  #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# This file defines the classes available for the APPLET receiver
#

__all__ = []

from . import applet

rpcClasses = {
    "applet": applet.Applet,
}

getHandler = None
   0707010000015D000081B40000000000000000000000015FBBE8EE00002834000000000000000000000000000000000000003300000000spacewalk-backend/server/handlers/applet/applet.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

# system module imports
try:
    #  python 2
    import xmlrpclib
except ImportError:
    #  python3
    import xmlrpc.client as xmlrpclib
import random

# common modules imports
from uyuni.common.usix import LongType
from uyuni.common import rhn_rpm
from spacewalk.common import rhnCache, rhnFlags
from spacewalk.common.rhnLog import log_debug
from spacewalk.common.rhnConfig import CFG, PRODUCT_NAME
from spacewalk.common.rhnException import rhnFault
from spacewalk.common.rhnTranslate import _

# server modules imports
from spacewalk.server.rhnHandler import rhnHandler
from spacewalk.server import rhnChannel, rhnSQL, rhnLib

# Applet class --- retrieve (via xmlrpc) date required for applet
# functionality


class Applet(rhnHandler):

    def __init__(self):
        rhnHandler.__init__(self)
        # Exposed Errata functions:
        self.functions = []
        self.functions.append("poll_status")
        self.functions.append("poll_packages")
        self.functions.append("tie_uuid")
        self.functions.append("has_base_channel")

    _query_lookup_server = rhnSQL.Statement("""
        select s.id
          from rhnServer s,
               rhnServerUuid su
         where su.uuid = :uuid
           and su.server_id = s.id
         order by modified desc
    """)
    _query_lookup_base_channel = rhnSQL.Statement("""
        select c.label
          from rhnChannel c,
               rhnServerChannel sc
         where sc.server_id = :server_id
           and sc.channel_id = c.id
           and c.parent_channel is null
    """)

    def has_base_channel(self, uuid):
        log_debug(1, uuid)
        # Verifies if a system has a base channel
        h = rhnSQL.prepare(self._query_lookup_server)
        h.execute(uuid=uuid)
        row = h.fetchone_dict()
        if not row:
            raise rhnFault(140,
                           _("Your system was not found in the {PRODUCT_NAME} database").format(PRODUCT_NAME=PRODUCT_NAME),
                           explain=0)
        server_id = row['id']

        h = rhnSQL.prepare(self._query_lookup_base_channel)
        h.execute(server_id=server_id)
        row = h.fetchone_dict()
        if row:
            return 1
        return 0

    # ties a uuid to an rhnServer.id
    def tie_uuid(self, systemid, uuid):
        log_debug(1, uuid)
        systemid = str(systemid)
        uuid = str(uuid)

        server = self.auth_system(systemid)
        if not uuid:
            # Nothing to do
            return

        server.update_uuid(uuid)
        return 1

    # return our sttaus - for now a dummy function
    def poll_status(self):
        checkin_interval = (CFG.CHECKIN_INTERVAL +
                            random.random() * CFG.CHECKIN_INTERVAL_MAX_OFFSET)
        return {
            'checkin_interval': int(checkin_interval),
            'server_status': 'normal'
        }

    # poll for latest packages for the RHN Applet
    def poll_packages(self, release, server_arch, timestamp=0, uuid=None):
        log_debug(1, release, server_arch, timestamp, uuid)

        # make sure we're dealing with strings here
        release = str(release)
        server_arch = rhnLib.normalize_server_arch(server_arch)
        timestamp = str(timestamp)
        uuid = str(uuid)

        # get a list of acceptable channels
        channel_list = []

        channel_list = rhnChannel.applet_channels_for_uuid(uuid)

        # it's possible the tie between uuid and rhnServer.id wasn't yet
        # made, default to normal behavior
        if not channel_list:
            channel_list = rhnChannel.get_channel_for_release_arch(release,
                                                                   server_arch)
            channel_list = [channel_list]
        # bork if no channels returned
        if not channel_list:
            log_debug(8, "No channels for release = '%s', arch = '%s', uuid = '%s'" % (
                release, server_arch, uuid))
            return {'last_modified': 0, 'contents': []}

        last_channel_changed_ts = max([a["last_modified"] for a in channel_list])

        # make satellite content override a cache caused by hosted
        last_channel_changed_ts = str(LongType(last_channel_changed_ts) + 1)

        # gotta be careful about channel unsubscriptions...
        client_cache_invalidated = None

        # we return rhnServer.channels_changed for each row
        # in the satellite case, pluck it off the first...
        if "server_channels_changed" in channel_list[0]:
            sc_ts = channel_list[0]["server_channels_changed"]

            if sc_ts and (sc_ts >= last_channel_changed_ts):
                client_cache_invalidated = 1

        if (last_channel_changed_ts <= timestamp) and (not client_cache_invalidated):
            # XXX: I hate these freaking return codes that return
            # different members in the dictinary depending on what
            # sort of data you get
            log_debug(3, "Client has current data")
            return {'use_cached_copy': 1}

        # we'll have to return something big - compress
        rhnFlags.set("compress_response", 1)

        # Mark the response as being already XMLRPC-encoded
        rhnFlags.set("XMLRPC-Encoded-Response", 1)

        # next, check the cache if we have something with this timestamp
        label_list = [str(a["id"]) for a in channel_list]
        label_list.sort()
        log_debug(4, "label_list", label_list)
        cache_key = "applet-poll-%s" % "-".join(label_list)

        ret = rhnCache.get(cache_key, last_channel_changed_ts)
        if ret:  # we have a good entry with matching timestamp
            log_debug(3, "Cache HIT for", cache_key)
            return ret

        # damn, need to do some real work from chip's requirements:
        # The package list should be an array of hashes with the keys
        # nvre, name, version, release, epoch, errata_advisory,
        # errata_id, with the errata fields being empty strings if the
        # package isn't from an errata.
        ret = {'last_modified': last_channel_changed_ts, 'contents': []}

        # we search for packages only in the allowed channels - build
        # the SQL helper string and dictionary to make the foo IN (
        # list ) constructs use bind variables
        qlist = []
        qdict = {}
        for c in channel_list:
            v = c["id"]
            k = "channel_%s" % v
            qlist.append(":%s" % k)
            qdict[k] = v
        qlist = ", ".join(qlist)

        # This query is kind of big. One of these days I'm gonna start
        # pulling them out and transforming them into views. We can
        # also simulate this using several functions exposed out of
        # rhnChannel, but there is no difference in speed because we
        # need to do more than one query; besides, we cache the hell
        # out of it
        h = rhnSQL.prepare("""
        select distinct
            pn.name,
            pe.version,
            pe.release,
            pe.epoch,
            e_sq.errata_advisory,
            e_sq.errata_synopsis,
            e_sq.errata_id
        from
            rhnPackageName pn,
            rhnPackageEVR pe,
            rhnChannelNewestPackage cnp
        left join
            (   select  sq_e.id as errata_id,
                        sq_e.synopsis as errata_synopsis,
                        sq_e.advisory as errata_advisory,
                        sq_ep.package_id
                from
                        rhnErrata sq_e,
                        rhnErrataPackage sq_ep,
                        rhnChannelErrata sq_ce
                where   sq_ce.errata_id = sq_ep.errata_id
                        and sq_ce.errata_id = sq_e.id
                        and sq_ce.channel_id in ( %s )
            ) e_sq
          on cnp.package_id = e_sq.package_id
        where
            cnp.channel_id in ( %s )
        and cnp.name_id = pn.id
        and cnp.evr_id = pe.id
        """ % (qlist, qlist))
        h.execute(**qdict)

        plist = h.fetchall_dict()

        if not plist:
            # We've set XMLRPC-Encoded-Response above
            ret = xmlrpclib.dumps((ret, ), methodresponse=1)
            return ret

        contents = {}

        for p in plist:
            for k in list(p.keys()):
                if p[k] is None:
                    p[k] = ""
            p["nevr"] = "%s-%s-%s:%s" % (
                p["name"], p["version"], p["release"], p["epoch"])
            p["nvr"] = "%s-%s-%s" % (p["name"], p["version"], p["release"])

            pkg_name = p["name"]

            if pkg_name in contents:
                stored_pkg = contents[pkg_name]

                s = [stored_pkg["name"],
                     stored_pkg["version"],
                     stored_pkg["release"],
                     stored_pkg["epoch"]]

                n = [p["name"],
                     p["version"],
                     p["release"],
                     p["epoch"]]

                log_debug(7, "comparing vres", s, n)
                if rhn_rpm.nvre_compare(s, n) < 0:
                    log_debug(7, "replacing %s with %s" % (pkg_name, p))
                    contents[pkg_name] = p
                else:
                    # already have a higher vre stored...
                    pass
            else:
                log_debug(7, "initial store for %s" % pkg_name)
                contents[pkg_name] = p

        ret["contents"] = list(contents.values())

        # save it in the cache
        # We've set XMLRPC-Encoded-Response above
        ret = xmlrpclib.dumps((ret, ), methodresponse=1)
        rhnCache.set(cache_key, ret, last_channel_changed_ts)

        return ret
0707010000015E000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002900000000spacewalk-backend/server/handlers/config  0707010000015F000081B40000000000000000000000015FBBE8EE00000097000000000000000000000000000000000000003200000000spacewalk-backend/server/handlers/config/Makefile # Makefile for the app module
#

TOP	= ../../..
SUBDIR	= server/handlers/config

FILES	= __init__ rhn_config_management

include $(TOP)/Makefile.defs

 07070100000160000081B40000000000000000000000015FBBE8EE00000337000000000000000000000000000000000000003500000000spacewalk-backend/server/handlers/config/__init__.py  #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# This file defines the classes available for the XMLRPC receiver
#

__all__ = []

from . import rhn_config_management

rpcClasses = {
    'config': rhn_config_management.ConfigManagement,
}

getHandler = None
 07070100000161000081B40000000000000000000000015FBBE8EE000030D3000000000000000000000000000000000000004200000000spacewalk-backend/server/handlers/config/rhn_config_management.py #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Config file handler (client side)
#

from spacewalk.common.rhnLog import log_debug
from spacewalk.common.rhnException import rhnFault

from spacewalk.server import rhnSQL, configFilesHandler
from spacewalk.server.rhnHandler import rhnHandler


class ConfigManagement(configFilesHandler.ConfigFilesHandler):

    def __init__(self):
        log_debug(3)
        configFilesHandler.ConfigFilesHandler.__init__(self)
        self.functions.update({
            'client.list_config_channels': 'client_list_channels',
            # XXX1
            'client.set_namespaces': 'client_set_namespaces',
            'client.list_files': 'client_list_files',
            'client.get_file': 'client_get_file',
            'client.get_default_delimiters': 'client_get_delimiters',
            'client.upload_file': 'client_upload_file',
            'client.get_maximum_file_size': 'client_get_maximum_file_size',
            'client.upload': 'client_upload_to_server_import',
        })
        self.org_id = None

    # We need the org id too
    def auth_system(self, systemid):
        rhnHandler.auth_system(self, systemid)
        self.org_id = self.server.server['org_id']

    def client_get_maximum_file_size(self, systemid):
        log_debug(1)
        self.auth_system(systemid)

        return self._get_maximum_file_size()

    def client_get_delimiters(self, systemid):
        log_debug(1)
        self.auth_system(systemid)

        return self._get_delimiters()

    def client_list_channels(self, systemid):
        self.auth_system(systemid)
        return self._get_client_config_channels(self.server_id)

    # XXX1
    def client_set_namespaces(self, systemid, namespaces):
        self.auth_system(systemid)

        server_id = self.server.getid()
        org_id = self.server.server['org_id']

        h = rhnSQL.prepare("""
            delete from rhnServerConfigChannel where server_id = :server_id
        """)
        h.execute(server_id=server_id)

        h = rhnSQL.prepare("""
            insert into rhnServerConfigChannel (server_id, config_channel_id, position)
            select :server_id, id, :position
              from rhnConfigChannel
             where name = :config_channel
               and org_id = :org_id
        """)

        position = 0
        for config_channel in namespaces:
            rowcount = h.execute(server_id=server_id, position=position,
                                 config_channel=config_channel, org_id=org_id)
            if not rowcount:
                raise rhnFault(4009, "Unable to find config channel %s" %
                               config_channel, explain=0)
            position = position + 1

        rhnSQL.commit()
        return 0

    _query_client_list_files = rhnSQL.Statement("""
        select cfn.path, cr.config_file_type_id
          from rhnConfigChannelType cct,
               rhnConfigChannel cc,
               rhnConfigFileState cfs,
               rhnConfigFileName cfn,
               rhnConfigRevision cr,
               rhnConfigFile cf
         where cc.org_id = :org_id
           and cc.label = :config_channel
           and cc.confchan_type_id = cct.id
           and cct.label in ('normal', 'local_override')
           and cf.config_channel_id = cc.id
           and cf.latest_config_revision_id = cr.id
           and cr.config_file_id = cf.id
           and cf.state_id = cfs.id
           and cfs.label = 'alive'
           and cf.config_file_name_id = cfn.id
           order by cfn.path
    """)

    def client_list_files(self, systemid, config_channel=None):
        """ Return array of files (its path), which we manage on that system. """
        log_debug(1)
        self.auth_system(systemid)

        if config_channel:
            config_channels = [config_channel]
        else:
            config_channels = self._get_client_config_channels(self.server.getid())
            config_channels = [x['label'] for x in config_channels]

        if not config_channels:
            # No config channels
            return []

        h = rhnSQL.prepare(self._query_client_list_files)

        result_hash = {}
        # We're storing the config files in a dictionary, keyed by path; this
        # way, the most important channel (with the lowest preference) will
        # override the less important oness
        for config_channel in config_channels:
            log_debug(4, "Checking config channel", config_channel)

            h.execute(org_id=self.org_id, config_channel=config_channel)
            while 1:
                row = h.fetchone_dict()
                if not row:
                    break

                path = row['path']

                if not path in result_hash:
                    result_hash[path] = (config_channel, path, row['config_file_type_id'])

                if config_channel == str(self.server.getid()):
                    result_hash[path] = (config_channel, path, row['config_file_type_id'])

        result = list(result_hash.values())
        # Sort by path first since that's what the web site does
        result.sort(key=lambda x:x[1])
        return result

    def client_get_file(self, systemid, filename):
        """ Returns requested config file.
            If file do not exist or system is not subscribed to, then we return.
            {'missing' : 1}
            Otherwise dictionary is returned. It should contains keys:
            path, config_channel, file_contents, checksum_type, checksum, delim_start
            delim_end, revision, username, groupname, filemode, encoding, filetype and
            selinux_ctx.
            See server/configFilesHandler.py:format_file_results
        """
        self.auth_system(systemid)
        server_id = self.server.getid()

        return self._client_get_file(server_id, filename)

    _query_client_get_file = rhnSQL.Statement("""
        select :path path,
               cc.label config_channel,
               c.contents file_contents,
               c.is_binary is_binary,
               c.checksum_type,
               c.checksum,
               c.delim_start, c.delim_end,
               cr.revision,
               cf.modified,
               ci.username,
               ci.groupname,
               ci.filemode,
               cft.label,
               cct.priority,
               ci.selinux_ctx,
           case
                when cft.label='symlink' then (select path from rhnConfigFileName where id = ci.SYMLINK_TARGET_FILENAME_ID)
                else ''
            end as symlink
          from rhnConfigChannel cc,
               rhnConfigInfo ci,
               rhnConfigRevision cr
          left join
            (select ccont.id, cs.checksum_type, cs.checksum,
                    ccont.contents, ccont.is_binary,
                    ccont.delim_start, ccont.delim_end
               from rhnChecksumView cs
               inner join rhnConfigContent ccont
                 on ccont.checksum_id = cs.id) c
            on cr.config_content_id = c.id,
               rhnServerConfigChannel scc,
               rhnConfigFile cf,
               rhnConfigFileType cft,
               rhnConfigChannelType cct
         where scc.server_id = :server_id
           and scc.config_channel_id = cc.id
           and cf.config_channel_id = cc.id
           and cf.config_file_name_id = lookup_config_filename(:path)
           and cr.config_file_id = cf.id
           and cr.config_info_id = ci.id
           and cf.latest_config_revision_id = cr.id
           and cr.config_file_type_id = cft.id
           and cct.id = cc.confchan_type_id
         order by cct.priority, scc.position
    """)

    def _client_get_file(self, server_id, filename):
        h = rhnSQL.prepare(self._query_client_get_file)

        h.execute(server_id=server_id, path=filename)
        row = h.fetchone_dict()
        if not row:
            # XXX Return something other than a dict?
            return {'missing': 1}

        return self._format_file_results(row)

    _query_client_config_channels = rhnSQL.Statement("""
        select cc.label,
               cc.name
          from rhnConfigChannelType cct,
               rhnConfigChannel cc,
               rhnServerConfigChannel scc
         where scc.server_id = :server_id
           and scc.config_channel_id = cc.id
           and cc.confchan_type_id = cct.id
           and cct.label in ('normal', 'local_override')
         order by scc.position nulls last, cc.name desc
    """)

    def _get_client_config_channels(self, server_id):
        h = rhnSQL.prepare(self._query_client_config_channels)
        h.execute(server_id=server_id)
        return h.fetchall_dict() or []

    _query_client_upload_files = rhnSQL.Statement("""
        select acc.config_channel_id, ast.name action_status
          from rhnServerAction sa,
               rhnActionStatus ast,
               rhnActionConfigChannel acc
         where acc.server_id = :server_id
           and acc.action_id = :action_id
           and sa.server_id = :server_id
           and sa.action_id = :action_id
           and sa.status = ast.id
    """)

    def client_upload_file(self, systemid, action_id, file):
        self.auth_system(systemid)
        log_debug(1, self.server_id, action_id)

        # Validate that the action indeed applies
        h = rhnSQL.prepare(self._query_client_upload_files)
        h.execute(server_id=self.server_id, action_id=action_id)
        row = h.fetchone_dict()
        if not row:
            raise rhnFault(4002, "Action not available for this server")
        if row['action_status'] != 'Picked Up':
            raise rhnFault(4002, "Improper action for this server")

        config_channel_id = row['config_channel_id']

        return self.push_file(config_channel_id, file)

    _query_lookup_import_channel = rhnSQL.Statement("""
        select cc.id
          from rhnConfigChannelType cct,
               rhnConfigChannel cc,
               rhnServerConfigChannel scc
         where scc.server_id = :server_id
           and scc.config_channel_id = cc.id
           and cc.confchan_type_id = cct.id
           and cct.label = 'server_import'
    """)

    # Almost identical to client_upload_files
    def client_upload_to_server_import(self, systemid, file):
        self.auth_system(systemid)
        log_debug(1, self.server_id)

        h = rhnSQL.prepare(self._query_lookup_import_channel)
        h.execute(server_id=self.server_id)
        row = h.fetchone_dict()
        if not row:
            config_channel_id = self._create_server_import_channel(self.server_id)
        else:
            config_channel_id = row['id']

        return self.push_file(config_channel_id, file)

    _query_create_server_import_channel = rhnSQL.Statement("""
        insert into rhnServerConfigChannel
               (server_id, config_channel_id, position)
        values (:server_id, :config_channel_id, :position)
    """)

    def _create_server_import_channel(self, server_id):
        name = "server_import Config Channel for system %d" % server_id
        description = "XXX"

        # server_import and local_override channels that
        # get created need to conform to this label formula:
        # {rhnConfigChannelType.label}-{sid}
        label = "server_import-%d" % server_id

        insert_call = rhnSQL.Function('rhn_config.insert_channel',
                                      rhnSQL.types.NUMBER())
        config_channel_id = insert_call(self.org_id,
                                        'server_import',
                                        name,
                                        label,
                                        description)

        h = rhnSQL.prepare(self._query_create_server_import_channel)
        h.execute(server_id=server_id, config_channel_id=config_channel_id,
                  position=None)

        return config_channel_id
 07070100000162000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002E00000000spacewalk-backend/server/handlers/config/test 07070100000163000081B40000000000000000000000015FBBE8EE0000034B000000000000000000000000000000000000003D00000000spacewalk-backend/server/handlers/config/test/template1.tmpl  <html>
<head><title>Running on @@hostname@@</title></head>
<body>

This script is run from @@hostname@@ and the value is @@foobar()=RRR@@ by default.
%25%25%25@@%40%40

hostname:
@@rhn.system.hostname()@@

ipaddr:
@@rhn.system.ip_address@@

description:
@@rhn.system.description@@

sid:
@@rhn.system.sid@@

network interface:
ipaddr eth0 -- @@rhn.system.net_interface.ip_address(eth0)@@
netmask eth0 -- @@rhn.system.net_interface.netmask(eth0)@@
broadcast eth0 -- @@rhn.system.net_interface.broadcast(eth0)@@
hwaddr eth0 -- @@rhn.system.net_interface.hardware_address(eth0)@@
module eth0 -- @@rhn.system.net_interface.driver_module(eth0)@@

ipaddr lo -- @@rhn.system.net_interface.ip_address(lo)@@


custom info:
foo -- @@rhn.system.custom_info(foo)@@
no_such_value -- @@rhn.system.custom_info(no_such_value)=No such value@@

</body>
</html>

 07070100000164000081B40000000000000000000000015FBBE8EE000007FD000000000000000000000000000000000000004000000000spacewalk-backend/server/handlers/config/test/test_template1.py   #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
import sys

from templated_document import ServerTemplatedDocument
from spacewalk.server import rhnServer, rhnSQL

rhnSQL.initDB()

server_id = 1003887108

server = rhnServer.search(server_id)
server.reload_hardware()
server.load_custom_info()

t = ServerTemplatedDocument(server, start_delim='@@', end_delim='@@')
#t = ServerTemplatedDocument(server, start_delim='{|', end_delim='|}')

data = open("test/template1.tmpl").read()

try:
    print(("interpolated:  ", t.interpolate(data)))
except Exception:
    e = sys.exc_info()[1]
    print(e)
    tb = sys.exc_info()[2]
    stack = []
    # walk the traceback to the end
    while 1:
        if not tb.tb_next:
            break
        tb = tb.tb_next
    # and now start extracting the stack frames
    f = tb.tb_frame
    while f:
        stack.append(f)
        f = f.f_back

    for frame in stack:
        print(("Frame %s in %s at line %s\n" % (frame.f_code.co_name,
                                               frame.f_code.co_filename,
                                               frame.f_lineno)))

        for key, value in list(frame.f_locals.items()):
            message = "\t%20s = " % key
            try:
                s = str(value)
            except:
                s = "<ERROR WHILE PRINTING VALUE>"
            if len(s) > 100 * 1024:
                s = "<ERROR WHILE PRINTING VALUE: string representation too large>"
            print((message + s))
   07070100000165000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002E00000000spacewalk-backend/server/handlers/config_mgmt 07070100000166000081B40000000000000000000000015FBBE8EE0000009C000000000000000000000000000000000000003700000000spacewalk-backend/server/handlers/config_mgmt/Makefile    # Makefile for the app module
#

TOP	= ../../..
SUBDIR	= server/handlers/config_mgmt

FILES	= __init__ rhn_config_management

include $(TOP)/Makefile.defs

07070100000167000081B40000000000000000000000015FBBE8EE00000337000000000000000000000000000000000000003A00000000spacewalk-backend/server/handlers/config_mgmt/__init__.py #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# This file defines the classes available for the XMLRPC receiver
#

__all__ = []

from . import rhn_config_management

rpcClasses = {
    'config': rhn_config_management.ConfigManagement,
}

getHandler = None
 07070100000168000081B40000000000000000000000015FBBE8EE00004DD7000000000000000000000000000000000000004700000000spacewalk-backend/server/handlers/config_mgmt/rhn_config_management.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Config file handler (management tool)
#

import sys
import difflib
from spacewalk.common.rhnLog import log_debug
from uyuni.common.usix import raise_with_tb, next
from spacewalk.common.rhnException import rhnFault
from spacewalk.server import rhnSQL, configFilesHandler
from uyuni.common.fileutils import f_date, ostr_to_sym


class ConfigManagement(configFilesHandler.ConfigFilesHandler):

    def __init__(self):
        log_debug(3)
        configFilesHandler.ConfigFilesHandler.__init__(self)
        self.functions.update({
            'management.get_file': 'management_get_file',
            'management.list_config_channels': 'management_list_channels',
            'management.create_config_channel': 'management_create_channel',
            'management.remove_config_channel': 'management_remove_channel',
            'management.list_file_revisions': 'management_list_file_revisions',
            'management.list_files': 'management_list_files',
            'management.has_file': 'management_has_file',
            'management.put_file': 'management_put_file',
            'management.remove_file': 'management_remove_file',
            'management.diff': 'management_diff',
            'management.get_default_delimiters': 'management_get_delimiters',
            'management.get_maximum_file_size': 'management_get_maximum_file_size',
        })
        self.user = None
        self.default_delimiter = '@'

    _query_list_config_channels = rhnSQL.Statement("""
        select cc.name,
               cc.label,
               cct.label channel_type
          from rhnConfigChannelType cct,
               rhnConfigChannel cc
         where cc.org_id = :org_id
           and cc.confchan_type_id = cct.id
           and cct.label = 'normal'
         order by cc.label, cc.name
    """)

    def _get_and_validate_session(self, dict):
        session = dict.get('session')
        self._validate_session(session)

    def management_list_channels(self, dict):
        log_debug(1)
        self._get_and_validate_session(dict)
        return [x['label'] for x in rhnSQL.fetchall_dict(self._query_list_config_channels,
                                        org_id=self.org_id) or []]

    _query_lookup_config_channel = rhnSQL.Statement("""
        select id
          from rhnConfigChannel
         where org_id = :org_id
           and label = :config_channel
    """)

    def management_create_channel(self, dict):
        log_debug(1)
        self._get_and_validate_session(dict)

        config_channel = dict.get('config_channel')
        # XXX Validate the namespace

        config_channel_name = dict.get('config_channel_name') or config_channel
        config_channel_description = dict.get('description') or config_channel

        row = rhnSQL.fetchone_dict(self._query_lookup_config_channel,
                                   org_id=self.org_id, config_channel=config_channel)
        if row:
            raise rhnFault(4010, "Configuration channel %s already exists" %
                           config_channel, explain=0)

        insert_call = rhnSQL.Function('rhn_config.insert_channel',
                                      rhnSQL.types.NUMBER())
        config_channel_id = insert_call(self.org_id,
                                        'normal',
                                        config_channel_name,
                                        config_channel,
                                        config_channel_description)

        rhnSQL.commit()
        return {}

    _query_config_channel_by_label = rhnSQL.Statement("""
    select id
      from rhnConfigChannel
     where org_id = :org_id
       and label = :label
    """)

    def management_remove_channel(self, dict):
        log_debug(1)
        self._get_and_validate_session(dict)

        config_channel = dict.get('config_channel')
        # XXX Validate the namespace

        row = rhnSQL.fetchone_dict(self._query_config_channel_by_label,
                                   org_id=self.org_id, label=config_channel)

        if not row:
            raise rhnFault(4009, "Channel not found")

        delete_call = rhnSQL.Procedure('rhn_config.delete_channel')

        try:
            delete_call(row['id'])
        except rhnSQL.SQLError:
            e = sys.exc_info()[1]
            errno = e.args[0]
            if errno == 2292:
                raise_with_tb(rhnFault(4005, "Cannot remove non-empty channel %s" %
                               config_channel, explain=0), sys.exc_info()[2])
            raise

        log_debug(5, "Removed:", config_channel)
        rhnSQL.commit()
        return ""

    _query_management_list_files = rhnSQL.Statement("""
        select cc.label config_channel,
               cfn.path
          from rhnConfigFileName cfn,
               rhnConfigFileState cfs,
               rhnConfigFile cf,
               rhnConfigChannel cc
         where cc.org_id = :org_id
           and cc.label = :config_channel
           and cc.id = cf.config_channel_id
           and cf.state_id = cfs.id
           and cfs.label = 'alive'
           and cf.config_file_name_id = cfn.id
    """)

    def management_list_files(self, dict):
        log_debug(1)
        self._get_and_validate_session(dict)

        config_channel = dict.get('config_channel')
        # XXX Validate the config channel

        log_debug(3, "Org id", self.org_id, "Config channel", config_channel)

        h = rhnSQL.prepare(self._query_management_list_files)
        h.execute(org_id=self.org_id, config_channel=config_channel)

        retval = []
        while 1:
            row = h.fetchone_dict()
            if not row:
                break
            val = {}
            # Only copy a subset of the keys
            for f in ['config_channel', 'path']:
                val[f] = row[f]

            retval.append(val)
        log_debug(4, "pre sort", retval)
        retval.sort(lambda x, y: cmp(x['path'], y['path']))
        log_debug(4, "Return value", retval)
        return retval

    def management_get_file(self, dict):
        log_debug(1)
        self._get_and_validate_session(dict)

        config_channel = dict.get('config_channel')
        # XXX Validate the namespace
        path = dict.get('path')
        revision = dict.get('revision')

        row = self._get_file(config_channel, path, revision=revision)
        if not row:
            raise rhnFault(4011, "File %s does not exist in channel %s" %
                           (path, config_channel), explain=0)

        return self._format_file_results(row)

    _query_list_file_revisions = rhnSQL.Statement("""
        select cr.revision
          from rhnConfigChannel cc,
               rhnConfigRevision cr,
               rhnConfigFile cf
         where cf.config_channel_id = cc.id
           and cc.label = :config_channel
           and cc.org_id = :org_id
           and cf.config_file_name_id = lookup_config_filename(:path)
           and cr.config_file_id = cf.id
         order by revision desc
    """)

    def management_list_file_revisions(self, dict):
        log_debug(1)
        self._get_and_validate_session(dict)

        config_channel = dict.get('config_channel')
        # XXX Validate the namespace
        path = dict.get('path')

        retval = [x['revision'] for x in rhnSQL.fetchall_dict(self._query_list_file_revisions,
                                          org_id=self.org_id, config_channel=config_channel, path=path) or []]
        if not retval:
            raise rhnFault(4011, "File %s does not exist in channel %s" %
                           (path, config_channel), explain=0)

        return retval

    def management_has_file(self, dict):
        log_debug(1)
        self._get_and_validate_session(dict)

        config_channel = dict.get('config_channel')
        # XXX Validate the namespace
        path = dict.get('path')
        row = self._get_file(config_channel, path)
        if not row:
            return {}
        return {
            'revision': row['revision'],
        }

    _query_get_file = """
        select :path path,
               cc.label config_channel,
               ccont.contents file_contents,
               ccont.is_binary,
               c.checksum_type,
               c.checksum,
               ccont.delim_start, ccont.delim_end,
               cr.revision,
               cf.modified,
               ci.username,
               ci.groupname,
               ci.filemode,
               cft.label,
               ci.selinux_ctx,
           case
                when cft.label='symlink' then (select path from rhnConfigFileName where id = ci.SYMLINK_TARGET_FILENAME_ID)
                else ''
            end as symlink
          from rhnConfigChannel cc,
               rhnConfigInfo ci,
               rhnConfigRevision cr
          left join rhnConfigContent ccont
            on cr.config_content_id = ccont.id
          left join rhnChecksumView c
            on ccont.checksum_id = c.id,
               rhnConfigFile cf,
               rhnConfigFileType cft
         where cf.config_channel_id = cc.id
           and cc.label = :config_channel
           and cc.org_id = :org_id
           and cf.config_file_name_id = lookup_config_filename(:path)
           and cr.config_file_id = cf.id
           and cr.config_info_id = ci.id
           and cr.config_file_type_id = cft.id
    """
    _query_get_file_latest = rhnSQL.Statement(_query_get_file + """
           and cf.latest_config_revision_id = cr.id
           """)
    _query_get_file_revision = rhnSQL.Statement(_query_get_file + """
           and cr.revision = :revision
           """)

    def _get_file(self, config_channel, path, revision=None):
        log_debug(2, config_channel, path)
        params = {
            'org_id': self.org_id,
            'config_channel': config_channel,
            'path': path,
        }
        if revision is None:
            # Fetch the latest
            q = self._query_get_file_latest
        else:
            params['revision'] = revision
            q = self._query_get_file_revision
        log_debug(4, params)
        return rhnSQL.fetchone_dict(q, **params)

    _query_lookup_config_file_by_channel = rhnSQL.Statement("""
        select cf.id,
               cf.state_id
          from rhnConfigFile cf,
               rhnConfigChannel cc
         where cc.org_id = :org_id
           and cf.config_channel_id = cc.id
           and cc.label = :config_channel
           and cf.config_file_name_id = lookup_config_filename(:path)
    """)

    def management_remove_file(self, dict):
        log_debug(1)
        self._get_and_validate_session(dict)

        config_channel = dict.get('config_channel')
        # XXX Validate the namespace
        path = dict.get('path')

        row = rhnSQL.fetchone_dict(self._query_lookup_config_file_by_channel,
                                   org_id=self.org_id, config_channel=config_channel, path=path)
        if not row:
            raise rhnFault(4011, "File %s does not exist in channel %s" %
                           (path, config_channel), explain=0)

        config_file_id = row['id']

        delete_call = rhnSQL.Procedure("rhn_config.delete_file")
        delete_call(config_file_id)

        rhnSQL.commit()

        return {}

    _query_update_file_state = rhnSQL.Statement("""
        update rhnConfigFile
           set state_id = :state_id
         where id = :config_file_id
    """)

    def management_disable_file(self, dict):
        log_debug(1)
        self._get_and_validate_session(dict)

        config_channel = dict.get('config_channel')
        # XXX Validate the namespace
        path = dict.get('path')

        t = rhnSQL.Table('rhnConfigFileState', 'label')
        state_id_dead = t['dead']['id']

        row = rhnSQL.fetchone_dict(self._query_lookup_config_file_by_channel,
                                   config_channel=config_channel, path=path)
        if not row or row['state_id'] == state_id_dead:
            raise rhnFault(4011, "File %s does not exist in channel %s" %
                           (path, config_channel), explain=0)

        rhnSQL.execute(self._query_update_file_state,
                       config_file_id=row['id'], state_id=state_id_dead)
        rhnSQL.commit()
        return {}

    def management_put_file(self, dict):
        log_debug(1)
        self._get_and_validate_session(dict)

        config_channel = dict.get('config_channel')
        row = self.lookup_org_config_channel_by_name(config_channel)
        conf_channel_id = row['id']

        file_path = dict.get('path')
        result = self.push_file(conf_channel_id, dict)

        file_too_large = result.get('file_too_large')
        if file_too_large:
            raise rhnFault(4003, "File %s is too large (%s bytes)" %
                           (dict['path'], dict['size']), explain=0)

        rhnSQL.commit()
        return {}

    def management_get_delimiters(self, dict):
        log_debug(1)
        self._get_and_validate_session(dict)

        return self._get_delimiters()

    def management_get_maximum_file_size(self, dict={}):
        log_debug(1)
        self._get_and_validate_session(dict)

        return self._get_maximum_file_size()

    def __attributes_differ(self, fsrc, fdst):
        """ Returns true if acl, ownership, type or selinux context differ. """
        return (fsrc['filemode'] != fdst['filemode']) or (fsrc['label'] != fdst['label']) or \
               (fsrc['username'] != fdst['username']) or (fsrc['groupname'] != fdst['groupname']) or \
               (fsrc['selinux_ctx'] != fdst['selinux_ctx'])

    def __header(self, path, fsrc, config_channel_src, fdst, config_channel_dst):
        """ Returns diff like header for this two files. """
        template = "--- %s\t%s\tattributes: %s %s %s %s\tconfig channel: %s\trevision: %s"
        first_row = template % (path, f_date(fsrc['modified']), ostr_to_sym(fsrc['filemode'], fsrc['label']),
                                fsrc['username'], fsrc['groupname'], fsrc['selinux_ctx'], config_channel_src,
                                fsrc['revision'],
                                )
        second_row = template % (path, f_date(fdst['modified']), ostr_to_sym(fdst['filemode'], fdst['label']),
                                 fdst['username'], fdst['groupname'], fdst['selinux_ctx'], config_channel_dst,
                                 fdst['revision'],
                                 )
        return (first_row, second_row)

    def management_diff(self, dict):
        log_debug(1)
        self._get_and_validate_session(dict)

        param_names = ['config_channel_src', 'revision_src', 'path', ]
        for p in param_names:
            val = dict.get(p)
            if val is None:
                raise rhnFault(4007, "No content sent for `%s'" % p)

        log_debug(4, "Params sent", dict)
        path = dict['path']

        config_channel_src = dict['config_channel_src']
        revision_src = dict.get('revision_src')
        fsrc = self._get_file_revision(config_channel_src, revision_src, path)

        config_channel_dst = dict.get('config_channel_dst')
        if config_channel_dst is None:
            config_channel_dst = config_channel_src
        revision_dst = dict.get('revision_dst')
        fdst = self._get_file_revision(config_channel_dst, revision_dst, path)

        if fsrc['label'] != fdst['label']:
            raise rhnFault(4017,
                           "Path %s  is a %s in channel %s while it is a %s in channel %s"
                           % (path, fsrc['label'],
                              config_channel_src, fdst['label'], config_channel_dst),
                           explain=0)

        if fsrc['label'] == 'symlink':
            if (fsrc["symlink"] != fdst['symlink']) or self.__attributes_differ(fsrc, fdst):
                (first_row, second_row) = self.__header(path, fsrc, config_channel_src, fdst, config_channel_dst)
                first_row += ' target: %s' % fsrc["symlink"]
                second_row += ' target: %s' % fdst["symlink"]
                return first_row + "\n" + second_row + "\n"
            return ""

        diff = difflib.unified_diff(
            fsrc['file_content'], fdst['file_content'], path, path, fsrc['modified'], fdst['modified'], lineterm='')
        try:
            first_row = next(diff)
        except StopIteration:
            return ""

        if not first_row.startswith('---'):
            # Hmm, weird
            return first_row + '\n'.join(list(diff))

        try:
            second_row = next(diff)
        except StopIteration:
            second_row = ''

        if not second_row.startswith('+++'):
            # Hmm, weird
            return second_row + '\n'.join(list(diff))

        (first_row, second_row) = self.__header(path, fsrc, config_channel_src, fdst, config_channel_dst)
        return first_row + "\n" + second_row + '\n' + '\n'.join(list(diff))

    def _get_file_revision(self, config_channel, revision, path):
        if revision and not revision.isdigit():
            raise rhnFault(4016, "Invalid revision number '%s' specified for path %s "
                           "in channel %s" % (revision, path, config_channel),
                           explain=0)

        f = self._get_file(config_channel, path, revision=revision)
        if not f:
            raise rhnFault(4011, "File %s (revision %s) does not exist "
                           "in channel %s" % (path, revision, config_channel),
                           explain=0)
        if f['label'] == 'file' and f['is_binary'] == 'Y':
            raise rhnFault(4004, "File %s (revision %s) seems to contain "
                           "binary data" % (path, revision),
                           explain=0)

        # We have to read the contents of the first file here, because the LOB
        # object is tied to a cursor; if we re-execute the cursor, the LOB
        # seems to be invalid (bug 151220)

        # Empty files or directories may have NULL instead of lobs
        fc_lob = f.get('file_contents')
        if fc_lob:
            f['file_content'] = rhnSQL._fix_encoding(rhnSQL.read_lob(fc_lob)).splitlines()
        else:
            f['file_content'] = ''
        return f

    # Helper functions
    _query_org_config_channels = rhnSQL.Statement("""
        select cc.id, cc.label, cc.name, cct.label channel_type
          from rhnConfigChannelType cct, rhnConfigChannel cc
         where cc.label = :config_channel
           and cc.org_id = :org_id
           and cc.confchan_type_id = cct.id
    """)

    def lookup_org_config_channel_by_name(self, config_channel):
        row = rhnSQL.fetchone_dict(self._query_org_config_channels,
                                   config_channel=config_channel, org_id=self.org_id)
        if not row:
            raise rhnFault(4009, "Configuration channel %s does not exist" %
                           config_channel, explain=0)
        return row

    def _check_user_role(self):
        user_roles = self.user.get_roles()
        if 'config_admin' in user_roles or 'org_admin' in user_roles:
            # All good
            return

        raise rhnFault(4006,
                       "User is not a allowed to manage config files")
 07070100000169000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002600000000spacewalk-backend/server/handlers/sat 0707010000016A000081B40000000000000000000000015FBBE8EE00000087000000000000000000000000000000000000002F00000000spacewalk-backend/server/handlers/sat/Makefile    # Makefile for the sat module
#

TOP	= ../../..
SUBDIR	= server/handlers/sat

FILES	= __init__ auth cert

include $(TOP)/Makefile.defs
 0707010000016B000081B40000000000000000000000015FBBE8EE0000034F000000000000000000000000000000000000003200000000spacewalk-backend/server/handlers/sat/__init__.py #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# This file defines the classes available for the satellite

__all__ = []

from . import auth
from . import cert

rpcClasses = {
    'authentication':   auth.Authentication,
    'certificate':   cert.Certificate,
}

getHandler = None
 0707010000016C000081B40000000000000000000000015FBBE8EE00000D7F000000000000000000000000000000000000002E00000000spacewalk-backend/server/handlers/sat/auth.py #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# Satellite specific authentication xmlrpc method.

import time
import sys
from rhn.connections import idn_puny_to_unicode

from spacewalk.common.rhnLog import log_debug
from spacewalk.common.rhnConfig import CFG
from spacewalk.common.rhnException import rhnFault
from spacewalk.common.rhnTranslate import _
from spacewalk.server.rhnHandler import rhnHandler
from spacewalk.server import rhnLib
from spacewalk.server import rhnSQL


class Authentication(rhnHandler):

    """ Simple authentication based on hostname and configured slaves """

    def __init__(self):
        log_debug(3)
        rhnHandler.__init__(self)
        self.functions.append('check')
        self.functions.append('login')

        # this is populated directly by server.apacheRequest.py
        self.remote_hostname = ''

    def auth_system(self):
        if CFG.DISABLE_ISS:
            raise rhnFault(2005, _('ISS is disabled on this server.'))

        if not rhnSQL.fetchone_dict("select 1 from rhnISSSlave where slave = :hostname and enabled = 'Y'",
                                    hostname=idn_puny_to_unicode(self.remote_hostname)):
            raise rhnFault(2004,
                           _('Server "%s" is not enabled for ISS.')
                           % self.remote_hostname)
        return self.remote_hostname

    def check(self, system_id_ignored):
        """xmlrpc authentication.
        """
        log_debug(3)

        # Authenticate server
        try:
            self.auth_system()
        except rhnFault:
            e = sys.exc_info()[1]
            if e.code == 2002:
                # Return an error code
                return 0
            # Pass the exception through
            raise
        # This is a satellite
        return 1

    # Log in routine.
    def login(self, system_id, extra_data={}):
        """Return a dictionary of session token/channel information.
           Also sets this information in the headers.
        """
        log_debug(5, self.remote_hostname)
        # Authenticate the system certificate.
        self.auth_system()

        # log the entry
        log_debug(1, self.remote_hostname)

        rhnServerTime = str(time.time())
        expireOffset = str(CFG.SATELLITE_AUTH_TIMEOUT)
        signature = rhnLib.computeSignature(CFG.SECRET_KEY,
                                            self.remote_hostname,
                                            rhnServerTime,
                                            expireOffset)

        loginDict = {
            'X-RHN-Server-Hostname': self.remote_hostname,
            'X-RHN-Auth': signature,
            'X-RHN-Auth-Server-Time': rhnServerTime,
            'X-RHN-Auth-Expire-Offset': expireOffset,
        }

        # XXX This request is not proxy-cacheable
        log_debug(5, "loginDict", loginDict)

        return loginDict
 0707010000016D000081B40000000000000000000000015FBBE8EE000006E4000000000000000000000000000000000000002E00000000spacewalk-backend/server/handlers/sat/cert.py #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# Satellite only package downloading methods.

# common imports
from spacewalk.common.rhnLog import log_debug
from spacewalk.common.rhnException import rhnException

# server imports
from spacewalk.server import rhnSQL
from .auth import Authentication


class Certificate(Authentication):

    """ Downloads the satellite cert """

    def __init__(self):
        log_debug(3)
        Authentication.__init__(self)
        self.functions = [
            'download',
        ]

    def download(self, system_id):
        log_debug(3)
        self.auth_system(system_id)

        server_id = self.server.server['id']
        h = rhnSQL.prepare("""
            select cert
              from rhnSatelliteInfo si
             where si.server_id = :server_id""")
        h.execute(server_id=server_id)
        row = h.fetchone_dict()
        if not row:
            # This should not happen - we're already authenticated
            raise rhnException("SUSE Manager Server certificate is unavailable after authentication?")

        # Bugzilla #219625
        # cert is now a blob
        cert = row['cert']
        cert = cert.read()

        return cert
0707010000016E000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002900000000spacewalk-backend/server/handlers/xmlrpc  0707010000016F000081B40000000000000000000000015FBBE8EE000000E0000000000000000000000000000000000000003200000000spacewalk-backend/server/handlers/xmlrpc/Makefile # Makefile for the xmlrpc module
#

TOP	= ../../..
SUBDIR	= server/handlers/xmlrpc

FILES	= __init__ country queue registration states up2date errata \
	  getMethod proxy get_handler abrt scap

include $(TOP)/Makefile.defs

07070100000170000081B40000000000000000000000015FBBE8EE0000048D000000000000000000000000000000000000003500000000spacewalk-backend/server/handlers/xmlrpc/__init__.py  #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# This file defines the classes available for the XMLRPC receiver
#

__all__ = []

from . import registration
from . import up2date
from . import queue
from . import errata
from . import proxy
from . import get_handler
from . import abrt
from . import scap

rpcClasses = {
    "registration": registration.Registration,
    "up2date": up2date.Up2date,
    "queue": queue.Queue,
    "errata": errata.Errata,
    "proxy": proxy.Proxy,
    "servers": up2date.Servers,
    "abrt": abrt.Abrt,
    "scap": scap.Scap,
}

getHandler = get_handler.GetHandler
   07070100000171000081B40000000000000000000000015FBBE8EE00003694000000000000000000000000000000000000003100000000spacewalk-backend/server/handlers/xmlrpc/abrt.py  #
# Copyright (c) 2012--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import base64
import os
import stat

from spacewalk.common.rhnException import rhnFault
from spacewalk.common.rhnConfig import CFG
from uyuni.common.rhnLib import parseRPMName
from spacewalk.common.rhnLog import log_debug
from spacewalk.server import rhnSQL
from spacewalk.server.rhnHandler import rhnHandler
from spacewalk.server.rhnLib import get_crash_path, get_crashfile_path

_query_get_crash = rhnSQL.Statement("""
select id
  from rhnServerCrash
 where server_id = :server_id and
       crash = :crash
""")

_query_create_crash = rhnSQL.Statement("""
insert into rhnServerCrash (
       id,
       server_id,
       crash,
       path,
       count,
       storage_path)
values (
       sequence_nextval('rhn_server_crash_id_seq'),
       :server_id,
       :crash,
       :path,
       :crash_count,
       :storage_path)
""")

_query_update_pkg_data1 = rhnSQL.Statement("""
update rhnServerCrash
   set package_name_id = lookup_package_name(:pkg_name),
       package_evr_id = lookup_evr(:pkg_epoch, :pkg_version, :pkg_release)
 where id = :crash_id
""")

_query_update_pkg_data2 = rhnSQL.Statement("""
update rhnServerCrash
   set package_name_id = lookup_package_name(:pkg_name),
       package_evr_id = lookup_evr(:pkg_epoch, :pkg_version, :pkg_release),
       package_arch_id = lookup_package_arch(:pkg_arch)
 where id = :crash_id
""")

_query_update_watched_items = """
update rhnServerCrash
   set %s = :filecontent
 where id = :crash_id
"""

_query_update_crash_count = """
update rhnServerCrash
   set count = :crash_count
 where server_id = :server_id and
       crash = :crash
"""

_query_get_crashfile_sizelimit = """
select crash_file_sizelimit
  from rhnOrgConfiguration
 where org_id = :org_id
"""

_query_set_crashfile_upload_flag = """
update rhnServerCrashFile
   set is_uploaded = 'Y'
 where id = (
       select scf.id as id
         from rhnServerCrashFile scf,
              rhnServerCrash sc
        where scf.crash_id = sc.id and
              scf.crash_id = :crash_id and
              sc.server_id = :server_id and
              scf.filename = :filename and
              scf.path = :path and
              scf.filesize = :filesize
       )
"""

_query_get_crash_reporting_settings = """
select crash_reporting_enabled
  from rhnOrgConfiguration
 where org_id = :org_id
"""

_query_get_crashfile_upload_settings = """
select crashfile_upload_enabled
  from rhnOrgConfiguration
 where org_id = :org_id
"""


class Abrt(rhnHandler):

    def __init__(self):
        rhnHandler.__init__(self)
        self.functions.append('create_crash')
        self.functions.append('update_crash_count')
        self.functions.append('upload_crash_file')
        self.functions.append('is_crashfile_upload_enabled')
        self.functions.append('get_crashfile_uploadlimit')

        self.watched_items = ['analyzer',
                              'architecture',
                              'cmdline',
                              'component',
                              'count',
                              'executable',
                              'kernel',
                              'reason',
                              'username',
                              'uuid']

    def _get_crash_id(self, server_id, crash):
        h = rhnSQL.prepare(_query_get_crash)
        h.execute(server_id=self.server_id, crash=crash)
        r = h.fetchall_dict()

        if (r is None):
            return None
        else:
            return r[0]['id']

    def _create_or_update_crash_file(self, server_id, crash_id, filename, path, filesize):
        insert_call = rhnSQL.Function("insert_crash_file", rhnSQL.types.NUMBER())
        return insert_call(crash_id, filename, path, filesize)

    def _update_package_data(self, crash_id, pkg_data):
        log_debug(1, "_update_package_data: %s, %s" % (crash_id, pkg_data))
        # Older versions of abrt used to store the package info in a single 'package' file
        if pkg_data and 'package' in pkg_data:
            (n, e, v, r) = parseRPMName(pkg_data['package'])
            if not all((n, e, v, r)):
                return 0

            h = rhnSQL.prepare(_query_update_pkg_data1)
            r = h.execute(
                crash_id=crash_id,
                pkg_name=n,
                pkg_epoch=e,
                pkg_version=v,
                pkg_release=r)
            rhnSQL.commit()

            return r

        for item in ['pkg_name', 'pkg_epoch', 'pkg_version', 'pkg_release', 'pkg_arch']:
            if not (item in pkg_data and pkg_data[item]):
                return 0

        h = rhnSQL.prepare(_query_update_pkg_data2)
        r = h.execute(
            crash_id=crash_id,
            pkg_name=pkg_data['pkg_name'],
            pkg_epoch=pkg_data['pkg_epoch'],
            pkg_version=pkg_data['pkg_version'],
            pkg_release=pkg_data['pkg_release'],
            pkg_arch=pkg_data['pkg_arch'])
        rhnSQL.commit()

        return r

    def _get_crashfile_sizelimit(self):
        h = rhnSQL.prepare(_query_get_crashfile_sizelimit)
        h.execute(org_id=self.server.server['org_id'])
        return h.fetchall_dict()[0]['crash_file_sizelimit']

    def _set_crashfile_upload_flag(self, server_id, crash_id, filename, path, filesize):
        h = rhnSQL.prepare(_query_set_crashfile_upload_flag)
        r = h.execute(
            server_id=server_id,
            crash_id=crash_id,
            filename=filename,
            path=path,
            filesize=filesize)
        rhnSQL.commit()

        return r

    def _is_crash_reporting_enabled(self, org_id):
        h = rhnSQL.prepare(_query_get_crash_reporting_settings)
        h.execute(org_id=org_id)
        r = h.fetchall_dict()

        if (r[0]['crash_reporting_enabled'] == 'Y'):
            return True
        else:
            return False

    def _is_crashfile_uploading_enabled(self, org_id):
        h = rhnSQL.prepare(_query_get_crashfile_upload_settings)
        h.execute(org_id=org_id)
        r = h.fetchall_dict()

        if (r[0]['crashfile_upload_enabled'] == 'Y'):
            return True
        else:
            return False

    def _check_crash_reporting_setting(self):
        if not self._is_crash_reporting_enabled(self.server.server['org_id']):
            log_debug(1, "Crash reporting is disabled for this server's organization.")
            raise rhnFault(5006)

    def create_crash(self, system_id, crash_data, pkg_data):
        self.auth_system(system_id)
        log_debug(1, self.server_id, crash_data, pkg_data)

        self._check_crash_reporting_setting()

        if not ('crash' in crash_data and 'path' in crash_data) or \
           not (crash_data['crash'] and crash_data['path']):
            log_debug(1, self.server_id, "The crash information is invalid or incomplete: %s" % str(crash_data))
            raise rhnFault(5000)

        server_org_id = self.server.server['org_id']
        server_crash_dir = get_crash_path(str(server_org_id), str(self.server_id), crash_data['crash'])
        if not server_crash_dir:
            log_debug(1, self.server_id, "Error composing crash directory path")
            raise rhnFault(5002)

        crash_id = self._get_crash_id(self.server_id, crash_data['crash'])
        log_debug(1, "crash_id: %s" % crash_id)

        if (crash_id is None):
            if 'count' not in crash_data:
                crash_data['count'] = 1

            h = rhnSQL.prepare(_query_create_crash)
            h.execute(
                server_id=self.server_id,
                crash=crash_data['crash'],
                path=crash_data['path'],
                crash_count=crash_data['count'],
                storage_path=server_crash_dir)
            rhnSQL.commit()
            self._update_package_data(self._get_crash_id(self.server_id, crash_data['crash']), pkg_data)
            return 1
        else:
            return 0

    def upload_crash_file(self, system_id, crash, crash_file):
        self.auth_system(system_id)
        self._check_crash_reporting_setting()

        required_keys = ['filename', 'path', 'filesize', 'filecontent', 'content-encoding']
        for k in required_keys:
            if k not in crash_file:
                log_debug(1, self.server_id, "The crash file data is invalid or incomplete: %s" % crash_file)
                raise rhnFault(5001, "Missing or invalid key: %s" % k)

        log_debug(1, self.server_id, crash, crash_file['filename'])

        server_org_id = self.server.server['org_id']
        server_crash_dir = get_crash_path(str(server_org_id), str(self.server_id), crash)
        if not server_crash_dir:
            log_debug(1, self.server_id, "Error composing crash directory path")
            raise rhnFault(5002)

        server_filename = get_crashfile_path(str(server_org_id),
                                             str(self.server_id),
                                             crash,
                                             crash_file['filename'])
        if not server_filename:
            log_debug(1, self.server_id, "Error composing crash file path")
            raise rhnFault(5003)

        if not crash_file['content-encoding'] == 'base64':
            log_debug(1, self.server_id, "Invalid content encoding: %s" % crash_file['content-encoding'])
            raise rhnFault(5004, "Invalid content encodig: %s" % crash_file['content-encoding'])

        crash_id = self._get_crash_id(self.server_id, crash)
        if not crash_id:
            log_debug(1, self.server_id, "No record for crash: %s" % crash)
            raise rhnFault(5005, "Invalid crash name: %s" % crash)

        # Create or update the crash file record in DB
        self._create_or_update_crash_file(self.server_id, crash_id, crash_file['filename'],
                                          crash_file['path'], crash_file['filesize'])
        rhnSQL.commit()

        # Create the file on filer
        if not self._is_crashfile_uploading_enabled(server_org_id):
            return 1
        filecontent = base64.decodestring(crash_file['filecontent'])
        claimed_filesize = crash_file['filesize']
        filesize = len(filecontent)
        sizelimit = self._get_crashfile_sizelimit()
        if (claimed_filesize > sizelimit or filesize > sizelimit) and sizelimit != 0:
            if filesize == 0:
                filesize = claimed_filesize
            log_debug(1, "The file [%s] size (%s bytes) is more than allowed (%s bytes), skipping."
                      % (crash_file['path'], filesize, sizelimit))
            return 0
        absolute_dir = os.path.join(CFG.MOUNT_POINT, server_crash_dir)
        absolute_file = os.path.join(absolute_dir, crash_file['filename'])

        if not os.path.exists(absolute_dir):
            log_debug(1, self.server_id, "Creating crash directory: %s" % absolute_dir)
            os.makedirs(absolute_dir)
            mode = stat.S_IRWXU | stat.S_IRWXG | stat.S_IROTH | stat.S_IXOTH
            os.chmod(absolute_dir, mode)
            os.chmod(os.path.dirname(os.path.normpath(absolute_dir)), mode)

        log_debug(1, self.server_id, "Creating crash file: %s" % absolute_file)
        f = open(absolute_file, 'w+')
        f.write(filecontent)
        f.close()

        self._set_crashfile_upload_flag(self.server_id, crash_id, crash_file['filename'],
                                        crash_file['path'], crash_file['filesize'])

        if crash_file['filename'] in self.watched_items:
            # 'username' contains an extra '\n' at the end
            if crash_file['filename'] == 'username':
                filecontent = filecontent.strip()
            st = rhnSQL.Statement(_query_update_watched_items % crash_file['filename'])
            h = rhnSQL.prepare(st)
            h.execute(filecontent=filecontent, crash_id=crash_id)
            rhnSQL.commit()

        return 1

    def update_crash_count(self, system_id, crash, crash_count):
        self.auth_system(system_id)

        log_debug(1, self.server_id, "Updating crash count for %s to %s" % (crash, crash_count))

        server_org_id = self.server.server['org_id']
        server_crash_dir = get_crash_path(str(server_org_id), str(self.server_id), crash)
        if not server_crash_dir:
            log_debug(1, self.server_id, "Error composing crash directory path")
            raise rhnFault(5002)

        h = rhnSQL.prepare(_query_update_crash_count)
        r = h.execute(
            crash_count=crash_count,
            server_id=self.server_id,
            crash=crash)
        rhnSQL.commit()

        if r == 0:
            log_debug(1, self.server_id, "No record for crash: %s" % crash)
            raise rhnFault(5005, "Invalid crash name: %s" % crash)

        absolute_dir = os.path.join(CFG.MOUNT_POINT, server_crash_dir)
        absolute_file = os.path.join(absolute_dir, 'count')

        log_debug(1, self.server_id, "Updating crash count file: %s" % absolute_file)
        f = open(absolute_file, 'w+')
        f.write(crash_count)
        f.close()

        return 1

    def is_crashfile_upload_enabled(self, system_id):
        self.auth_system(system_id)
        return self._is_crashfile_uploading_enabled(self.server.server['org_id'])

    def get_crashfile_uploadlimit(self, system_id):
        self.auth_system(system_id)
        return self._get_crashfile_sizelimit()
07070100000172000081B40000000000000000000000015FBBE8EE00001AB6000000000000000000000000000000000000003400000000spacewalk-backend/server/handlers/xmlrpc/country.py   #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# states.py                                     - Abbreviations for countries.
#-----------------------------------------------------------------------------


country_to_iso = {
    'Afghanistan': 'AF',
    'Albania': 'AL',
    'Algeria': 'DZ',
    'American Samoa': 'AS',
    'Andorra': 'AD',
    'Angola': 'AO',
    'Anguilla': 'AI',
    'Antarctica': 'AQ',
    'Antigua and Barbuda': 'AG',
    'Argentina': 'AR',
    'Armenia': 'AM',
    'Aruba': 'AW',
    'Australia': 'AU',
    'Austria': 'AT',
    'Azerbaijan': 'AZ',
    'Bahamas': 'BS',
    'Bahrain': 'BH',
    'Bangladesh': 'BD',
    'Barbados': 'BB',
    'Belarus': 'BY',
    'Belgium': 'BE',
    'Belize': 'BZ',
    'Benin': 'BJ',
    'Bermuda': 'BM',
    'Bhutan': 'BT',
    'Bolivia': 'BO',
    'Bosnia and Herzegovina': 'BA',
    'Botswana': 'BW',
    'Bouvet Island': 'BV',
    'Brazil': 'BR',
    'British Indian Ocean Territory': 'IO',
    'Brunei Darussalam': 'BN',
    'Bulgaria': 'BG',
    'Burkina Faso': 'BF',
    'Burundi': 'BI',
    'Cambodia': 'KH',
    'Cameroon': 'CM',
    'Canada': 'CA',
    'Cape Verde': 'CV',
    'Cayman Islands': 'KY',
    'Central African Republic': 'CF',
    'Chad': 'TD',
    'Chile': 'CL',
    'China': 'CN',
    'Christmas Island': 'CX',
    'Colombia': 'CO',
    'Comoros': 'KM',
    'Congo': 'CG',
    'Cook Islands': 'CK',
    'Costa Rica': 'CR',
    'Cote d\'Ivoire': 'CI',
    'Croatia': 'HR',
    'Cyprus': 'CY',
    'Czech Republic': 'CZ',
    'Denmark': 'DK',
    'Djibouti': 'DJ',
    'Dominica': 'DM',
    'Dominican Republic': 'DO',
    'East Timor': 'TP',
    'Ecuador': 'EC',
    'Egypt': 'EG',
    'El Salvador': 'SV',
    'Equatorial Guinea': 'GQ',
    'Eritrea': 'ER',
    'Estonia': 'EE',
    'Ethiopia': 'ET',
    'Falkland Islands (Malvinas)': 'FK',
    'Faroe Island': 'FO',
    'Fiji': 'FJ',
    'Finland': 'FI',
    'France (European Territory)': 'FX',
    'France': 'FR',
    'France, Metropolitan': 'FR',
    'French Guiana': 'GF',
    'French Polynesia': 'PF',
    'Gabon': 'GA',
    'Gambia': 'GM',
    'Georgia': 'GE',
    'Germany': 'DE',
    'Ghana': 'GH',
    'Gibraltar': 'GI',
    'Greece': 'GR',
    'Greenland': 'GL',
    'Grenada': 'GD',
    'Guadeloupe': 'GP',
    'Guam': 'GU',
    'Guatemala': 'GT',
    'Guinea-Bissau': 'GW',
    'Guinea': 'GN',
    'Guyana': 'GY',
    'Haiti': 'HT',
    'Heard and McDonald Island': 'HM',
    'Honduras': 'HN',
    'Hong Kong': 'HK',
    'Hungary': 'HU',
    'Iceland': 'IS',
    'India': 'IN',
    'Indian': 'IN',
    'Indonesia': 'ID',
    'Ireland': 'IE',
    'Israel': 'IL',
    'Italy': 'IT',
    'Jamaica': 'JM',
    'Japan': 'JP',
    'Jordan': 'JO',
    'Kazakhstan': 'KZ',
    'Kenya': 'KE',
    'Korea, Republic of': 'KR',
    'Kuwait': 'KW',
    'Kyrgyzstan': 'KG',
    'Laos': 'LA',
    'Latvia': 'LV',
    'Lebanon': 'LB',
    'Lesoth': 'LS',
    'Liberia': 'LR',
    'Libyan Arab Jamahiriya': 'LY',
    'Liechtenstein': 'LI',
    'Lithuania': 'LT',
    'Lithuania': 'LX',
    'Luxembourg': 'LU',
    'Macau': 'MO',
    'Macedonia': 'MK',
    'Madagascar': 'MG',
    'Malawi': 'MW',
    'Malaysia': 'MY',
    'Maldives': 'MV',
    'Mali': 'ML',
    'Malta': 'MT',
    'Marshall Islands': 'MH',
    'Martinique': 'MQ',
    'Mauritania': 'MR',
    'Mauritius': 'MU',
    'Mexico': 'MX',
    'Micronesia (Federated States of)': 'FM',
    'Moldova': 'MD',
    'Moldova, Republic of': 'MD',
    'Monaco': 'MC',
    'Mongolia': 'MN',
    'Montenegro': 'ME',
    'Montserrat': 'MS',
    'Morocco': 'MA',
    'Mozambique': 'MZ',
    'Namibia': 'NA',
    'Nederland': 'NL',
    'Nepal': 'NP',
    'Netherlands Antilles': 'AN',
    'Netherlands': 'NL',
    'New Caledonia': 'NC',
    'New Zealand': 'NZ',
    'Nicaragua': 'NI',
    'Nigeria': 'NG',
    'Niger': 'NE',
    'Norway': 'NO',
    'Oman': 'OM',
    'Pakistan': 'PK',
    'Palau': 'PW',
    'Panama': 'PA',
    'Papua New Guinea': 'PG',
    'Paraguay': 'PY',
    'Peru': 'PE',
    'Philippines': 'PH',
    'Pitcairn': 'PN',
    'Poland': 'PL',
    'Portugal': 'PT',
    'Puerto Rico': 'PR',
    'Qatar': 'QA',
    'Reunion Island': 'RE',
    'Romania': 'RO',
    'Russian Federation': 'RU',
    'Rwanda': 'RW',
    'Saint Kitts and Nevis': 'KN',
    'Saint Lucia': 'LC',
    'Saint Pierre and Miquelon': 'PM',
    'Saint Vincent and the Grenadines': 'VC',
    'Samoa': 'WS',
    'San Marino': 'SM',
    'Saudi Arabia': 'SA',
    'Serbia': 'RS',
    'Serbia and Montenegro': 'CS',
    'Senegal': 'SN',
    'Seychelles': 'SC',
    'Sierra Leone': 'SL',
    'Singapore': 'SG',
    'Slovakia': 'SK',
    'Slovenia': 'SI',
    'Solomon Islands': 'SB',
    'Somalia': 'SO',
    'South Africa': 'ZA',
    'Spain': 'ES',
    'Sri Lanka': 'LK',
    'Sudan': 'SD',
    'Suriname': 'SR',
    'Svalbard & Jan Mayen Island': 'SJ',
    'Swaziland': 'SZ',
    'Sweden': 'SE',
    'Switzerland': 'CH',
    'Syrian Arab Republic': 'SY',
    'Taiwan, Republic of': 'TW',
    'Tanzania, United Republic of': 'TZ',
    'Thailand': 'TH',
    'Togo': 'TG',
    'Tonga': 'TO',
    'Trinidad and Tobago': 'TT',
    'Tunisia': 'TN',
    'Turkey': 'TR',
    'Turkmenistan': 'TM',
    'Turks and Caicos Islands': 'TC',
    'Tuvalu': 'TV',
    'Uganda': 'UG',
    'Ukraine': 'UA',
    'United Arab Emirates': 'AE',
    'United Kingdom': 'GB',
    'United States': 'US',
    'Uruguay': 'UY',
    'US Minor Outlying Islands': 'UM',
    'Uzbekistan': 'UZ',
    'Vanuatu': 'VU',
    'Vatican City State (Holy See)': 'VA',
    'Venezuela': 'VE',
    'Vietnam': 'VN',
    'Virgin Islands (British)': 'VG',
    'Virgin Islands (U.S.)': 'VI',
    'Wallis and Futuna': 'WF',
    'Yemen': 'YE',
    'Yugoslavia': 'YU',
    'Zaire': 'ZR',
    'Zambia': 'ZM',
    'Zimbabwe': 'ZW',
}


t9_countries = {
    "Korea, Democratic People's Republic of": 'KP',
    'North Korea': 'KP',
    'Afghanistan': 'AF',
    'Cuba': 'CU',
    'Iran': 'IR',
    'Iraq': 'IQ',
    'Islamic Republic of Iran': 'IR',
    'Sudan': 'SD',
    'Syrian Arab Republic': 'AY'
}


#-----------------------------------------------------------------------------
if __name__ == "__main__":
    print("You can not run this module by itself")
    import sys
    sys.exit(-1)
#-----------------------------------------------------------------------------
  07070100000173000081B40000000000000000000000015FBBE8EE00002DB6000000000000000000000000000000000000003300000000spacewalk-backend/server/handlers/xmlrpc/errata.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# Implements the errata.* functions for XMLRPC
#

import re

# common modules imports
from spacewalk.common.rhnTranslate import _
from spacewalk.common import rhnFlags
from uyuni.common.rhnLib import parseRPMName
from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.common.rhnException import rhnFault

# server modules imports
from spacewalk.server.rhnHandler import rhnHandler
from spacewalk.server import rhnSQL, rhnCapability


class Errata(rhnHandler):

    """ Errata class --- retrieve (via xmlrpc) package errata. """

    def __init__(self):
        rhnHandler.__init__(self)
        # Exposed Errata functions:
        self.functions = []
        self.functions.append('GetByPackage')      # Clients v1-
        self.functions.append('getPackageErratum')  # Clients v2+
        self.functions.append('getErrataInfo')     # clients v2+
        self.functions.append('getErrataNamesById')

    def GetByPackage(self, pkg, osRel):
        """ Clients v1- Get errata for a package given "n-v-r" format
            IN:  pkg:   "n-v-r" (old client call)
                        or [n,v,r]
                 osRel: OS release
            RET: a hash by errata that applies to this package
                 (ie, newer packages are available). We also limit the scope
                 for a particular osRel.
        """
        if type(pkg) == type(''):  # Old client support.
            pkg = parseRPMName(pkg)
        log_debug(1, pkg, osRel)
        # Stuff the action in the headers:
        transport = rhnFlags.get('outputTransportOptions')
        transport['X-RHN-Action'] = 'GetByPackage'

        # now look up the errata
        if type(pkg[0]) != type(''):
            log_error("Invalid package name: %s %s" % (type(pkg[0]), pkg[0]))
            raise rhnFault(30, _("Expected a package name, not: %s") % pkg[0])
        # bug#186996:adding synopsis field to advisory info
        # client side changes are needed to access this data.
        h = rhnSQL.prepare("""
            select distinct
                    e.id            errata_id,
                    e.advisory_type errata_type,
                    e.advisory      advisory,
                    e.topic         topic,
                    e.description   description,
                    e.synopsis      synopsis
            from
                    rhnErrata e,
                    rhnPublicChannelFamily pcf,
                    rhnChannelFamilyMembers cfm,
                    rhnErrataPackage ep,
                    rhnChannelPackage cp,
                    rhnChannelErrata ce,
                    rhnDistChannelMap dcm,
                    rhnPackage p
            where    1=1
                and p.name_id = LOOKUP_PACKAGE_NAME(:name)
                -- map to a channel
                and p.id = cp.package_id
                and cp.channel_id = dcm.channel_id
                and dcm.release = :dist
                and dcm.org_id is null
                -- map to an errata as well
                and p.id = ep.package_id
                and ep.errata_id = e.id
                -- the errata and the channel have to be linked
                and ce.channel_id = cp.channel_id
                -- and the channel has to be public
                and cp.channel_id = cfm.channel_id
                and cfm.channel_family_id = pcf.channel_family_id
                -- and get the erratum
                and e.id = ce.errata_id
        """)
        h.execute(name=pkg[0], dist=str(osRel))
        return self._sanitize_result(h)

    def getPackageErratum(self, system_id, pkg):
        """ Clients v2+ - Get errata for a package given [n,v,r,e,a,...] format

            Sing-along: You say erratum(sing), I say errata(pl)! :)
            IN:  pkg:   [n,v,r,e,s,a,ch,...]
            RET: a hash by errata that applies to this package
        """
        log_debug(5, system_id, pkg)
        if type(pkg) != type([]) or len(pkg) < 7:
            log_error("Got invalid package specification: %s" % str(pkg))
            raise rhnFault(30, _("Expected a package, not: %s") % pkg)
        # Authenticate and decode server id.
        self.auth_system(system_id)
        # log the entry
        log_debug(1, self.server_id, pkg)
        # Stuff the action in the headers:
        transport = rhnFlags.get('outputTransportOptions')
        transport['X-RHN-Action'] = 'getPackageErratum'

        name, ver, rel, epoch, arch, size, channel = pkg[:7]
        if epoch in ['', 'none', 'None']:
            epoch = None

        # XXX: also, should arch/size/channel ever be used?
        # bug#186996:adding synopsis field to errata info
        # client side changes are needed to access this data.
        h = rhnSQL.prepare("""
        select distinct
            e.id            errata_id,
            e.advisory_type errata_type,
            e.advisory      advisory,
            e.topic         topic,
            e.description   description,
            e.synopsis      synopsis
        from
            rhnServerChannel sc,
            rhnChannelPackage cp,
            rhnChannelErrata ce,
            rhnErrata e,
            rhnErrataPackage ep,
            rhnPackage p
        where
            p.name_id = LOOKUP_PACKAGE_NAME(:name)
        and p.evr_id = LOOKUP_EVR(:epoch, :ver, :rel)
        -- map to a channel
        and p.id = cp.package_id
        -- map to an errata as well
        and p.id = ep.package_id
        and ep.errata_id = e.id
        -- the errata and the channel have to be linked
        and e.id = ce.errata_id
        and ce.channel_id = cp.channel_id
        -- and the server has to be subscribed to the channel
        and cp.channel_id = sc.channel_id
        and sc.server_id = :server_id
        """)  # " emacs sucks
        h.execute(name=name, ver=ver, rel=rel, epoch=epoch,
                  server_id=str(self.server_id))
        return self._sanitize_result(h)

    def _sanitize_result(self, h):
        ret = []
        # sanitize the results for display in the clients
        while 1:
            row = h.fetchone_dict()
            if row is None:
                break
            for k in list(row.keys()):
                if row[k] is None:
                    row[k] = "N/A"
            ret.append(row)

        return ret

    # I don't trust this errata_id business, but chip says "trust me"
    def getErrataInfo(self, system_id, errata_id):
        log_debug(5, system_id, errata_id)
        # Authenticate the server certificate
        self.auth_system(system_id)
        # log this thing
        log_debug(1, self.server_id, errata_id)

        client_caps = rhnCapability.get_client_capabilities()
        log_debug(3, "Client Capabilities", client_caps)
        multiarch = 0
        cap_info = None
        if client_caps and 'packages.update' in client_caps:
            cap_info = client_caps['packages.update']
        if cap_info and int(cap_info['version']) > 1:
            multiarch = 1

        statement = """
        select distinct
               pn.name,
               pe.epoch,
               pe.version,
               pe.release,
               pa.label arch
        from
               rhnPackageName pn,
               rhnPackageEVR pe,
               rhnPackage p,
               rhnPackageArch pa,
               rhnChannelPackage cp,
               rhnServerChannel sc,
               rhnErrataPackage ep
        where
                   ep.errata_id = :errata_id
               and ep.package_id = p.id
               and p.name_id = pn.id
               and p.evr_id = pe.id
               and p.package_arch_id = pa.id
               and sc.server_id = :server_id
               and sc.channel_id = cp.channel_id
               and cp.package_id = p.id
        """

        h = rhnSQL.prepare(statement)
        h.execute(errata_id=errata_id, server_id=self.server_id)

        packages = h.fetchall_dict()
        ret = []
        if not packages:
            return []

        for package in packages:
            if package['name'] is not None:
                if package['epoch'] is None:
                    package['epoch'] = ""

                pkg_arch = ''
                if multiarch:
                    pkg_arch = package['arch'] or ''
                ret.append([package['name'],
                            package['version'],
                            package['release'],
                            package['epoch'],
                            pkg_arch])
        return ret

    def getErrataNamesById(self, system_id, errata_ids):
        """Return a list of RhnErrata tuples of (id, advisory_name)

        IN: system_id - id of the system requesting this info (must be
            subscribed to the channel that contains the erratas)
            errata_ids - a list of RhnErrata ids

        Only the erratas that belong to channels that the client system
        is subscribed to are returned. If no erratas match this
        criterion, then an empty list is returned.

        """
        log_debug(5, system_id, errata_ids)
        self.auth_system(system_id)

        log_debug(1, self.server_id, errata_ids)

        sql_list, bound_vars = _bind_list(errata_ids)
        bound_vars.update({'server_id': self.server_id})

        sql = """SELECT DISTINCT e.id, e.advisory_name, c.update_tag
                 FROM rhnErrata e,
                      rhnServerChannel sc,
                      rhnChannelErrata ce,
                      rhnChannel c
                 WHERE e.id in (%s) AND
                       sc.server_id = :server_id AND
                       e.id = ce.errata_id AND
                       sc.channel_id = c.id AND
                       ce.channel_id = c.id"""
        h = rhnSQL.prepare(sql % sql_list)
        h.execute(**bound_vars)
        errata_list = h.fetchall()
        result = []
        regexp = re.compile(r"^([C-Z][A-Z]-)*SUSE-(.*)$")
        for eid, name, update_tag in errata_list:
            if update_tag:
                if regexp.match(name):
                    name = name.replace("SUSE", "SUSE-%s" % update_tag, 1)
                else:
                    name = "%s-%s" % (update_tag, name)
            result.append((eid, name))
        log_debug(2, self.server_id, errata_ids, result)
        return result


def _bind_list(elems):
    """Transform a list into an sql list with bound parameters

    IN: elems - a list of elements

    Returns a tuple of:
     sql_list - a comma separated list of parameter numbers: 'p_0, p_1, p_2'
     bound_vars - a dict of parameter names and values {'p_0': 42, 'p_1': 34}

    """
    bound_names = []
    bound_vars = {}
    for i, elem in enumerate(elems):
        bound_vars['p_%s' % i] = elem
        bound_names.append(':p_%s' % i)
    sql_list = ', '.join(bound_names)
    return sql_list, bound_vars

#-----------------------------------------------------------------------------
if __name__ == "__main__":
    print("You can not run this module by itself")
    import sys
    sys.exit(-1)
#-----------------------------------------------------------------------------
  07070100000174000081B40000000000000000000000015FBBE8EE00001484000000000000000000000000000000000000003600000000spacewalk-backend/server/handlers/xmlrpc/getMethod.py # Retrieve action method name given queued action information.
#
# Client code for Update Agent
#
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# An allowable xmlrpc method is retrieved given a base location, a
# hierarchical route to the class/module, and method name.
#

import string
import os
import sys
from uyuni.common.usix import ClassType, raise_with_tb
from distutils.sysconfig import get_python_lib

class GetMethodException(Exception):

    """Exception class"""
    pass


def sanity(methodNameComps):
    """ Verifies if all the components have proper names."""
    # Allowed characters in each string
    alpha = string.ascii_lowercase + string.ascii_uppercase
    allowedChars = alpha + string.digits + '_'
    for comp in methodNameComps:
        if not len(comp):
            raise GetMethodException("Empty method component")
        for c in comp:
            if c not in allowedChars:
                raise GetMethodException(
                    "Invalid character '%s' in the method name" % c)
        # Can only begin with a letter
        if comp[0] not in alpha:
            raise GetMethodException(
                "Method names should start with an alphabetic character")


def getMethod(methodName, baseClass):
    """ Retreive method given methodName, path to base of tree, and class/module
        route/label.
    """
    # First split the method name
    methodNameComps = ['spacewalk'] + baseClass.split('.') + methodName.split('.')
    # Sanity checks
    sanity(methodNameComps)
    # Build the path to the file
    path = get_python_lib()
    for index in range(len(methodNameComps)):
        comp = methodNameComps[index]
        path = "%s/%s" % (path, comp)
        # If this is a directory, fine...
        if os.path.isdir(path):
            # Okay, go on
            continue
        # Try to load this as a file
        for extension in ['py', 'pyc', 'pyo']:
            if os.path.isfile("%s.%s" % (path, extension)):
                # Yes, this is a file
                break
        else:
            # No dir and no file. Die
            raise GetMethodException("Action %s could not be found" % methodName)
        break
    else:
        # Only directories. This can't happen
        raise GetMethodException("Very wrong")

    # The position of the file
    fIndex = index + 1
    # Now build the module name
    modulename = '.'.join(methodNameComps[:fIndex])
    # And try to import it
    try:
        actions = __import__(modulename)
    except ImportError:
        raise_with_tb(GetMethodException("Could not import module %s" % modulename), sys.exc_info()[2])

    className = actions
    # Iterate through the list of components and try to load that specific
    # module/method
    for index in range(1, len(methodNameComps)):
        comp = methodNameComps[index]
        if index < fIndex:
            # This is a directory or a file we have to load
            if not hasattr(className, comp):
                # Hmmm... Not there
                raise GetMethodException("Class %s has no attribute %s" % (
                    '.'.join(methodNameComps[:index]), comp))
            className = getattr(className, comp)
            # print type(className)
            continue
        # A file or method
        # We look for the special __rhnexport__ array
        if not hasattr(className, '__rhnexport__'):
            raise GetMethodException("Class %s is not valid" % \
                                     '.'.join(methodNameComps[:index]))
        export = getattr(className, '__rhnexport__')
        if comp not in export:
            raise GetMethodException("Class %s does not export '%s'" % (
                '.'.join(methodNameComps[:index]), comp))
        className = getattr(className, comp)
        if type(className) is ClassType:
            # Try to instantiate it
            className = className()
        # print type(className)

    return className


#-----------------------------------------------------------------------------
if __name__ == '__main__':
    # Two valid ones and a bogus one
    methods = [
        'a.b.c.d.e.f',
        'a.b.c.d.e.foo.h',
        'a.b.c.d.e.g.h',
        'a.b.d.d.e.g.h',
        'a.b.d.d._e.g.h',
        'a.b.d.d.e_.g.h',
        'a.b.d.d.e-.g.h',
        'a.b.d.d..g.h',
    ]

    for m in methods:
        print(("----Running method %s: " % m))
        try:
            method = getMethod(m, 'Actions')
        except GetMethodException:
            e = sys.exc_info()[1]
            print(("Error getting the method %s: %s" % (m , e.args)))
        else:
            method()
#-----------------------------------------------------------------------------
07070100000175000081B40000000000000000000000015FBBE8EE00000350000000000000000000000000000000000000003800000000spacewalk-backend/server/handlers/xmlrpc/get_handler.py   #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# GET handler for /XMLRPC
#

from spacewalk.server import apacheRequest


class GetHandler(apacheRequest.GetHandler):

    """ handles the GET requests
                Inherit the behaviour from the parent class
        """
    pass
07070100000176000081B40000000000000000000000015FBBE8EE00002A9C000000000000000000000000000000000000003200000000spacewalk-backend/server/handlers/xmlrpc/proxy.py #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

# system module import
import time

from rhn.UserDictCase import UserDictCase

# common module imports
from rhn.UserDictCase import UserDictCase
from spacewalk.common import rhnFlags
from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.common.rhnConfig import CFG
from spacewalk.common.rhnException import rhnFault
from spacewalk.common.rhnTranslate import _

# local module imports
from spacewalk.server.rhnLib import computeSignature
from spacewalk.server.rhnHandler import rhnHandler
from spacewalk.server import rhnServer, rhnSQL, apacheAuth, rhnPackage, rhnChannel

# a class that provides additional authentication support for the
# proxy functions


class rhnProxyHandler(rhnHandler):

    def __init__(self):
        rhnHandler.__init__(self)

    def auth_system(self, system_id):
        """ System authentication. We override the standard function because
            we need to check additionally if this system_id is entitled for
            proxy functionality.
        """
        log_debug(3)
        server = rhnHandler.auth_system(self, system_id)
        # if it did not blow up, we have a valid server. Check proxy
        # entitlement.
        # XXX: this needs to be moved out of the rhnServer module,
        # possibly in here
        h = rhnSQL.prepare("""
        select 1
        from rhnProxyInfo pi
        where pi.server_id = :server_id
        """)
        h.execute(server_id=self.server_id)
        row = h.fetchone_dict()
        if not row:
            # we require entitlement for this functionality
            log_error("Server not entitled for Proxy", self.server_id)
            raise rhnFault(1002, _(
                'SUSE Manager Proxy service not enabled for server profile: "%s"')
                % server.server["name"])
        # we're fine...
        return server

    def auth_client(self, token):
        """ Authenticate a system based on the same authentication tokens
            the client is sending for GET requests
        """
        log_debug(3)
        # Build a UserDictCase out of the token
        dict = UserDictCase(token)
        # Set rhnFlags so that we can piggyback on apacheAuth's auth_client
        rhnFlags.set('AUTH_SESSION_TOKEN', dict)

        # XXX To clean up apacheAuth.auth_client's logging, this is not about
        # GET requests
        result = apacheAuth.auth_client()

        if not result:
            raise rhnFault(33, _("Invalid session key"))

        log_debug(4, "Client auth OK")
        # We checked it already, so we're sure it's there
        client_id = dict['X-RHN-Server-Id']

        server = rhnServer.search(client_id)
        if not server:
            raise rhnFault(8, _("This server ID no longer exists"))
        # XXX: should we check if the username still has access to it?
        # probably not, because there is no known good way we can
        # update the server system_id on the client side when
        # permissions change... Damn it. --gafton
        self.server = server
        self.server_id = client_id
        self.user = dict['X-RHN-Auth-User-Id']
        return server


class Proxy(rhnProxyHandler):

    """ this is the XML-RPC receiver for proxy calls """

    def __init__(self):
        log_debug(3)
        rhnProxyHandler.__init__(self)
        self.functions.append('package_source_in_channel')
        self.functions.append('login')
        self.functions.append('listAllPackagesKickstart')
        self.functions.append('getKickstartChannel')
        self.functions.append('getKickstartOrgChannel')
        self.functions.append('getKickstartSessionChannel')
        self.functions.append('getKickstartChildChannel')
        self.functions.append('getTinyUrlChannel')
        self.functions.append('checkTokenValidity')

    # Method to force a check of the client's auth token.
    # Proxy may call this if it does not recognize the token, which may
    # happen if the proxy is load-balanced.
    def checkTokenValidity(self, token, systemid):
        log_debug(5, token, systemid)
        # authenticate that this request is initiated from a proxy
        try:
            self.auth_system(systemid)
            server = self.auth_client(token) # sets self.server_id
        except rhnFault:
            # A Fault means that something did not auth. Either the caller
            # is not a proxy or the token is not valid, return false.
            return False
        # Proxy has to calculate new proxy-clock-skew, and needs channel info
        ret = {}
        ret['X-RHN-Auth-Server-Time'] = str(time.time())
        channels = rhnChannel.getSubscribedChannels(self.server_id)
        ret['X-RHN-Auth-Channels'] = channels
        return ret

    def package_source_in_channel(self, package, channel, auth_token):
        """ Validates the client request for a source package download """
        log_debug(3, package, channel)
        server = self.auth_client(auth_token)
        return rhnPackage.package_source_in_channel(self.server_id,
                                                    package, channel)

    def login(self, system_id):
        """ Login routine for the proxy

            Return a formatted string of session token information as regards
            an Spacewalk Proxy.  Also sets this information in the headers.

            NOTE: design description for the auth token format and how it is
               is used is well documented in the proxy/broker/rhnProxyAuth.py
               code.
        """
        log_debug(5, system_id)
        # Authenticate. We need the user record to be able to generate
        # auth tokens
        self.load_user = 1
        self.auth_system(system_id)
        # log the entry
        log_debug(1, self.server_id)
        rhnServerTime = str(time.time())
        expireOffset = str(CFG.PROXY_AUTH_TIMEOUT)
        signature = computeSignature(CFG.SECRET_KEY, self.server_id, self.user,
                                     rhnServerTime, expireOffset)

        token = '%s:%s:%s:%s:%s' % (self.server_id, self.user, rhnServerTime,
                                    expireOffset, signature)

        # NOTE: for RHN Proxies of version 3.1+ tokens are passed up in a
        #       multi-valued header with HOSTNAME tagged onto the end of the
        #       token, so, it looks something like this:
        #           x-rhn-proxy-auth: 'TOKEN1:HOSTNAME1,TOKEN2:HOSTNAME2'
        #       This note is only that -- a "heads up" -- in case anyone gets
        #       confused.

        # Push this value into the headers so that the proxy can
        # intercept and cache it without parsing the xmlrpc.
        transport = rhnFlags.get('outputTransportOptions')
        transport['X-RHN-Action'] = 'login'
        transport['X-RHN-Proxy-Auth'] = token
        return token

    def listAllPackagesKickstart(self, channel, system_id):
        """ Creates and/or serves up a cached copy of all the packages for
        this channel, including checksum information.
        """
        log_debug(5, channel)
        # authenticate that this request is initiated from a proxy
        self.auth_system(system_id)

        packages = rhnChannel.list_all_packages_checksum(channel)

        # transport options...
        rhnFlags.set("compress_response", 1)
        return packages

    def getKickstartChannel(self, kickstart, system_id):
        """ Gets channel information for this kickstart tree"""
        log_debug(5, kickstart)
        # authenticate that this request is initiated from a proxy
        self.auth_system(system_id)
        return self.__getKickstartChannel(kickstart)

    def getKickstartOrgChannel(self, kickstart, org_id, system_id):
        """ Gets channel information for this kickstart tree"""
        log_debug(5, kickstart, org_id)
        # authenticate that this request is initiated from a proxy
        self.auth_system(system_id)
        ret = rhnChannel.getChannelInfoForKickstartOrg(kickstart, org_id)
        return self.__getKickstart(kickstart, ret)

    def getKickstartSessionChannel(self, kickstart, session, system_id):
        """ Gets channel information for this kickstart tree"""
        log_debug(5, kickstart, session)
        # authenticate that this request is initiated from a proxy
        self.auth_system(system_id)
        return self.__getKickstartSessionChannel(kickstart, session)

    def getKickstartChildChannel(self, kickstart, child, system_id):
        """ Gets channel information for this kickstart tree"""
        log_debug(5, kickstart, child)
        # authenticate that this request is initiated from a proxy
        self.auth_system(system_id)
        if (hasattr(CFG, 'KS_RESTRICT_CHILD_CHANNELS') and
                CFG.KS_RESTRICT_CHILD_CHANNELS):
            return getKickstartChannel(kickstart)

        ret = rhnChannel.getChildChannelInfoForKickstart(kickstart, child)
        return self.__getKickstart(kickstart, ret)

    def getTinyUrlChannel(self, tinyurl, system_id):
        """ Gets channel information for this tinyurl"""
        log_debug(5, tinyurl)
        # authenticate that this request is initiated from a proxy
        self.auth_system(system_id)
        ret = rhnChannel.getChannelInfoForTinyUrl(tinyurl)
        if not ret or not 'url' in ret or len(ret['url'].split('/')) != 6:
            raise rhnFault(40,
                           "could not find any data on tiny url '%s'" % tinyurl)

        # tiny urls are always for kickstart sessions
        args = ret['url'].split('/')
        return self.__getKickstartSessionChannel(args[-1], args[-2])


#-----------------------------------------------------------------------------

    def __getKickstartChannel(self, kickstart):
        ret = rhnChannel.getChannelInfoForKickstart(kickstart)
        return self.__getKickstart(kickstart, ret)

    def __getKickstartSessionChannel(self, kickstart, session):
        ret = rhnChannel.getChannelInfoForKickstartSession(session)

        if not ret:
            return self.__getKickstartChannel(kickstart)
        return self.__getKickstart(kickstart, ret)

    def __getKickstart(self, kickstart, ret):
        if not ret:
            raise rhnFault(40,
                           "could not find any data on kickstart '%s'" % kickstart)
        return ret
07070100000177000081B40000000000000000000000015FBBE8EE000076F9000000000000000000000000000000000000003200000000spacewalk-backend/server/handlers/xmlrpc/queue.py # Queue functions on the server side.
#
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import sys
import time
try:
    #  python 2
    import xmlrpclib
except ImportError:
    #  python3
    import xmlrpc.client as xmlrpclib

from uyuni.common.usix import IntType, TupleType, UnicodeType, raise_with_tb

# Global modules
from spacewalk.common import rhnFlags
from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.common.rhnConfig import CFG
from spacewalk.common.rhnException import rhnFault
from spacewalk.common.rhnTranslate import _
from spacewalk.common.rhnTB import Traceback
from spacewalk.server.rhnHandler import rhnHandler
from spacewalk.server import rhnSQL, rhnCapability, rhnAction
from spacewalk.server.rhnLib import InvalidAction, EmptyAction, ShadowAction
from spacewalk.server.rhnServer import server_kickstart

from . import getMethod


class Queue(rhnHandler):

    """ XMLRPC queue functions that we will provide for the outside world. """

    def __init__(self):
        """ Add a list of functions we are willing to server out. """
        rhnHandler.__init__(self)
        self.functions.append('get')
        self.functions.append('get_future_actions')
        self.functions.append('length')
        self.functions.append('submit')
        self.functions.append('update_status')

        # XXX I am not proud of this. There should be a generic way to map
        # the client's error codes into success status codes
        self.action_type_completed_codes = {
            'errata.update': {
                39: None,
            },
        }

    def __getV1(self, action):
        """ Fetches old queued actions for the client version 1. """
        log_debug(3, self.server_id)
        actionId = action['id']
        method = action["method"]
        if method == 'packages.update':
            xml = self.__packageUpdate(actionId)
        elif method == 'errata.update':
            xml = self.__errataUpdate(actionId)
        elif method == 'hardware.refresh_list':
            xml = xmlrpclib.dumps(("hardware",), methodname="client.refresh")
        elif method == 'packages.refresh_list':
            xml = xmlrpclib.dumps(("rpmlist",), methodname="client.refresh")
        else:  # Unrecognized, skip
            raise InvalidAction("Action method %s unsupported by "
                                "Update Agent Client" % method)
        # all good
        return {'id': actionId, 'version': 1, 'action': xml}

    def __getV2(self, action, dry_run=0):
        """ Fetches queued actions for the clients version 2+. """
        log_debug(3, self.server_id)
        # Get the root dir of this install
        try:
            method = getMethod.getMethod(action['method'],
                                         'server.action')
        except getMethod.GetMethodException:
            Traceback("queue.get V2")
            raise_with_tb(EmptyAction("Could not get a valid method for %s" % (
                action['method'],)), sys.exc_info()[2])
        # Call the method
        result = method(self.server_id, action['id'], dry_run)
        if result is None:
            # None are mapped to the empty list
            result = ()
        elif not isinstance(result, TupleType):
            # Everything other than a tuple is wrapped in a tuple
            result = (result, )

        xmlblob = xmlrpclib.dumps(result, methodname=action['method'])
        log_debug(5, "returning xmlblob for action", xmlblob)
        return {
            'id': action['id'],
            'action': xmlblob,
            'version': action['version'],
        }

    def __update_status(self, status):
        """ Update the runnng kernel and the last boot values for this
            server from the status dictionary passed on queue checkin.

            Record last running kernel and uptime.  Only update
            last_boot if it has changed by more than five seconds. We
            don't know the timezone the server is in. or even if its
            clock is right, but we do know it can properly track seconds
             since it rebooted, and use our own clocks to keep proper
            track of the actual time.
        """

        if 'uname' in status:
            kernelver = status['uname'][2]
            if kernelver != self.server.server["running_kernel"]:
                self.server.server["running_kernel"] = kernelver

        # XXX:We should be using Oracle's sysdate() for this management
        # In the case of multiple app servers in mutiple time zones all the
        # results are skewed.
        if 'uptime' in status:
            uptime = status['uptime']
            if isinstance(uptime, type([])) and len(uptime):
                # Toss the other values. For now
                uptime = uptime[0]
                try:
                    uptime = float(uptime)
                except ValueError:
                    # Wrong value passed by the client
                    pass
                else:
                    last_boot = time.time() - uptime
                    if abs(last_boot - self.server.server["last_boot"]) > 5:
                        self.server.server["last_boot"] = last_boot
                        self.__set_reboot_action_to_succcess()

        # this is smart enough to do a NOOP if nothing changed.
        self.server.server.save()

    def __set_reboot_action_to_succcess(self):
        h = rhnSQL.prepare("""
            update rhnServerAction
            set status = 2
            where server_id = :server_id
            and action_id in (
                    select sa.action_id
                    from rhnServerAction sa
                    join rhnAction a on sa.action_id = a.id
                    join rhnActionType at on a.action_type = at.id
                   where sa.server_id = :server_id
                     and sa.status = 1
                     and at.label = 'reboot.reboot'
            )
        """)
        h.execute(server_id=self.server_id)

    def __should_snapshot(self):
        log_debug(4, self.server_id, "determining whether to snapshot...")

        entitlements = self.server.check_entitlement()
        if "enterprise_entitled" not in entitlements:
            return 0

        # ok, take the snapshot before attempting this action
        return 1

    def _invalidate_child_actions(self, action_id):
        f_action_ids = rhnAction.invalidate_action(self.server_id, action_id)
        for f_action_id in f_action_ids:
            # Invalidate any kickstart session that depends on this action
            server_kickstart.update_kickstart_session(self.server_id,
                                                      f_action_id, action_status=3, kickstart_state='failed',
                                                      next_action_type=None)
        return f_action_ids

    def _invalidate_failed_prereq_actions(self):
        h = rhnSQL.prepare("""
            select sa.action_id, a.prerequisite
              from rhnServerAction sa, rhnAction a
             where sa.server_id = :server_id
               and sa.action_id = a.id
               and sa.status in (0, 1) -- Queued or picked up
               and a.prerequisite is not null
               and exists (
                   select 1
                     from rhnServerAction
                    where server_id = sa.server_id
                      and action_id = a.prerequisite
                      and status = 3 -- failed
               )
        """)

        h.execute(server_id=self.server_id)
        while 1:
            row = h.fetchone_dict()
            if not row:
                break

            action_id, prereq_action_id = row['action_id'], row['prerequisite']

            self._invalidate_child_actions(action_id)
    _query_future_enabled = rhnSQL.Statement("""
        select staging_content_enabled
          from rhnOrgConfiguration oc,
               rhnServer s
         where s.org_id = oc.org_id
           and s.id = :server_id
    """)

    def _future_actions_enabled(self):
        """ Returns true if staging content is enabled for this system """
        h = rhnSQL.prepare(self._query_future_enabled)
        h.execute(server_id=self.server_id)
        row = h.fetchone_dict()
        log_debug(4, row["staging_content_enabled"])
        return row["staging_content_enabled"] == "Y"

    _query_queue_future = rhnSQL.Statement("""
                    select sa.action_id id, a.version,
                           sa.remaining_tries, at.label as method,
                           at.unlocked_only,
                           a.prerequisite
                      from rhnServerAction sa,
                           rhnAction a,
                           rhnActionType at
                     where sa.server_id = :server_id
                       and sa.action_id = a.id
                       and a.action_type = at.id
                       and sa.status in (0, 1) -- Queued or picked up
                       and a.earliest_action <= current_timestamp + numtodsinterval(:time_window * 3600, 'second')  -- Check earliest_action
                       and at.label in ('packages.update', 'errata.update',
                            'packages.runTransaction', 'packages.fullUpdate')
                      order by a.earliest_action, a.prerequisite nulls first, a.id
    """)

    def get_future_actions(self, system_id, time_window):
        """ return actions which are scheduled within next /time_window/ hours """
        self.auth_system(system_id)
        log_debug(3, "Checking for future actions within %d hours" % time_window)
        result = []
        if self._future_actions_enabled() and not self.__reboot_in_progress():
            h = rhnSQL.prepare(self._query_queue_future)
            h.execute(server_id=self.server_id, time_window=time_window)
            action = h.fetchone_dict()
            while action:
                log_debug(5, action)
                result.append(self.__getV2(action, dry_run=1))
                action = h.fetchone_dict()
        return result

    _query_queue_get = rhnSQL.Statement("""
                    select sa.action_id id, a.version,
                           sa.remaining_tries, at.label as method,
                           at.unlocked_only,
                           a.prerequisite
                      from rhnServerAction sa,
                           rhnAction a,
                           rhnActionType at
                     where sa.server_id = :server_id
                       and sa.action_id = a.id
                       and a.action_type = at.id
                       and sa.status in (0, 1) -- Queued or picked up
                       and a.earliest_action <= current_timestamp -- Check earliest_action
                       and not exists (
                           select 1
                             from rhnServerAction sap
                            where sap.server_id = :server_id
                              and sap.action_id = a.prerequisite
                              and sap.status != 2 -- completed
                           )
                      order by a.earliest_action, a.prerequisite nulls first, a.id
    """)

    # Probably we need to figure out if we really need to split these two.
    def get(self, system_id, version=1, status={}):
        # Authenticate the system certificate
        if CFG.DISABLE_CHECKINS:
            self.update_checkin = 0
        else:
            self.update_checkin = 1
        self.auth_system(system_id)
        log_debug(1, self.server_id, version,
                  "checkins %s" % ["disabled", "enabled"][self.update_checkin])
        if status:
            self.__update_status(status)

        # Update the capabilities list
        rhnCapability.update_client_capabilities(self.server_id)

        # Invalidate failed actions
        self._invalidate_failed_prereq_actions()

        server_locked = self.server.server_locked()
        log_debug(3, "Server locked", server_locked)

        if self.__reboot_in_progress():
            log_debug(3, "Server reboot in progress", self.server_id)
            rhnSQL.commit()
            return ""

        ret = {}
        # get the action. Status codes are currently:
        # 0 Queued # 1 Picked Up # 2 Completed # 3 Failed
        # XXX: we should really be using labels from rhnActionType instead of
        #      hard coded type id numbers.
        # We fetch actions whose prerequisites have completed, and actions
        # that don't have prerequisites at all
        h = rhnSQL.prepare(self._query_queue_get)

        should_execute = 1

        # Loop to get a valid action
        # (only one valid action will be dealt with per execution of this function...)
        while 1:
            if should_execute:
                h.execute(server_id=self.server_id)
                should_execute = 0

            # Okay, got an action
            action = h.fetchone_dict()
            if not action:  # No actions available; bail out
                # Don't forget the commit at the end...
                ret = ""
                break
            action_id = action['id']
            log_debug(4, "Checking action %s" % action_id)
            # okay, now we have the action - process it.
            if action['remaining_tries'] < 1:
                log_debug(4, "Action %s picked up too many times" % action_id)
                # We've run out of pickup attempts for this action...
                self.__update_action(action_id, status=3,
                                     message="This action has been picked up multiple times "
                                     "without a successful transaction; "
                                     "this action is now failed for this system.")
                # Invalidate actions that depend on this one
                self._invalidate_child_actions(action_id)
                # keep looking for a good action to process...
                continue

            if server_locked and action['unlocked_only'] == 'Y':
                # This action is locked
                log_debug(4, "server id %s locked for action id %s" % (
                    self.server_id, action_id))
                continue

            try:
                if version == 1:
                    ret = self.__getV1(action)
                else:
                    ret = self.__getV2(action)
            except ShadowAction:  # Action the client should not see
                e = sys.exc_info()[1]
                # Make sure we re-execute the query, so we pick up whatever
                # extra actions were added
                should_execute = 1
                text = e.args[0]
                log_debug(4, "Shadow Action", text)
                self.__update_action(action['id'], 2, 0, text)
                continue
            except InvalidAction:  # This is an invalid action
                e = sys.exc_info()[1]
                # Update its status so it won't bother us again
                text = e.args[0]
                log_debug(4, "Invalid Action", text)
                self.__update_action(action['id'], 3, -99, text)
                continue
            except EmptyAction:
                e = sys.exc_info()[1]
                # this means that we have some sort of internal error
                # which gets reported in the logs. We don't touch the
                # action because this should get fixed on our side.
                log_error("Can not process action data", action, e.args)
                ret = ""
                break
            else:  # all fine
                # Update the status of the action
                h = rhnSQL.prepare("""
                update rhnServerAction
                    set status = 1,
                        pickup_time = current_timestamp,
                        remaining_tries = :tries - 1
                where action_id = :action_id
                  and server_id = :server_id
                """)
                h.execute(action_id=action["id"], server_id=self.server_id,
                          tries=action["remaining_tries"])
                break

        # commit all changes
        rhnSQL.commit()

        return ret

    def submit(self, system_id, action_id, result, message="", data={}):
        """ Submit the results of a queue run.
            Maps old and new rhn_check behavior to new database status codes

            The new API uses 4 slightly different status codes than the
            old client does.  This function will "hopefully" sensibly
            map them.  Old methodology:
               -rhn_check retrieves an action from the top of the action queue.
               -It attempts to execute the desired action and returns either
                   (a) 0   -- presumed successful.
                   (b) rhnFault object -- presumed failed
                   (c) some other non-fault object -- *assumed* successful.
               -Regardless of result code, action is marked as "executed"

            We try to make a smarter status selection (i.e. failed||completed).

            For reference:
            New DB status codes:      Old DB status codes:
                  0: Queued               0: queued
                  1: Picked Up            1: picked up
                  2: Completed            2: executed
                  3: Failed               3: completed
        """
        if type(action_id) is not IntType:
            # Convert it to int
            try:
                action_id = int(action_id)
            except ValueError:
                log_error("Invalid action_id", action_id)
                raise_with_tb(rhnFault(30, _("Invalid action value type %s (%s)") %
                               (action_id, type(action_id))), sys.exc_info()[2])
        # bring message into correct format
        try:
            message = message.encode('utf8')
        except UnicodeEncodeError:
            pass

        # Authenticate the system certificate
        self.auth_system(system_id)
        log_debug(1, self.server_id, action_id, result)
        # check that the action is valid
        # We have a uniqueness constraint on (action_id, server_id)
        h = rhnSQL.prepare("""
            select at.label action_type,
                   at.trigger_snapshot,
                   at.name
              from rhnServerAction sa,
                   rhnAction a,
                   rhnActionType at
             where sa.server_id = :server_id
               and sa.action_id = :action_id
               and sa.status = 1
               and a.id = :action_id
               and a.action_type = at.id
        """)
        h.execute(server_id=self.server_id, action_id=action_id)
        row = h.fetchone_dict()
        if not row:
            log_error("Server %s does not own action %s" % (
                self.server_id, action_id))
            raise rhnFault(22, _("Action %s does not belong to server %s") % (
                action_id, self.server_id))

        action_type = row['action_type']
        trigger_snapshot = (row['trigger_snapshot'] == 'Y')

        if 'missing_packages' in data:
            missing_packages = "Missing-Packages: %s" % str(
                data['missing_packages'])
            rmsg = "%s %s" % (message, missing_packages)
        elif 'koan' in data:
            rmsg = "%s: %s" % (message, data['koan'])
        else:
            rmsg = message

        rcode = result
        # Careful with this one, result can be a very complex thing
        # and this processing is required for compatibility with old
        # rhn_check clients
        if type(rcode) == type({}):
            if "faultCode" in result:
                rcode = result["faultCode"]
            if "faultString" in result:
                rmsg = result["faultString"] + str(data)
        if type(rcode) in [type({}), type(()), type([])] \
                or type(rcode) is not IntType:
            rmsg = "%s [%s]" % (UnicodeType(message), UnicodeType(rcode))
            rcode = -1
        # map to db codes.
        status = self.status_for_action_type_code(action_type, rcode)

        if status == 3:
            # Failed action - invalidate children
            self._invalidate_child_actions(action_id)
        elif action_type == 'reboot.reboot':
            # reboot action should stay as pickup
            rhnSQL.commit()
            return 0
        elif status == 2 and trigger_snapshot and self.__should_snapshot():
            # if action status is 'Completed', snapshot if allowed and if needed
            self.server.take_snapshot("Scheduled action completion:  %s" % row['name'])

        self.__update_action(action_id, status, rcode, rmsg)

        # Store the status in a flag - easier than to complicate the action
        # plugin API by adding a status
        rhnFlags.set('action_id', action_id)
        rhnFlags.set('action_status', status)

        self.process_extra_data(self.server_id, action_id, data=data,
                                action_type=action_type)

        # commit, because nobody else will
        rhnSQL.commit()
        return 0

    def update_status(self, system_id, status = {}):
        # Authenticate the system certificate
        self.auth_system(system_id)
        log_debug(1, self.server_id, status)
        if status:
            self.__update_status(status)
        # commit all changes
        rhnSQL.commit()

        return 0

    def status_for_action_type_code(self, action_type, rcode):
        """ Convert whatever the client sends as a result code into a status in the
            database format
            This is more complicated, since some of the client's result codes have
            to be marked as successes.
        """
        log_debug(4, action_type, rcode)
        if rcode == 0:
            # Completed
            return 2

        if action_type not in self.action_type_completed_codes:
            # Failed
            return 3

        hash = self.action_type_completed_codes[action_type]
        if rcode not in hash:
            # Failed
            return 3

        # Completed
        return 2

    def process_extra_data(self, server_id, action_id, data={},
                           action_type=None):
        log_debug(4, server_id, action_id, action_type)

        if not action_type:
            # Shouldn't happen
            return

        try:
            method = getMethod.getMethod(action_type,
                                         'server.action_extra_data')
        except getMethod.GetMethodException:
            Traceback("queue.get V2")
            raise_with_tb(EmptyAction("Could not get a valid method for %s" %
                              action_type), sys.exc_info()[2])
        # Call the method
        result = method(self.server_id, action_id, data=data)
        return result

    def length(self, system_id):
        """ Return the queue length for a certain server. """
        # Authenticate the system certificate
        self.auth_system(system_id)
        log_debug(1, self.server_id)
        h = rhnSQL.prepare("""
        select
            count(action_id) id
        from
            rhnServerAction r
        where
            r.server_id = :server_id
        and r.status in (0, 1)
        """)
        h.execute(server_id=self.server_id)
        data = h.fetchone_dict()
        if data is None:
            return 0
        return data["id"]

    # PRIVATE methods

    def __reboot_in_progress(self):
        """check for a reboot action for this server in status Picked Up"""
        log_debug(4, self.server_id)
        h = rhnSQL.prepare("""
            select 1
              from rhnServerAction sa
              join rhnAction a on sa.action_id = a.id
              join rhnActionType at on a.action_type = at.id
             where sa.server_id = :server_id
               and at.label = 'reboot.reboot'
               and sa.status = 1 -- Picked Up
        """)
        h.execute(server_id=self.server_id)
        ret = h.fetchone_dict() or None
        if ret:
            return True
        return False

    def __update_action(self, action_id, status,
                        resultCode=None, message=""):
        """ Update the status of an action. """
        log_debug(4, action_id, status, resultCode, message)
        rhnAction.update_server_action(server_id=self.server_id,
                                       action_id=action_id, status=status,
                                       result_code=resultCode, result_message=message)
        return 0

    def __errataUpdate(self, actionId):
        """ Old client errata retrieval. """
        log_debug(3, self.server_id, actionId)
        # get the names of the packages associated with each errata and
        # look them up in channels subscribed to by the server and select
        # the latest version
        sql = """
        select
            pn.name name,
            pl.evr.version version,
            pl.evr.release release
        from (
            select
                p.name_id,
                max(pe.evr) evr
            from
                rhnPackageEVR pe,
                rhnChannelPackage cp,
                rhnPackage p,
                rhnServerChannel sc,
                (
                    select
                        p_name.name_id id
                    from
                        rhnActionErrataUpdate aeu,
                        rhnErrataPackage ep,
                        rhnPackage p_name
                    where
                        aeu.action_id = :action_id
                    and aeu.errata_id = ep.errata_id
                    and ep.package_id = p_name.id
                ) nids
            where
                nids.id = p.name_id
            and p.evr_id = pe.id
            and p.id = cp.package_id
            and cp.channel_id = sc.channel_id
            and sc.server_id = :server_id
            group by p.name_id
            ) pl,
            rhnPackageName pn
        where
            pn.id = pl.name_id
        """
        h = rhnSQL.prepare(sql)
        h.execute(action_id=actionId, server_id=self.server_id)

        packages = []
        while 1:
            ret = h.fetchone_dict()
            if not ret:
                break
            # older clients have issues with real epochs, se they are
            # kind of irrelevant
            packages.append([ret["name"], ret["version"], ret["release"], ''])
        xml = xmlrpclib.dumps((packages,), methodname='client.update_packages')
        return xml

    def __packageUpdate(self, actionId):
        """ Old client package retrieval. """
        log_debug(3, self.server_id, actionId)
        # The SQL query is a union of:
        # - packages with a specific EVR
        # - the latest packages (no EVR specified)
        # XXX Should we want to schedule the install for a specific version,
        # we'll have to modify this
        statement = """
        select distinct
            pkglist.name name,
            -- decode the evr object selected earlier
            pkglist.evr.version version,
            pkglist.evr.release release
        from (
            -- get the max of the two possible cases
            select
                pl.name name,
                max(pl.evr) evr
            from (
                -- if the EVR is specifically requested...
                select
                    pn.name name,
                    pe.evr evr
                from
                    rhnActionPackage ap,
                    rhnPackage p,
                    rhnPackageName pn,
                    rhnPackageEVR pe,
                    rhnServerChannel sc,
                    rhnChannelPackage cp
                where
                    ap.action_id = :action_id
                and ap.evr_id is NOT NULL
                and ap.evr_id = p.evr_id
                and ap.evr_id = pe.id
                and ap.name_id = p.name_id
                and ap.name_id = pn.id
                and p.id = cp.package_id
                and cp.channel_id = sc.channel_id
                and sc.server_id = :server_id
                UNION
                -- when no EVR requested, we need to compute the max available
                -- from the channels the server is subscribed to
                select
                    pn.name name,
                    max(pevr.evr) evr
                from
                    rhnActionPackage ap,
                    rhnServerChannel sc,
                    rhnChannelPackage cp,
                    rhnPackage p,
                    rhnPackageEVR pevr,
                    rhnPackageName pn
                where
                    ap.action_id = :action_id
                and ap.evr_id is null
                and ap.name_id = pn.id
                and ap.name_id = p.name_id
                and p.evr_id = pevr.id
                and sc.server_id = :server_id
                and sc.channel_id = cp.channel_id
                and cp.package_id = p.id
                group by pn.name
            ) pl
            group by pl.name
        ) pkglist
        """
        h = rhnSQL.prepare(statement)
        h.execute(action_id=actionId, server_id=self.server_id)
        ret = h.fetchall_dict() or []
        packages = []
        for p in ret:
            # old clients have issues dealing with real epochs, so we
            # kind of fake it for now in here
            entry = [p['name'], p['version'], p['release'], '']
            packages.append(entry)
        xml = xmlrpclib.dumps((packages,), methodname='client.update_packages')
        return xml


#-----------------------------------------------------------------------------
if __name__ == "__main__":
    print("You can not run this module by itself")
    q = Queue()
    sys.exit(-1)
#-----------------------------------------------------------------------------
   07070100000178000081B40000000000000000000000015FBBE8EE0000DCC4000000000000000000000000000000000000003900000000spacewalk-backend/server/handlers/xmlrpc/registration.py  #
# Copyright (c) 2008--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

# system modules
import os
import sys

from uyuni.common.usix import raise_with_tb
from spacewalk.common import rhnFlags, rhnMail
from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.common.rhnConfig import CFG, PRODUCT_NAME
from spacewalk.common.rhnException import rhnFault
from spacewalk.common.rhnTranslate import _, cat
from uyuni.common.rhnLib import checkValue
from spacewalk.server.rhnLib import normalize_server_arch
from spacewalk.server.rhnServer import server_route, server_lib
from spacewalk.server.rhnServer.server_certificate import Certificate
from spacewalk.server.rhnHandler import rhnHandler
from spacewalk.server import rhnUser, rhnServer, rhnSQL, rhnCapability, \
    rhnChannel, rhnVirtualization
from spacewalk.common.rhnTB import add_to_seclist


def hash_validate(data, *keylist):
    """ verify that a hash has all the keys and those have actual values """
    for k in keylist:
        if k not in data:
            return 0
        l = data[k]
        if l is None:
            return 0
        if type(l) == type("") and len(l) == 0:
            return 0
    return 1


def parse_smbios(smbios):
    vendor = smbios.get('smbios.bios.vendor')
    serial = smbios.get('smbios.system.serial', '')
    manufacturer = smbios.get('smbios.system.manufacturer')
    product = smbios.get('smbios.system.product')

    # XXX need to worry about uuid being none for other virt types and
    # available subs check
    uuid = None
    if 'smbios.system.uuid' in smbios:
        uuid = smbios['smbios.system.uuid']
        uuid = uuid.replace('-', '')

    virttype = None
    if uuid is not None and (
            vendor == "QEMU"
            or manufacturer == 'QEMU'
            or (manufacturer == 'Bochs' and product == 'Bochs') # Bochs is a virtual SUSE KVM machine
            or (manufacturer == 'RDO' and product == 'OpenStack Compute') # Openstack compute
            or (manufacturer == 'Google' and product == 'Google Compute Engine') # Google Compute Engine
            or (manufacturer == 'Red Hat' and product in ('KVM', 'RHEV Hypervisor', 'OpenStack Compute'))
            or (product == 'OpenStack Nova' and (manufacturer in ('Fedora Project', 'RDO Project') or
                manufacturer and manufacturer.startswith('Red Hat')))
            or (manufacturer == 'oVirt' and product in ('oVirt Node', 'RHEV Hypervisor'))
            or (manufacturer == 'Nutanix' and product == 'AHV')):
        virttype = rhnVirtualization.VirtualizationType.QEMU
    else:
        if manufacturer == 'Microsoft Corporation' and product == 'Virtual Machine':
            virttype = rhnVirtualization.VirtualizationType.HYPERV
        elif serial.startswith('VMware-'):
            virttype = rhnVirtualization.VirtualizationType.VMWARE
        elif manufacturer == 'HITACHI' and product.endswith(' HVM LPAR'):
            virttype = rhnVirtualization.VirtualizationType.VIRTAGE
        if uuid is None:
            uuid = "flex-guest"

    if virttype:
        return (virttype, uuid)
    elif product == "VirtualBox" and uuid is not None:
        return (rhnVirtualization.VirtualizationType.VBOX, uuid)
    return (None, None)


class Registration(rhnHandler):

    """ encapsulate functions that we will provide for the outside world """

    def __init__(self):
        rhnHandler.__init__(self)
        self.functions.append("activate_registration_number")
        self.functions.append("activate_hardware_info")
        self.functions.append("available_eus_channels")
        self.functions.append("add_hw_profile")
        self.functions.append("add_packages")
        self.functions.append("anonymous")
        self.functions.append("delete_packages")
        self.functions.append("delta_packages")
        self.functions.append("finish_message")
        self.functions.append("get_possible_orgs")
        self.functions.append("new_system")
        self.functions.append("new_system_user_pass")
# self.functions.append("new_system_activation_key")
        self.functions.append("new_user")               # obsoleted
        self.functions.append("privacy_statement")
        self.functions.append("refresh_hw_profile")
        self.functions.append("register_osad")
        self.functions.append("register_osad_jid")
        self.functions.append("register_product")
        self.functions.append("remaining_subscriptions")  # obsoleted
        self.functions.append("reserve_user")           # obsoleted
        self.functions.append("send_serial")
        self.functions.append("upgrade_version")
        self.functions.append("update_contact_info")    # obsoleted
        self.functions.append("update_packages")
        self.functions.append("update_systemid")
        self.functions.append("update_transactions")
        self.functions.append("virt_notify")
        self.functions.append("welcome_message")
        self.functions.append("suse_update_products")

        # defaults for the authentication section
        self.load_user = 0
        self.check_entitlement = 0
        self.throttle = 0

        # a mapping between vendor and asset tags or serial numbers.
        # if we want to support other vendors for re
        self.vendor_tags = {'DELL': 'smbios.system.serial'}

    def reserve_user(self, username, password):
        """
        Get an username and a password and create a record for this user.
        Eventually mark it as such.
        Additionaly this method is used to verify login and password in early
        stage of rhn_register.

        Returns true value if user is reserved, otherwise fault is raised.
        """

        add_to_seclist(password)

        log_debug(1, username)
        # check user login/password and if not CFG.disallow_user_creation
        # then reserver the user
        ret = rhnUser.reserve_user(username, password)
        log_debug(3, "rhnUser.reserve_user returned: " + str(ret))
        if ret < 0:
            raise rhnFault(3)
        return ret

    def new_user(self, username, password, email=None,
                 org_id=None, org_password=None):
        """
        Finish off creating the user.

        The user has to exist (must be already reserved), the password must
        match and we set the e-mail address if one is given

        Return true if success
        """

        log_debug(1, username, email)
        # email has to be a string or nothing
        if not checkValue(email, None, "", type("")):
            raise rhnFault(30, _faultValueString(email, "email"))
        # be somewhat drastic about the org values
        if org_id and org_password:
            org_password = str(org_password)
            try:
                org_id = int(str(org_id))
            except ValueError:
                raise_with_tb(rhnFault(30, _faultValueString(org_id, "org_id")), sys.exc_info()[2])
        else:
            org_id = org_password = None
        username, password = rhnUser.check_user_password(username, password)
        email = rhnUser.check_email(email)
        # now create this user
        ret = rhnUser.new_user(username, password, email, org_id, org_password)
        # rhnUser.new_user will raise it's own faults.
        return ret

    def validate_system_input(self, data):
        """ check the input data """
        if not hash_validate(data, "os_release", "architecture", "profile_name"):
            log_error("Incomplete data hash")
            raise rhnFault(21, _("Required data missing"))
        # we require either a username and a password or a token
        if not hash_validate(data, "username", "password") and \
           not hash_validate(data, "token"):
            raise rhnFault(21, _("Required members missing"))

    def validate_system_user(self, username, password):
        username, password = rhnUser.check_user_password(username,
                                                         password)
        user = rhnUser.search(username)

        if user is None:
            log_error("Can't register server to non-existent user")
            raise rhnFault(2, _("Attempt to register a system to an invalid username"))

        # This check validates username and password
        if not user.check_password(password):
            log_error("User password check failed", username)
            raise rhnFault(2)

        if rhnUser.is_user_disabled(username):
            msg = _("""
                   %s Account has been deactivated on this server.
                   Please contact your Org administrator for more help.""")
            raise rhnFault(1, msg % username, explain=0)

        return user

    def create_system(self, user, profile_name, release_version,
                      architecture, data):
        """
        Create a system based on the input parameters.

        Return dict containing a server object for now.
        Called by new_system (< rhel5)
              and new_system_user_pass | new_system_activation_key (>= rhel5)
        """

        if "machine_id" in data:
            entitlements = server_lib.check_entitlement_by_machine_id(data["machine_id"])
            log_debug(4, "found entitlements for machine_id", data["machine_id"], entitlements)
            if entitlements and "salt_entitled" in entitlements:
                raise rhnFault(48, """
    This system is already registered as a Salt Minion. If you want to register it as a traditional client
    please delete it first via the web UI or API and then register it using the traditional tools.
                """)

        if profile_name is not None and not \
           rhnFlags.test("re_registration_token") and \
           len(profile_name) < 1:
            raise rhnFault(800)

        # log entry point
        if "token" in data:
            log_item = "token = '%s'" % data["token"]
        else:
            log_item = "username = '%s'" % user.username

        log_debug(1, log_item, release_version, architecture)

        # Fetch the applet's UUID
        if "uuid" in data:
            applet_uuid = data['uuid']
            log_debug(3, "applet uuid", applet_uuid)
        else:
            applet_uuid = None

        # Fetch the up2date UUID
        if "rhnuuid" in data:
            up2date_uuid = data['rhnuuid']
            log_debug(3, "up2date uuid", up2date_uuid)
            # XXX Should somehow check the uuid uniqueness
            #raise rhnFault(105, "A system cannot be registered multiple times")
        else:
            up2date_uuid = None

        release = str(release_version)

        if 'token' in data:
            token_string = data['token']
            # Look the token up; if the token does not exist or is invalid,
            # stop right here (search_token raises the appropriate rhnFault)
            tokens_obj = rhnServer.search_token(token_string)
            log_user_id = tokens_obj.get_user_id()
        else:
            # user should not be null here
            log_user_id = user.getid()
            tokens_obj = rhnServer.search_org_token(user.contact["org_id"])
            log_debug(3, "universal_registration_token set as %s" %
                      str(tokens_obj.get_tokens()))
            rhnFlags.set("universal_registration_token", tokens_obj)

        if 'channel' in data and len(data['channel']) > 0:
            channel = data['channel']
            log_debug(3, "requested EUS channel: %s" % str(channel))
        else:
            channel = None

        newserv = None
        if tokens_obj:
            # Only set registration_token if we have token(s) available.
            # server_token.ActivationTokens.__nonzero__ should do the right
            # thing of filtering the case of no tokens
            rhnFlags.set("registration_token", tokens_obj)
            # Is the token associated with a server?
            if tokens_obj.is_rereg_token:
                # Also flag it's a re-registration token
                rhnFlags.set("re_registration_token", tokens_obj)
                # Load the server object
                newserv = rhnServer.search(tokens_obj.get_server_id())
                newserv.disable_token()
                # The old hardware info no longer applies
                newserv.delete_hardware()
                # Update the arch - it may have changed; we know the field was
                # provided for us
                newserv.set_arch(architecture)
                # if no creator_id use the activation key owner, else keep
                if not newserv.server['creator_id']:
                    newserv.user = user
                else:
                    newserv.user = rhnUser.User("", "")
                    newserv.user.reload(newserv.server['creator_id'])
                # Generate a new secret for this server
                newserv.gen_secret()
                # Get rid of the old package profile - it's bogus in this case
                newserv.dispose_packages()
                # The new server may have a different base channel
                suse_products = None
                if 'suse_products' in data:
                    suse_products = data['suse_products']
                newserv.change_base_channel(release, suse_products=suse_products)

        if newserv is None:
            # Not a re-registration token, we need a fresh server object
            newserv = rhnServer.Server(user, architecture)

        # Proceed with using the rest of the data
        newserv.server["release"] = release
        if 'release_name' in data:
            newserv.server["os"] = data['release_name']

        ## add suse_products profile if available
        if 'suse_products' in data:
            newserv.add_suse_products( data["suse_products"] )
        ## add the package list
        if 'packages' in data:
            for package in data['packages']:
                newserv.add_package(package)
        # add the hardware profile
        if 'hardware_profile' in data:
            for hw in data['hardware_profile'][:]:
                if hw['class'] == 'NETINFO':
                    self.extract_and_save_netinfos(newserv, hw)
                    continue
                if hw['class'] == 'FQDN':
                    self.extract_and_save_fqdns(newserv, hw)
                    continue
                newserv.add_hardware(hw)
        # fill in the other details from the data dictionary
        if profile_name is not None and not \
           rhnFlags.test("re_registration_token"):
            newserv.server["name"] = profile_name[:128]
        if 'os' in data:
            newserv.server["os"] = data["os"][:64]
        if 'description' in data:
            newserv.server["description"] = data["description"][:256]
        else:
            newserv.default_description()

        # Check for virt params
        # Get the uuid, if there is one.
        if 'virt_uuid' in data:
            virt_uuid = data['virt_uuid']
            if virt_uuid is not None \
               and not rhnVirtualization.is_host_uuid(virt_uuid):
                # If we don't have a virt_type key, we'll assume PARA.
                virt_type = None
                if 'virt_type' in data:
                    virt_type = data['virt_type']
                    if virt_type == 'para':
                        virt_type = rhnVirtualization.VirtualizationType.PARA
                    elif virt_type == 'fully':
                        virt_type = rhnVirtualization.VirtualizationType.FULLY
                    else:
                        raise Exception(
                            "Unknown virtualization type: %s" % virt_type)
                else:
                    raise Exception("Virtualization type not provided")
                newserv.virt_uuid = virt_uuid
                newserv.virt_type = virt_type
            else:
                newserv.virt_uuid = None
                newserv.virt_type = None
        else:
            newserv.virt_uuid = None
            newserv.virt_type = None

        # If we didn't find virt info from xen, check smbios
        if 'smbios' in data and newserv.virt_uuid is None:
            (newserv.virt_type, newserv.virt_uuid) = \
                parse_smbios(data['smbios'])

        if tokens_obj.forget_rereg_token:
            # At this point we retained the server with re-activation
            # let the stacked activation keys do their magic
            tokens_obj.is_rereg_token = 0
            rhnFlags.set("re_registration_token", 0)

        # now if we have a token, load the extra registration
        # information from the token
        if rhnFlags.test("registration_token"):
            # Keep the original "info" field
            newserv.load_token()
            # we need to flush the registration information into the
            # database so we can proceed with processing the rest of
            # the token information (like subscribing the server to
            # groups, channels, etc)

            # bretm 02/19/2007 -- this shouldn't throw any of the following:
            #   BaseChannelDeniedError
            #   NoBaseChannelError
            # since we have the token object, and underneath the hood, we have none_ok=have_token

            # BUT - it does. So catch them and throw. this will make rhnreg_ks
            # die out, but oh well. at least they don't end up registered, and
            # without a base channel.
            try:
                # don't commit
                newserv.save(0, channel)
            except (rhnChannel.NoBaseChannelError) as channel_error:
                raise_with_tb(rhnFault(70), sys.exc_info()[2])
            except rhnChannel.BaseChannelDeniedError as channel_error:
                raise_with_tb(rhnFault(71), sys.exc_info()[2])
            except server_lib.rhnSystemEntitlementException:
                e = sys.exc_info()[1]
                raise_with_tb(rhnFault(90), sys.exc_info()[2])

            # Process any kickstart data associated with this server
            # Do this before using/processing the token, as the
            # potential pkg delta shadow action should happen first
            log_debug(3, "reg token process_kickstart_info")
            newserv.process_kickstart_info()

            # now do the rest of the processing for the token registration
            newserv.use_token()
        else:
            # Some information
            newserv.server["info"] = "rhn_register by %s" % log_item
            log_debug(3, "rhn_register process_kickstart_info")
            newserv.process_kickstart_info()

        # Update the uuid if necessary
        if up2date_uuid:
            newserv.uuid = up2date_uuid

        # save it
        # Commits to the db.
        #
        # bretm 02/19/2007 -- this *can* now throw any of the following:
        #   rhnChannel.BaseChannelDeniedError
        #   rhnChannel.NoBaseChannelError
        #   rhnSystemEntitlementException
        #   |
        #   +--rhnNoSystemEntitlementsException
        try:
            newserv.save(1, channel)
        except (rhnChannel.NoBaseChannelError) as channel_error:
            raise_with_tb(rhnFault(70), sys.exc_info()[2])
        except rhnChannel.BaseChannelDeniedError as channel_error:
            raise_with_tb(rhnFault(71), sys.exc_info()[2])
        except server_lib.rhnSystemEntitlementException:
            e = sys.exc_info()[1]
            # right now, don't differentiate between general ent issues & rhnNoSystemEntitlementsException
            raise_with_tb(rhnFault(90), sys.exc_info()[2])

        if CFG.SEND_EOL_MAIL and user and newserv.base_channel_is_eol():
            self.attempt_eol_mailing(user, newserv)

        # XXX: until this is complete, bug:
        #      http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=112450
        # store route in DB (schema for RHN 3.1+ only!)
        server_route.store_client_route(newserv.getid())

        return {'server': newserv, }

    def new_system(self, data):
        """
        This function expects at the INPUT a dictionary that has at least
        the following members: username, password, os_release, email
        If the username does not exist, it is created. If the username
        exists, then password is checked for a match.
        If all is well, we send back a server certificate.
        --
        Hash
        --
        Struct

        Starting with RHEL 5, the client will use activate_registration_number,
        activate_hardware_info, new_system_user_pass, and/or
        new_system_activation_key instead of this.

        In hosted, RHEL 4 and earlier will also call
        activate_registration_number
        """

        if "password" in data:
            add_to_seclist(data["password"])

        # Validate we got the minimum necessary input.
        self.validate_system_input(data)

        # Authorize username and password, if used.
        # Store the user object in user.
        user = None
        if 'token' not in data:
            user = self.validate_system_user(data["username"],
                                             data["password"])

        release_version = data['os_release']
        profile_name = data['profile_name']
        architecture = data['architecture']

        # Create the system and get back the rhnServer object.
        #
        # bretm 02/19/2007 -- the following things get thrown underneath,
        # but we issue the faults in create_system for uniformity:
        #
        #   rhnChannel.BaseChannelDeniedError
        #   rhnChannel.NoBaseChannelError
        #   rhnSystemEntitlementException
        #   |
        #   +--rhnNoSystemEntitlementsException
        server_data = self.create_system(user, profile_name,
                                         release_version,
                                         architecture, data)
        newserv = server_data['server']

        system_certificate = newserv.system_id()

        # Return the server certificate file down to the client.
        return system_certificate

    def new_system_user_pass(self, profile_name, os_release_name,
                             version, arch, username,
                             password, other):
        """ Registers a new system to an org specified by a username, password, and
            optionally an org id.

            New for RHEL 5.

            All args are strings except other.
            other is a dict with:
            * org_id - optional. Must be a string that contains the number. If it's
            not given, the default org is used.

            If a profile is created it will return a dict with:
            * system_id - the same xml as was previously returned
            * channels - a list of the channels (as strings) the system was
              subscribed to
            * failed_channels - a list of channels (as strings) that
              the system should have been subscribed to but couldn't be because they
              don't have the necessary entitlements available. Can contain all the
              channels including the base channel.
            * system_slots - a list of the system slots used (as strings).
            * failed_system_slots - a list of system slots (as strings) that they
              should have used but couldn't because there weren't available
              entitlements
            * universal_activation_key - a list of universal default activation keys
              (as strings) that were used while registering.
            The call will try to use the highest system slot available. An entry will
            be added to failed_system_slots for each one that is tried and fails and
            system_slots will contain the one that succeeded if any.

            If an error occurs which prevents the creation of a profile, a fault will
            be raised:
            TODO
        """

        add_to_seclist(password)

        log_debug(4, 'in new_system_user_pass')

        # release_name wasn't required in the old call, so I'm just going to
        # add it to other
        other['release_name'] = os_release_name

        # Authorize the username and password. Save the returned user object.
        user = self.validate_system_user(username, password)

        # This creates the rhnServer record and commits it to the db.
        # It also assigns the system a base channel.
        server_data = self.create_system(user, profile_name,
                                         version,
                                         arch,
                                         other)
        # Save the returned Server object
        newserv = server_data['server']

        # Get the server db id.
        server_id = newserv.getid()

        # Get the server certificate file
        system_certificate = newserv.system_id()

        log_debug(4, 'Server id created as %s' % server_id)

        failures = []
        unknowns = []

        # Build our return values.
        attempted_channels = []
        successful_channels = []
        failed_channels = []

        actual_channels = rhnChannel.channels_for_server(server_id)
        for channel in actual_channels:
            successful_channels.append(channel['label'])

        # If we don't have any successful channels, we know the base channel
        # failed.
        if len(successful_channels) == 0:
            log_debug(4, 'System %s not subscribed to any channels' % server_id)

            # Look up the base channel, and store it as a failure.
            try:
                base = rhnChannel.get_channel_for_release_arch(
                    version,
                    arch, newserv['org_id'])
                failed_channels.append(base['label'])
            # We want to swallow exceptions here as we are just generating data
            # for the review screen in rhn_register.
            except:
                pass

        # Store any of our child channel failures
        failed_channels = failed_channels + failures

        attempted_system_slots = ['enterprise_entitled']
        successful_system_slots = server_lib.check_entitlement(server_id)
        successful_system_slots = list(successful_system_slots.keys())
        failed_system_slots = []

        # Check which entitlement level we got, starting with the highest.
        i = 0
        for slot in attempted_system_slots:
            if slot in successful_system_slots:
                break
            i = i + 1

        # Any entitlements we didn't have, we'll store as a failure.
        failed_system_slots = attempted_system_slots[0:i]

        universal_activation_key = []
        if rhnFlags.test("universal_registration_token"):
            token = rhnFlags.get("universal_registration_token")
            universal_activation_key = token.get_tokens()

        return {'system_id': system_certificate,
                'channels': successful_channels,
                'failed_channels': failed_channels,
                'failed_options': unknowns,
                'system_slots': successful_system_slots,
                'failed_system_slots': failed_system_slots,
                'universal_activation_key': universal_activation_key
                }

    # Registers a new system to an org specified by an activation key.
    #
    # New for RHEL 5.
    #
    # See documentation for new_system_user_pass. This behaves the same way
    # except it takes an activation key instead of username, password, and
    # maybe org id.
# def new_system_activation_key(self, profile_name, os_release_name,
# os_release_version, arch, activation_key, other):
# return { 'system_id' : self.new_system({'profile_name' : profile_name,
# 'os_release' : os_release_version,
# 'release_name' : os_release_name,
# 'architecture' : arch,
# 'token' : activation_key,
# }),
# 'channels' : ['UNDER CONSTRUCTION'],
# 'failed_channels' : ['UNDER CONSTRUCTION'],
# 'system_slots' : ['UNDER CONSTRUCTION'],
# 'failed_system_slots' : ['UNDER CONSTRUCTION'],
# }

    def get_possible_orgs(self, username, password):
        """ Gets all the orgs that a user belongs to.
            In the OCS-future, users may belong to more than one org.

            New for RHEL 5.

            Returns a dict like:
            {
                'orgs': {'19': 'Engineering', '4009': 'Finance'},
                'default_org': '19'
            }
            'orgs' must have at least one pair and 'default_org' must exist and point
            to something in 'orgs'.

            TODO Pick fault number for this and document it here
            Fault:
            * Bad credentials
        """
        user = rhnUser.auth_username_password(username, password)

        # buzilla #229362, jslagle
        # Clients currently are calling this method in hopes
        # to one day support multi-org satellite.
        # So, if we're running on a sat, return the default org
        # for now.
        org_id = user.contact["org_id"]
        org_name = user.customer["name"]
        orgs = {str(org_id): org_name}
        default_org = str(org_id)
        return {'orgs': orgs, 'default_org': default_org}

    def activate_registration_number(self, username, password, key, other):
        """ Entitle a particular org using an entitlement number.

            New for RHEL 5.

            username, password, and key are strings.
            other is a dict with:
            * org_id - optional. If it's not given, the user's default org is used.

            Returns a dict:
            {
                'status_code': <status code>,
                'registration_number': 'EN for this system'
                'channels' : channels,
                'system_slots' : system_slots
            }
            'status_code' must be 0 for "we just activated the key" or 1 for "this
            key was already activated."
            'registration_number' will be the EN corresponding to this activation. If
            we activated an EN we'll get the same thing back. If we activate an OEM
            number (eg asset tag) and maybe a pre-rhel 5 subscription number, we'll
            get back the EN that was generated from it.
            'channels' is a dict of the channel susbscriptions that the key activated
            the key/value pairs are label (string) / quantity (int)
            'system_slots' is a dict of the system slots that the key activated
            the key/value pairs are label (string) / quantity (int)

            TODO Assign fault values and document them here
            Faults:
            * Invalid key (600)
            * Bad credentials (?) - covers bad username and password, bad org id, and
            user not in specified org
        """
        # bugzilla# 236927, jslagle
        # Clients are currently broken in that they try to activate
        # installation numbers against a satellite.
        # We can work around this by just raising the 'number is not
        # entitling' fault.
        raise rhnFault(602)

    def __findAssetTag(self, vendor, hardware_info):
        """ Given some hardware information, we try to find the asset tag or
            serial number.

            See activate_hardware_info below for the structure of the
            hardware_info
        """

        if vendor in self.vendor_tags:
            asset_value = ""
            key = self.vendor_tags[vendor]
            log_debug(5, "key: " + str(key))
            if key in hardware_info:
                return hardware_info[key]

        # nothing found
        log_debug(5, "no tag found for vendor: " + str(vendor))
        return None

    def __transform_vendor_to_const(self, vendor):
        if vendor in [None, "", "Not Available", "None", "N/A"]:
            return None

        if vendor.lower().startswith("dell"):
            return "DELL"
        else:
            return None

    def activate_hardware_info(self, username, password, hardware_info, other):
        """
        Given some hardware-based criteria per-vendor, try giving entitlements.

        New for RHEL 5.

        Mostly the same stuff as activate_registration_number.
        hardware_info is a dict of stuff we get from hal from
        Computer -> system.* and smbios.*. For example:
        {
            'system.product': '2687D8U ThinkPad T43',
            'system.vendor': 'IBM',
            'smbios.chassis.type': 'Notebook',
            ...
        }
        """

        log_debug(5, username, hardware_info, other)

        # bugzilla #236927, jslagle
        # RHN clients are currently broken in that they always try to activate
        # hardware info regardless of if they're pointed at satellite or hosted.
        # To fix the satellite case, just raise the 'no entitlements tied to
        # this hardware' fault.
        raise rhnFault(601)

    def attempt_eol_mailing(self, user, server):

        if not user:
            raise Exception("user required to attempt eol mailing")

        if "email" in user.info:
            log_debug(4, "sending eol mail...")
            body = EOL_EMAIL % {'server': server.server['name']}
            headers = {}
            headers['From'] = "SUSE Manager Server <dev-null@%s>" % os.uname()[1]
            headers['To'] = user.info['email']
            headers['Subject'] = 'End of Life SUSE Manager Channel Subscription'
            rhnMail.send(headers, body)

    def send_serial(self, system_id, number, vendor=None):
        """
        Receive a vendor serial number from the client and tag it to the server.
        """
        log_debug(1, number, vendor)
        # well, we don't do that anymore
        return 0

    # XXX: update this function to deal with the channels and stuff
    # TODO: Is this useful? we think not. investigate and possibly replace
    # with a NOOP.
    def upgrade_version(self, system_id, newver, change_channel = True):
        """ Upgrade a certificate's version to a different release. """
        log_debug(5, system_id, newver, change_channel)
        # we need to load the user because we will generate a new certificate
        self.load_user = 1
        server = self.auth_system(system_id)
        newver = str(newver)
        if not newver:
            raise rhnFault(21, _("Invalid system release version requested"))
        #log the entry
        log_debug(1, server.getid(), newver, change_channel)
        if change_channel:
            ret = server.change_base_channel(newver)
            server.save()
        else:
            server.server["release"] = newver
            msg = """The SUSE Manager Update Agent has detected a
            change in the base version of the operating system running
            on your system"""
            server.add_history("Updated system release to %s" % (newver), msg)
            server.save_history_byid(server.server["id"])
            server.save()

        return server.system_id()

    def add_packages(self, system_id, packages):
        """ Add one or more package to the server profile. """
        log_debug(5, system_id, packages)
        if CFG.DISABLE_PACKAGES:
            return 0
        packages = self._normalize_packages(system_id, packages)
        server = self.auth_system(system_id)
        # log the entry
        log_debug(1, server.getid(), "packages: %d" % len(packages))
        check_products = False
        if len(server.get_packages()) == 0:
            check_products = True
        for package in packages:
            server.add_package(package)
        # XXX: check return code
        server.save_packages()
        if check_products:
            server.install_missing_product_packages()
        return 0

    def delete_packages(self, system_id, packages):
        """ Delete one or more packages from the server profile """
        log_debug(5, system_id, packages)
        if CFG.DISABLE_PACKAGES:
            return 0
        packages = self._normalize_packages(system_id, packages)
        server = self.auth_system(system_id)
        # log the entry
        log_debug(1, server.getid(), "packages: %d" % len(packages))
        for package in packages:
            server.delete_package(package)
        # XXX: check return code
        server.save_packages()
        return 0

    def delta_packages(self, system_id, packages):
        log_debug(5, system_id, packages)
        if CFG.DISABLE_PACKAGES:
            return 0
        if type(packages) != type({}):
            log_error("Invalid argument type", type(packages))
            raise rhnFault(21)
        added_packages = self._normalize_packages(system_id, packages.get('added'), allow_none=1)
        removed_packages = self._normalize_packages(system_id, packages.get('deleted'), allow_none=1)

        server = self.auth_system(system_id)
        # log the entry
        if added_packages is not None:
            log_debug(1, self.server_id, "added: %d" % len(added_packages))
        if removed_packages is not None:
            log_debug(1, self.server_id, "deleted: %d" % len(removed_packages))
        # Update the capabilities list
        rhnCapability.update_client_capabilities(self.server_id)
        for package in added_packages or []:
            server.add_package(package)
        for package in removed_packages or []:
            server.delete_package(package)
        server.save_packages()
        return 0

    def virt_notify(self, system_id, actions):
        """ This function fields virtualization-related notifications from the
            client and delegates them out to the appropriate downstream handlers.
            The 'actions' argument is formatted as follows:

            actions = [ ( timestamp, event, target, properties ), ... ]
        """
        log_debug(3, "Received virt notification:", system_id, actions)

        # Authorize the client.
        server = self.auth_system(system_id)
        server_id = server.getid()

        rhnVirtualization._virt_notify(server_id, actions)

        rhnSQL.commit()

        return 0

    def update_packages(self, system_id, packages):
        """ This function will update the package list associated with a server
            to be exactly the list of packages passed on the argument list
        """
        log_debug(5, system_id, packages)
        if CFG.DISABLE_PACKAGES:
            return 0
        packages = self._normalize_packages(system_id, packages)

        server = self.auth_system(system_id)
        # log the entry
        log_debug(1, server.getid(), "packages: %d" % len(packages))
        server.dispose_packages()
        for package in packages:
            server.add_package(package)
        server.save_packages()
        return 0

    def _normalize_packages(self, system_id, packages, allow_none=0):
        """ the function checks if list of packages is well formated
            and also converts packages from old list of lists
            (extended_profile >= 2) to new list of dicts (extended_profile = 2)
        """

        if allow_none and packages is None:
            return None
        # we need to be paranoid about the format of the argument because
        # if we accept wrong input then we might end up disposing in error
        # of all packages registered here
        if type(packages) != type([]):
            log_error("Invalid argument type", type(packages))
            raise rhnFault(21)

        # Update the capabilities list
        server = self.auth_system(system_id)
        rhnCapability.update_client_capabilities(self.server_id)

        # old clients send packages as a list of arrays
        # while new (capability packages.extended_profile >= {version: 2, value: 1})
        # use a list of dicts
        client_caps = rhnCapability.get_client_capabilities()
        package_is_dict = 0
        packagesV2 = []
        if client_caps and 'packages.extended_profile' in client_caps:
            cap_info = client_caps['packages.extended_profile']
            if cap_info and int(cap_info['version']) >= 2:
                package_is_dict = 1
                packagesV2 = packages

        for package in packages:
            if package_is_dict:
                # extended_profile >= 2
                if type(package) != type({}):
                    log_error("Invalid package spec for extended_profile >= 2",
                              type(package), "len = %d" % len(package))
                    raise rhnFault(21)
            else:
                # extended_profile < 2
                if (type(package) != type([]) or len(package) < 4):
                    log_error("Invalid package spec", type(package),
                              "len = %d" % len(package))
                    raise rhnFault(21)
                else:
                    p = {'name': package[0],
                         'version': package[1],
                         'release': package[2],
                         'epoch': package[3],
                         }
                    if len(package) > 4:
                        p['arch'] = package[4]
                    if len(package) > 5:
                        p['cookie'] = package[5]
                    packagesV2.append(p)
        return packagesV2

    def extract_and_save_netinfos(self, server, hardware):
        if 'hostname' in list(hardware.keys()):
            server.server["hostname"] = hardware["hostname"]
            del hardware["hostname"]
        if 'ipaddr' in list(hardware.keys()):
            server.addr["ipaddr"] = hardware["ipaddr"]
            del hardware["ipaddr"]
        if 'ip6addr' in list(hardware.keys()):
            server.addr["ip6addr"] = hardware["ip6addr"]
            del hardware["ip6addr"]

    def extract_and_save_fqdns(self, server, hardware):
        hardware_curr = hardware.copy()
        for fqdn in hardware['name']:
            hardware_curr['name'] = fqdn
            server.add_hardware(hardware_curr)

    def __add_hw_profile_no_auth(self, server, hwlist):
        """ Insert a new profile for the server, but do not authenticate """
        log_debug(1, server.getid(), "items: %d" % len(hwlist))
        for hardware in hwlist[:]:
            if hardware['class'] == 'NETINFO':
                self.extract_and_save_netinfos(server, hardware)
                continue
            if hardware['class'] == 'FQDN':
                self.extract_and_save_fqdns(server, hardware)
                continue
            server.add_hardware(hardware)
        # XXX: check return code
        server.save_hardware()
        server.save()

    def add_hw_profile(self, system_id, hwlist):
        """ Insert a new profile for the server """
        log_debug(5, system_id, hwlist)
        server = self.auth_system(system_id)
        self.__add_hw_profile_no_auth(server, hwlist)
        # set primary interface to the one that is used to reach the server
        sid = server.getid()

        ipaddr_suffix = 0
        ipaddr_value = None
        # use ipaddr by default, if it is null try to fallback
        # on ip6addr, if it is null as well --> fail
        if server.addr.get("ipaddr"):
            ipaddr_value = server.addr.get("ipaddr")
            ipaddr_suffix = 4
            log_debug(1, system_id, "Setting ipaddr as a primary interface")
        elif server.addr.get("ip6addr"):
            ipaddr_value = server.addr.get("ip6addr")
            ipaddr_suffix = 6
            log_debug(1, system_id, "Setting ip6addr as a primary interface")
        else:
            raise rhnFault(22, _("Unable to find a valid network interface, both ipaddr and ip6addr not found."))

        # read the interface from the right table in the database
        # according to the primary network interface found
        h = rhnSQL.prepare("""
            select interface_id
            from rhnServerNetAddress{0} rsna
                left join rhnServerNetInterface rsni
                    on rsna.interface_id = rsni.id
            where address = :address and server_id = :server_id
        """.format(ipaddr_suffix))
        h.execute(address=ipaddr_value, server_id=sid)
        row = h.fetchone_dict()
        if row:
            primif=row.get('interface_id')
            if primif:
                h = rhnSQL.prepare("""
                    update rhnservernetinterface set is_primary = 'Y' where id = :id
                """)
                h.execute(id=primif)
                rhnSQL.commit()

        return 0

    def refresh_hw_profile(self, system_id, hwlist):
        """ Recreate the server HW profile """
        log_debug(5, system_id, hwlist)
        server = self.auth_system(system_id)
        sid = server.getid()
        # clear out the existing list first
        # the only difference between add_hw_profile and refresh_hw_profile
        # make sure primary network interface does not get reset
        h = rhnSQL.prepare("""
            select name from rhnservernetinterface where server_id = :server_id AND is_primary ='Y'
        """)
        h.execute(server_id=sid)
        row = h.fetchone_dict()
        server.delete_hardware()
        self.__add_hw_profile_no_auth(server, hwlist)
        if row:
            h = rhnSQL.prepare("""
                update rhnservernetinterface set is_primary = 'Y' where server_id = :server_id AND name = :name
            """)
            h.execute(server_id=sid, name=row['name'])
            rhnSQL.commit()
        return 0

    def welcome_message(self, lang=None):
        """ returns string of welcome message """
        log_debug(1, "lang: %s" % lang)
        if lang:
            cat.setlangs(lang)
        msg = _("{PRODUCT_NAME} Welcome Message").format(PRODUCT_NAME=PRODUCT_NAME)
        # compress this one
        rhnFlags.set("compress_response", 1)
        return msg

    def privacy_statement(self, lang=None):
        """ returns string of privacy statement """
        log_debug(1, "lang: %s" % lang)
        if lang:
            cat.setlangs(lang)
        msg = _("Privacy Statement")
        # compress this one
        rhnFlags.set("compress_response", 1)
        return msg

    def register_product(self, system_id, product, oeminfo={}):
        """ register a product and record the data sent with the registration

            bretm:  hasn't registered a product or recorded anything since 2001, near
              as I can tell what it actually appears to be responsible for is
              protecting us against people registering systems from t7/t9
              countries

              actual use of registration numbers has been moved into the
              server_class.__save stuff
        """

        log_debug(5, system_id, product, oeminfo)
        if type(product) != type({}):
            log_error("Invalid argument type", type(product))
            raise rhnFault(21, _(
                "Expected a dictionary as a product argument"))
        log_debug(4, product)
        # As per bug 129996 using an activation key should not overwrite the
        # user's info. Also, the reg number stuff doesn't work anyway
        # Keep doing the authentication and then just bail out
        self.auth_system(system_id)
        return 0

    def update_contact_info(self, username, password, info={}):
        """ this API call is no longer used """
        log_debug(5, username, info)
        username, password = str(username), str(password)
        user = rhnUser.search(username)
        if user is None:
            log_error("invalid username", username)
            raise rhnFault(2)

        if not user.check_password(password):
            log_error("User password check failed", username)
            raise rhnFault(2)

        if rhnUser.is_user_disabled(username):
            msg = _("""
                   %s Account has been deactivated on this server.
                   Please contact your Org administrator for more help.""")
            raise rhnFault(1, msg % username, explain=0)

        return 0

    def update_transactions(self, system_id, timestamp, transactions_hash):
        """ Updates the RPM transactions """
        log_debug(1)
        # Authenticate
        server = self.auth_system(system_id)
        # No op as of 20030923
        return 0

    def anonymous(self, release=None, arch=None):
        """ To reduce the number of tracebacks """
        log_debug(1, "Disabled!", release, arch)
        raise rhnFault(28)

    def finish_message(self, system_id):
        """ Presents the client with a message to display
            Returns:
            (returnCode, titleText, messageText)
            titleText is the window's title, messageText is the message displayed in
            that window by the client

            if returnCode is 1, the client
              will show the message in a window with the
              title of titleText, and allow the user to
              continue.
            if returnCode is -1, the client
              will show the message in a window with the
              title of titleText, and not allow the user
              to continue
            if returnCode is 0, no message
              screen will be shown.
        """
        log_debug(1)
        # Authenticate
        self.auth_system(system_id)

        return_code, text_title, text_message = \
            self.server.fetch_registration_message()
        if return_code:
            return return_code, text_title, text_message

        # If return_code is 0, check to see if we don't have a system-wide
        # message that we want to push
        return_code = int(CFG.REG_FINISH_MESSAGE_RETURN_CODE)
        if return_code == 0:
            # Nothing to display
            return (0, "", "")

        # We need to send back something
        text_title = CFG.REG_FINISH_MESSAGE_TITLE or ""
        text_file = CFG.REG_FINISH_MESSAGE_TEXT_FILE
        try:
            text_message = open(text_file).read()
        except IOError:
            e = sys.exc_info()[1]
            log_error("reg_fishish_message_return_code is set, but file "
                      "%s invalid: %s" % (text_file, e))
            return (0, "", "")
        return (return_code, text_title, text_message)

    _query_get_dispatchers = rhnSQL.Statement("""
        select jabber_id from rhnPushDispatcher
    """)

    def _get_dispatchers(self):
        h = rhnSQL.prepare(self._query_get_dispatchers)
        h.execute()
        return [x['jabber_id'] for x in h.fetchall_dict() or []]

    def register_osad(self, system_id, args={}):
        log_debug(1)

        # Authenticate
        server = self.auth_system(system_id)

        jabber_server = CFG.JABBER_SERVER
        if not jabber_server:
            log_error("Jabber server not defined")
            return {}

        server_timestamp, client_name, shared_key = \
            server.register_push_client()

        ret = args.copy()
        dispatchers = self._get_dispatchers()
        ret.update({
            'client-name': client_name,
            'shared-key': shared_key,
            'server-timestamp': server_timestamp,
            'jabber-server': jabber_server,
            'dispatchers': dispatchers,
        })
        return ret

    def register_osad_jid(self, system_id, args={}):
        log_debug(1)

        # Authenticate
        server = self.auth_system(system_id)

        if 'jabber-id' not in args:
            raise rhnFault(160, "No jabber-id specified", explain=0)

        jid = args['jabber-id']
        server.register_push_client_jid(jid)
        return {}

    def available_eus_channels(self, username, password, arch,
                               version, release, other=None):
        '''
        Given a server arch, redhat-release version, and redhat-release release
        returns the eligible channels for that system based on the entitlements
        in the org specified by username/password

        Returns a dict of the available channels in the format:
        {'default_channel' : 'channel_label',
         'receiving_updates' : ['channel_label1', 'channel_label2'],
         'channels' : {'channel_label1' : 'channel_name1',
         'channel_lable2' : 'channel_name2'}
        }
        '''

        user = rhnUser.search(username)

        if user is None:
            log_error("invalid username", username)
            raise rhnFault(2)

        if not user.check_password(password):
            log_error("User password check failed", username)
            raise rhnFault(2)

        if rhnUser.is_user_disabled(username):
            msg = _("""
                   %s Account has been deactivated on this server.
                   Please contact your Org administrator for more help.""")
            raise rhnFault(1, msg % username, explain=0)

        server_arch = normalize_server_arch(arch)
        user_id = user.getid()
        org_id = user.contact['org_id']

        channels = rhnChannel.base_eus_channel_for_ver_rel_arch(
            version, release, server_arch,
            org_id, user_id)

        log_debug(4, "EUS Channels are: %s" % str(channels))

        default_channel = ''
        eus_channels = {}
        receiving_updates = []

        if channels is not None:
            eus_channels = {}
            for channel in channels:
                eus_channels[channel['label']] = channel['name']
                if channel['is_default'] == 'Y':
                    default_channel = channel['label']
                if channel['receiving_updates'] == 'Y':
                    receiving_updates.append(channel['label'])

        return {'default_channel': default_channel,
                'receiving_updates': receiving_updates,
                'channels': eus_channels}

    def remaining_subscriptions(self, username, password, arch, release):
        """ This is an obsoleted API call used in old RHEL5 clients to determine
            if they should show the "activate a subscription" page.
        """
        return 1

    def update_systemid(self, system_id):
        """ update_systemid: update client server and certificate
            In case the calling system is not using a certificate with a SHA-256
            checksum, update its secret and issue it a new client certificate.
        """
        server = self.auth_system(system_id)
        cert = Certificate()
        cert.reload(system_id)

        # System already uses certificate with a SHA-256 checksum,
        # we'll just return current systemid back
        if len(server.server['secret']) == 64:
            return cert.certificate()
        else:  # MD5 checksum
            server.set_arch(cert['architecture'])
            server.user = rhnUser.User("", "")
            server.user.reload(server.server['creator_id'])
            server.gen_secret()  # create new SHA-256 server secret
            server.save()
            return server.system_id()

    def suse_update_products(self, system_id, guid, secret, target, products):
        log_debug(5, system_id, guid, target, products)
        server = self.auth_system(system_id)
        log_debug(1, server.getid())
        server.update_suse_products(products)
        return 0

def _faultValueString(value, name):
    return _("Invalid value '%s' for %s (%s)") % (
        str(value), str(name), type(value))


EOL_EMAIL = """
Dear SUSE Manager User,

This email has been autogenerated to alert you that you recently
subscribed the following system to a SUSE Manager channel related
to an operating system that has reached End of Life:

%(server)s

Operating systems that have reached End of Life are no longer
receiving maintenance support (patches), which may make them
unsuitable to your needs.

For more information regarding SUSE support, please go to:

http://www.suse.com/support/

If you are interested in an operating system of SUSE with
a longer release lifecycle, 5+ year maintenance period, ISV
support, and enhanced functionality, check out SUSE
Linux Enterprise products at:

http://www.suse.com/products/

Thank you for using SUSE Manager.
"""


#-------------------------------------------------------------------------------
07070100000179000081B40000000000000000000000015FBBE8EE0000128A000000000000000000000000000000000000003100000000spacewalk-backend/server/handlers/xmlrpc/scap.py  #
# Copyright (c) 2013--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import os
import stat
import grp
from base64 import decodestring

from spacewalk.common.rhnTranslate import _
from spacewalk.common.rhnException import rhnFault
from spacewalk.common.rhnConfig import CFG
from spacewalk.common.rhnLog import log_debug
from spacewalk.server import rhnSQL
from spacewalk.server.rhnHandler import rhnHandler
from spacewalk.server.rhnLib import get_action_path, get_actionfile_path


class Scap(rhnHandler):

    def __init__(self):
        rhnHandler.__init__(self)
        self.functions.append('upload_result')

    def upload_result(self, system_id, action_id, scap_file):
        self.auth_system(system_id)
        self._authorize_request(action_id)

        required_keys = ['filename', 'filecontent', 'content-encoding']
        for k in required_keys:
            if k not in scap_file:
                log_debug(1, self.server_id, "The scap file data is invalid or incomplete: %s" % scap_file)
                raise rhnFault(5101, "Missing or invalid key: %s" % k)

        return self._store_file(action_id, scap_file)

    def _store_file(self, action_id, scap_file):
        r_dir = get_action_path(self.server.server['org_id'], self.server_id, action_id)
        if not r_dir:
            log_debug(1, self.server_id, "Error composing SCAP action directory path")
            raise rhnFault(5102)
        r_file = get_actionfile_path(self.server.server['org_id'], self.server_id, action_id, scap_file['filename'])
        if not r_file:
            log_debug(1, self.server_id, "Error composing SCAP action file path")
            raise rhnFault(5103)

        if not scap_file['content-encoding'] == 'base64':
            log_debug(1, self.server_id, "Invalid content encoding: %s" % scap_file['content-encoding'])
            raise rhnFault(5104)

        # Create the file on filer
        filecontent = decodestring(scap_file['filecontent'])
        # TODO assert for the size of the file

        absolute_dir = os.path.join(CFG.MOUNT_POINT, r_dir)
        absolute_file = os.path.join(absolute_dir, scap_file['filename'])

        if not os.path.exists(absolute_dir):
            log_debug(1, self.server_id, "Creating action directory: %s" % absolute_dir)
            os.makedirs(absolute_dir)
            mode = stat.S_IRWXU | stat.S_IRWXG | stat.S_IROTH | stat.S_IXOTH
            subdirs = r_dir.split('/')
            www_gid = grp.getgrnam('www').gr_gid
            for idx in range(1, len(subdirs)):
                subdir = os.path.join(CFG.MOUNT_POINT, *subdirs[0: idx])
                if os.path.isdir(subdir):
                    try:
                        log_debug(1, "chmod 755", subdir)
                        os.chmod(subdir, mode)
                    except OSError:
                        pass
                    try:
                        log_debug(1, "chgrp www ", subdir)
                        os.chown(subdir, -1, www_gid)
                    except OSError:
                        pass
        log_debug(1, self.server_id, "Creating file: %s" % absolute_file)
        f = open(absolute_file, 'w+')
        f.write(filecontent)
        return {'result': True,
                }

    def _authorize_request(self, action_id):
        # Make sure that database contains records in
        #     rhnServerAction and rhnActionScap
        # and not contains records in
        #     rhnXccdfTestResult
        # for given (system_id, action_id) pair
        h = rhnSQL.prepare(_query_authorize_request)
        h.execute(server_id=self.server_id, action_id=action_id)
        exists = h.fetchone()
        if len(exists) != 1:
            raise rhnFault(50, _("Invalid system_id/action_id pair."))

_query_authorize_request = rhnSQL.Statement("""
select 1
    from rhnServerAction rsa,
         rhnActionScap ras
    where rsa.server_id = :server_id
      and rsa.action_id = :action_id
      and rsa.action_id = ras.action_id
      and rsa.status in (0, 1)
      and not exists
      (
          select rxt.id
            from rhnXccdfTestresult rxt
           where rxt.server_id = rsa.server_id
             and rxt.action_scap_id = ras.id
      )
""")
  0707010000017A000081B40000000000000000000000015FBBE8EE000009FD000000000000000000000000000000000000003300000000spacewalk-backend/server/handlers/xmlrpc/states.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#


states_to_abbr = {
    'Alabama': 'AL',
    'Alaska': 'AK',
    'Arizona': 'AZ',
    'Arkansas': 'AR',
    'California': 'CA',
    'Colorado': 'CO',
    'Connecticut': 'CT',
    'Delaware': 'DE',
    'District of Columbia': 'DC',
    'Florida': 'FL',
    'Georgia': 'GA',
    'Hawaii': 'HA',
    'Idaho': 'ID',
    'Illinois': 'IL',
    'Indiana': 'IN',
    'Iowa': 'IA',
    'Kansas': 'KS',
    'Kentucky': 'KY',
    'Louisiana': 'LA',
    'Maine': 'ME',
    'Maryland': 'MD',
    'Massachusetts': 'MA',
    'Michigan': 'MI',
    'Minnesota': 'MI',
    'Mississippi': 'MS',
    'Missouri': 'MO',
    'Montana': 'MT',
    'Nebraska': 'NE',
    'Nevada': 'NV',
    'New Hampshire': 'NH',
    'New Jersey': 'NJ',
    'New Mexico': 'NM',
    'New York': 'NY',
    'North Carolina': 'NC',
    'North Dakota': 'ND',
    'Ohio': 'OH',
    'Oklahoma': 'OK',
    'Oregon': 'OR',
    'Pennsylvania': 'PA',
    'Rhode Island': 'RI',
    'South Carolina': 'SC',
    'South Dakota': 'SD',
    'Tennessee': 'TN',
    'Texas': 'TX',
    'Utah': 'UT',
    'Vermont': 'VT',
    'Virginia': 'VA',
    'Washington': 'WA',
    'West Virginia': 'WV',
    'Wisconsin': 'WI',
    'Wyoming': 'WY',
    'American Samoa': 'AS',
    'Armed Forces(AA)': 'AA',
    'Armed Forces(AE)': 'AE',
    'Armed Forces(AP)': 'AP',
    'Guam': 'GU',
    'Marshall Islands': 'MH',
    'Micronesia': 'FM',
    'Northern Marianas': 'MP',
    'Palau': 'PW',
    'Puerto Rico': 'PR',
    'Trust Territories': 'TT',
    'Virgin Islands': 'VI'}

# British Columbia
# Manitoba
# New Brunswick
# Newfoundland
# Northwest Territory
# Nova Scotia
# Ontario
# Prince Edward Island
# Quebec
# Saskatchewan
# Yukon Territory


#-----------------------------------------------------------------------------
if __name__ == "__main__":
    print("You can not run this module by itself")
    import sys
    sys.exit(-1)
#-----------------------------------------------------------------------------
   0707010000017B000081B40000000000000000000000015FBBE8EE000032B9000000000000000000000000000000000000003400000000spacewalk-backend/server/handlers/xmlrpc/up2date.py   #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# Implements the up2date.* fucntions for XMLRPC
#

# system module import
import time

from spacewalk.server.rhnServer import server_lib
from uyuni.common.usix import ListType, TupleType, StringType
from spacewalk.common import rhnFlags
from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.common.rhnConfig import CFG
from spacewalk.common.rhnException import rhnFault
from spacewalk.common.rhnTB import add_to_seclist
from spacewalk.common.rhnTranslate import _
from spacewalk.server.rhnLib import computeSignature
from spacewalk.server.rhnHandler import rhnHandler
from spacewalk.server import rhnChannel, rhnDependency, rhnCapability
from spacewalk.server.rhnServer import server_route

import re
NONSUBSCRIBABLE_CHANNELS = re.compile("(rhn-proxy|rhn-satellite)")


class Up2date(rhnHandler):

    """ xml-rpc Server Functions that we will provide for the outside world.
    """

    def __init__(self):
        """ Up2date Class Constructor

           o Initializes inherited class.
           o Appends the functions available to the outside world in the
             rhnHandler list.
        """
        rhnHandler.__init__(self)
        # Function list inherited from rhnHandler
        # This action garners control of what is available to the client.

        # --- Clients v2+ ---
        # (getting headers, source and packages done with GETs now).
        self.functions.append('login')
        self.functions.append('listChannels')
        self.functions.append('subscribeChannels')
        self.functions.append('unsubscribeChannels')
        self.functions.append('history')
        self.functions.append('solvedep')
        self.functions.append('solveDependencies')
        self.functions.append('solveDependencies_arch')
        self.functions.append('solveDependencies_with_limits')

    def auth_system(self, action, system_id):
        # Stuff the action in the headers:
        transport = rhnFlags.get('outputTransportOptions')
        transport['X-RHN-Action'] = action
        return rhnHandler.auth_system(self, system_id)

    def login(self, system_id, extra_data={}):
        """ Clients v2+
            Log in routine.
            Return a dictionary of session token/channel information.
            Also sets this information in the headers.
        """
        log_debug(5, system_id)
        # Authenticate the system certificate. We need the user record
        # to generate the tokens
        self.load_user = 1
        server = self.auth_system('login', system_id)
        # log the entry
        log_debug(1, self.server_id)
        # Update the capabilities list
        rhnCapability.update_client_capabilities(self.server_id)
        # Fetch the channels this client is subscribed to
        channels = rhnChannel.getSubscribedChannels(self.server_id)

        rhnServerTime = str(time.time())
        expireOffset = str(CFG.CLIENT_AUTH_TIMEOUT)
        signature = computeSignature(CFG.SECRET_KEY,
                                     self.server_id,
                                     self.user,
                                     rhnServerTime,
                                     expireOffset)

        loginDict = {
            'X-RHN-Server-Id': self.server_id,
            'X-RHN-Auth-User-Id': self.user,
            'X-RHN-Auth': signature,
            'X-RHN-Auth-Server-Time': rhnServerTime,
            'X-RHN-Auth-Expire-Offset': expireOffset,
            # List of lists [[label,last_mod],...]:
            'X-RHN-Auth-Channels': channels
        }

        # Duplicate these values in the headers so that the proxy can
        # intercept and cache them without parseing the xmlrpc.
        transport = rhnFlags.get('outputTransportOptions')
        for k, v in list(loginDict.items()):
            # Special case for channels
            if k.lower() == 'X-RHN-Auth-Channels'.lower():
                # Concatenate the channel information column-separated
                transport[k] = [':'.join(x) for x in v]
            else:
                transport[k] = v
        log_debug(5, "loginDict", loginDict, transport)

        # store route in DB (schema for RHN 3.1+ only!)
        server_route.store_client_route(self.server_id)

        return loginDict

    def listChannels(self, system_id):
        """ Clients v2+ """
        log_debug(5, system_id)
        # Authenticate the system certificate
        self.auth_system('listChannels', system_id)
        # log the entry
        log_debug(1, self.server_id)
        channelList = rhnChannel.channels_for_server(self.server_id)
        return channelList

    def subscribeChannels(self, system_id, channelNames, username, passwd):
        """ Clients v2+ """
        add_to_seclist(passwd)
        log_debug(5, system_id, channelNames, username, passwd)
        # Authenticate the system certificate
        self.auth_system('subscribeChannel', system_id)
        # log the entry
        log_debug(1, self.server_id, channelNames)
        server_lib.snapshot_server(self.server_id, 'Base Channel Updated')
        for channelName in channelNames:
            if NONSUBSCRIBABLE_CHANNELS.search(channelName):
                raise rhnFault(73, explain=False)
            else:
                rhnChannel.subscribe_channel(self.server_id, channelName,
                                             username, passwd)
        return 0

    def unsubscribeChannels(self, system_id, channelNames, username, passwd):
        """ Clients v2+ """
        add_to_seclist(passwd)
        log_debug(3)
        # Authenticate the system certificate
        self.auth_system('unsubscribeChannel', system_id)
        # log the entry
        log_debug(1, self.server_id, channelNames)
        for channelName in channelNames:
            rhnChannel.unsubscribe_channel(self.server_id, channelName,
                                           username, passwd)
        return 0

    def solvedep(self, system_id, deps):
        """ Clients v1-
            Solve dependencies for a given dependency problem list.
            IN:  a dependency problem list: [name, name, name, ...]
            RET: a package list: [[n,v,r,e],[n,v,r,e],...] That solves the
                 dependencies.
        """
        log_debug(4, system_id)
        return self.__solveDep(system_id, deps, action="solvedep",
                               clientVersion=1)

    def solveDependencies(self, system_id, deps):
        """ Clients v2+
            Solve dependencies for a given dependency problem list (newer version)
            IN:  a dependency problem list: [name, name, name, ...]
            RET: a hash {name: [[n, v, r, e], [n, v, r, e], ...], ...}
        """
        log_debug(4, system_id)
        return self.__solveDep(system_id, deps, action="solvedep",
                               clientVersion=2)

    def solveDependencies_arch(self, system_id, deps):
        """ Does the same thing as solve_dependencies, but also returns the architecture label with the
            package info.
            IN:  a dependency problem list: [name, name, name, ...]
            RET: a hash {name: [[n, v, r, e, a], [n, v, r, e, a], ...], ...}
        """
        log_debug(4, system_id)
        return self.__solveDep_arch(system_id, deps, action="solvedep",
                                    clientVersion=2)

    def solveDependencies_with_limits(self, system_id, deps, all=0, limit_operator=None, limit=None):
        """ This version of solve_dependencies allows the caller to get all of the packages that solve a
            dependency and limit the packages that are returned to those that match the criteria defined
            by limit_operator and limit. This version of the function also returns the architecture label
            of the package[s] that get returned.

            limit_operator can be any of: '<', '<=', '==', '>=', or '>'.
            limit is a a string of the format [epoch:]name-version-release
            deps is a list of filenames that the packages that are returned must provide.
            version is the version of the client that is calling the function.
        """
        log_debug(4, system_id)
        return self.__solveDep_with_limits(system_id, deps, action="solvedep",
                                           clientVersion=2, all=all, limit_operator=limit_operator, limit=limit)

    def history(self, system_id, summary, body=""):
        """ Clients v2+
            Add a history log for a performed action
        """
        log_debug(5, system_id, summary, body)
        # Authenticate the system certificate
        server = self.auth_system('history', system_id)
        # log the entry
        log_debug(1, self.server_id)
        # XXX: Probably this should be a non fatal error...
        server.add_history(summary, body)
        server.save_history()
        return 0

    # --- PRIVATE METHODS ---

    def __solveDep_prepare(self, system_id, deps, action, clientVersion):
        """ Response for clients:
                version 1: list
                version 2: hash
        """
        log_debug(7, system_id, deps, action, clientVersion)
        faultString = _("Invalid value %s (%s)")
        if type(deps) not in (ListType, TupleType):
            log_error("Invalid argument type", type(deps))
            raise rhnFault(30, faultString % (deps, type(deps)))
        for dep in deps:
            if type(dep) is not StringType:
                log_error("Invalid dependency member", type(dep))
                raise rhnFault(30, faultString % (dep, type(dep)))
        # Ignore empty strings
        deps = list(filter(len, deps))
        # anything left to do?
        if not deps:
            return []
        # Authenticate the system certificate
        server = self.auth_system(action, system_id)
        log_debug(1, self.server_id, action, "items: %d" % len(deps))
        return deps

    def __solveDep(self, system_id, deps, action, clientVersion):
        """ Response for clients:
                version 1: list
                version 2: hash
        """
        log_debug(5, system_id, deps, action, clientVersion)
        result = self.__solveDep_prepare(system_id, deps, action, clientVersion)
        if result:
            # Solve dependencies
            result = rhnDependency.solve_dependencies(self.server_id,
                                                      result, clientVersion)
        return result

    def __solveDep_arch(self, system_id, deps, action, clientVersion):
        """ Response for clients:
                version 1: list
                version 2: hash
        """
        log_debug(5, system_id, deps, action, clientVersion)
        result = self.__solveDep_prepare(system_id, deps, action, clientVersion)
        if result:
            # Solve dependencies
            result = rhnDependency.solve_dependencies_arch(self.server_id,
                                                           result, clientVersion)
        return result

    def __solveDep_with_limits(self, system_id, deps, action, clientVersion, all=0, limit_operator=None, limit=None):
        """ Response for clients:
                version 1: list
                version 2: hash
        """
        log_debug(5, system_id, deps, action, clientVersion)
        result = self.__solveDep_prepare(system_id, deps, action, clientVersion)
        if result:
            # Solve dependencies
            result = rhnDependency.solve_dependencies_with_limits(self.server_id,
                                                                  deps, clientVersion, all, limit_operator, limit)
        return result


class Servers(rhnHandler):

    """ A class to handle the site selection... """

    def __init__(self):
        """Servers Class Constructor. """
        rhnHandler.__init__(self)
        self.functions.append('get')
        self.functions.append('list')

    def get(self, *junk):
        """ Older funtion that can be a noop. """
        return []

    def list(self, systemid=None):
        """ Returns a list of available servers the client can connect to. """
        servers_list = [
            {
                'server':   'xmlrpc.rhn.redhat.com',
                'handler':   '/XMLRPC',
                'description':   'XML-RPC Server',
                'location':   'United States',
            },
        ]
        return servers_list
   0707010000017C000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002300000000spacewalk-backend/server/importlib    0707010000017D000081B40000000000000000000000015FBBE8EE000001D6000000000000000000000000000000000000002C00000000spacewalk-backend/server/importlib/Makefile   # Makefile for the import code
#

TOP	= ../..

SUBDIR	= server/importlib

SPACEWALK_FILES	= __init__ archImport backendLib backendOracle backend backend_checker \
            channelImport debPackage errataCache errataImport headerSource importLib \
	    kickstartImport mpmSource orgImport contentSourcesImport \
            packageImport productNamesImport packageUpload userAuth supportInformationImport \
            suseProductsImport

include $(TOP)/Makefile.defs
  0707010000017E000081B40000000000000000000000015FBBE8EE00000272000000000000000000000000000000000000002F00000000spacewalk-backend/server/importlib/__init__.py    # Copyright (c) 2008--2013 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#


__all__ = []
  0707010000017F000081B40000000000000000000000015FBBE8EE0000149A000000000000000000000000000000000000003100000000spacewalk-backend/server/importlib/archImport.py  #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Arch import process
#

from .importLib import Import


class ArchImport(Import):
    backend_method = ''

    def submit(self):
        meth = getattr(self.backend, self.backend_method)
        meth(self.batch)
        self.backend.commit()


class CPUArchImport(ArchImport):
    backend_method = 'processCPUArches'


class TypedArchImport(ArchImport):

    def preprocess(self):
        self.arch_types = {}
        for item in self.batch:
            arch_type_label = item['arch-type-label']
            arch_type_name = item['arch-type-name']
            self.arch_types[arch_type_label] = arch_type_name

    def fix(self):
        self.backend.lookupArchTypes(self.arch_types)
        for item in self.batch:
            item['arch_type_id'] = self.arch_types[item['arch-type-label']]


class ChannelArchImport(TypedArchImport):
    backend_method = 'processChannelArches'


class PackageArchImport(TypedArchImport):
    backend_method = 'processPackageArches'


class ServerArchImport(TypedArchImport):
    backend_method = 'processServerArches'


class BaseArchCompatImport(Import):
    # Things that have to be overridden in subclasses
    arches1_lookup_method_name = ''
    arches2_lookup_method_name = ''
    arches1_name = ''
    arches2_name = ''
    arches1_field_name = ''
    arches2_field_name = ''
    submit_method_name = ''

    def __init__(self, batch, backend):
        Import.__init__(self, batch, backend)
        self.arches1 = {}
        self.arches2 = {}

    def preprocess(self):
        # Build the hashes keyed on the label
        for entry in self.batch:
            self.arches1[entry[self.arches1_name]] = None
            self.arches2[entry[self.arches2_name]] = None

    def fix(self):
        # Look up the arches
        getattr(self.backend, self.arches1_lookup_method_name)(self.arches1)
        getattr(self.backend, self.arches2_lookup_method_name)(self.arches2)
        self._postprocess()

    def _postprocess(self):
        for entry in self.batch:
            arch1_name = entry[self.arches1_name]
            val = self.arches1.get(arch1_name)
            if not val:
                raise ValueError("Unsupported arch %s" % arch1_name)
            entry[self.arches1_field_name] = val

            arch2_name = entry[self.arches2_name]
            val = self.arches2.get(arch2_name)
            if not val:
                raise ValueError("Unsupported arch %s" % arch2_name)
            entry[self.arches2_field_name] = val

    def submit(self):
        getattr(self.backend, self.submit_method_name)(self.batch)
        self.backend.commit()


class ServerPackageArchCompatImport(BaseArchCompatImport):
    arches1_lookup_method_name = 'lookupServerArches'
    arches2_lookup_method_name = 'lookupPackageArches'
    arches1_name = 'server-arch'
    arches2_name = 'package-arch'
    arches1_field_name = 'server_arch_id'
    arches2_field_name = 'package_arch_id'
    submit_method_name = 'processServerPackageArchCompatMap'


class ServerChannelArchCompatImport(BaseArchCompatImport):
    arches1_lookup_method_name = 'lookupServerArches'
    arches2_lookup_method_name = 'lookupChannelArches'
    arches1_name = 'server-arch'
    arches2_name = 'channel-arch'
    arches1_field_name = 'server_arch_id'
    arches2_field_name = 'channel_arch_id'
    submit_method_name = 'processServerChannelArchCompatMap'


class ChannelPackageArchCompatImport(BaseArchCompatImport):
    arches1_lookup_method_name = 'lookupChannelArches'
    arches2_lookup_method_name = 'lookupPackageArches'
    arches1_name = 'channel-arch'
    arches2_name = 'package-arch'
    arches1_field_name = 'channel_arch_id'
    arches2_field_name = 'package_arch_id'
    submit_method_name = 'processChannelPackageArchCompatMap'


class ServerGroupServerArchCompatImport(BaseArchCompatImport):
    arches1_lookup_method_name = 'lookupServerArches'
    arches2_lookup_method_name = 'lookupServerGroupTypes'
    arches1_name = 'server-arch'
    arches2_name = 'server-group-type'
    arches1_field_name = 'server_arch_id'
    arches2_field_name = 'server_group_type'
    submit_method_name = 'processServerGroupServerArchCompatMap'

    # some entitlements are no longer supported, ignore any of them for
    # backwards compatibility
    def _postprocess(self):
        self.batch[:] = [entry for entry in self.batch if
                         entry[self.arches2_name] not in [
                             'monitoring_entitled', 'sw_mgr_entitled',
                             'provisioning_entitled', 'nonlinux_entitled',
                             'virtualization_host_platform']]
        BaseArchCompatImport._postprocess(self)
  07070100000180000081B40000000000000000000000015FBBE8EE0001A623000000000000000000000000000000000000002E00000000spacewalk-backend/server/importlib/backend.py #
# Copyright (c) 2008--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Generic DB backend
#

import copy
from datetime import datetime
import string
import sys

from uyuni.common.usix import raise_with_tb
from uyuni.common import rhn_rpm
from spacewalk.common.rhnConfig import CFG
from spacewalk.common.rhnException import rhnFault
from spacewalk.common.rhnLog import log_debug
from uyuni.common.stringutils import to_string
from spacewalk.server import rhnSQL, rhnChannel, taskomatic
from .importLib import Diff, Package, IncompletePackage, Erratum, \
    AlreadyUploadedError, InvalidPackageError, TransactionError, \
    SourcePackage
from .backendLib import TableCollection, sanitizeValue, TableDelete, \
    TableUpdate, TableLookup, addHash, TableInsert

sequences = {
    'rhnPackageCapability': 'rhn_pkg_capability_id_seq',
    'rhnPackage': 'rhn_package_id_seq',
    'rhnSourceRPM': 'rhn_sourcerpm_id_seq',
    'rhnPackageGroup': 'rhn_package_group_id_seq',
    'rhnErrata': 'rhn_errata_id_seq',
    'rhnChannel': 'rhn_channel_id_seq',
    'rhnChannelProduct': 'rhn_channelprod_id_seq',
    'rhnPackageSource': 'rhn_package_source_id_seq',
    'rhnChannelFamily': 'rhn_channel_family_id_seq',
    'rhnCVE': 'rhn_cve_id_seq',
    'rhnChannelArch': 'rhn_channel_arch_id_seq',
    'rhnPackageArch': 'rhn_package_arch_id_seq',
    'rhnServerArch': 'rhn_server_arch_id_seq',
    'rhnCPUArch': 'rhn_cpu_arch_id_seq',
    'rhnErrataFile': 'rhn_erratafile_id_seq',
    'rhnKickstartableTree': 'rhn_kstree_id_seq',
    'rhnArchType': 'rhn_archtype_id_seq',
    'rhnPackageChangeLogRec': 'rhn_pkg_cl_id_seq',
    'rhnPackageChangeLogData': 'rhn_pkg_cld_id_seq',
    'rhnContentSource': 'rhn_chan_content_src_id_seq',
    'suseProductFile': 'suse_prod_file_id_seq',
    'suseMdKeyword': 'suse_mdkeyword_id_seq',
    'suseEula': 'suse_eula_id_seq',
    'suseProducts': 'suse_products_id_seq',
    'suseSCCRepository': 'suse_sccrepository_id_seq',
    'suseProductSCCRepository': 'suse_prdrepo_id_seq',
    'rhnPackageExtraTagKey': 'rhn_package_extra_tags_keys_id_seq'
}


class Backend:
    # This object is initialized by the specific subclasses (e.g.
    # OracleBackend)
    tables = TableCollection()
    # TODO: Some reason why we're passing a module in here? Seems to
    # always be rhnSQL anyhow...

    def __init__(self, dbmodule):
        self.dbmodule = dbmodule
        self.sequences = {}

    # TODO: Why is there a pseudo-constructor here instead of just using
    # __init__?
    def init(self):
        # Initializes the database connection objects
        # This function has to be called on a newly defined Backend object
        # Initialize sequences
        for k, v in list(sequences.items()):
            self.sequences[k] = self.dbmodule.Sequence(v)
        # TODO: Why do we return a reference to ourselves? If somebody called
        # this method they already have a reference...
        return self

    def setDateFormat(self, format):
        sth = self.dbmodule.prepare("alter session set nls_date_format ='%s'"
                                    % format)
        sth.execute()
        sth = self.dbmodule.prepare("alter session set nls_timestamp_format ='%s'"
                                    % format)
        sth.execute()

    def processCapabilities(self, capabilityHash):
        if not capabilityHash:
            return

        sql = """
            WITH
              wanted (ordering, name, version) AS (
                VALUES %s
              ),
              missing AS (
                SELECT nextval('rhn_pkg_capability_id_seq') AS id, wanted.*
                  FROM wanted
                  LEFT JOIN rhnPackageCapability
                    ON rhnPackageCapability.name = wanted.name
                      AND rhnPackageCapability.version IS NOT DISTINCT FROM wanted.version
                  WHERE rhnPackageCapability.id IS NULL
              )
              INSERT INTO rhnPackageCapability(id, name, version)
                SELECT id, name, version
                  FROM missing
                  ORDER BY ordering
                ON CONFLICT DO NOTHING
        """
        sorted_capabilities = sorted(capabilityHash.keys(), key=lambda k:(k[0], k[1] or ''))
        wanted = [(i, key[0], None if key[1] == '' else key[1]) for i, key in enumerate(sorted_capabilities)]
        h = self.dbmodule.prepare(sql)
        h.execute_values(sql, wanted, fetch=False)

        sql = """
            WITH
              wanted (ordering, name, version) AS (
                VALUES %s
              )
              SELECT wanted.name, wanted.version, rhnPackageCapability.id
                FROM wanted
                JOIN rhnPackageCapability
                  ON rhnPackageCapability.name = wanted.name
                    AND rhnPackageCapability.version IS NOT DISTINCT FROM wanted.version
        """
        h = self.dbmodule.prepare(sql)
        capabilities = h.execute_values(sql, wanted)

        for capability in capabilities:
            capabilityHash[(capability[0], capability[1] or '')] = capability[2]

    def processChangeLog(self, changelogHash):
        if CFG.has_key('package_import_skip_changelog') and CFG.package_import_skip_changelog:
            return

        if not changelogHash:
            return

        sql = """
            WITH wanted (ordering, name, time, text) AS (
              VALUES %s
            ),
            missing AS (
              SELECT nextval('rhn_pkg_cld_id_seq') AS id, wanted.*
                FROM wanted
                LEFT JOIN rhnPackageChangeLogData
                    ON rhnPackageChangeLogData.name = wanted.name
                      AND rhnPackageChangeLogData.time = wanted.time
                      AND rhnPackageChangeLogData.text = wanted.text
                WHERE rhnPackageChangeLogData.id IS NULL
            )
            INSERT INTO rhnPackageChangeLogData(id, name, time, text)
              SELECT id, name, time, text
                FROM missing
                ORDER BY ordering
              ON CONFLICT DO NOTHING
        """
        values = [(i, key[0], datetime.strptime(key[1], '%Y-%m-%d %H:%M:%S'), key[2]) for i, key in enumerate(sorted(changelogHash.keys()))]
        h = self.dbmodule.prepare(sql)
        h.execute_values(sql, values, fetch=False)

        sql = """
            WITH wanted (ordering, name, time, text) AS (
              VALUES %s
            )
            SELECT wanted.name, wanted.time, wanted.text, rhnPackageChangeLogData.id
              FROM wanted
              JOIN rhnPackageChangeLogData
                  ON rhnPackageChangeLogData.name = wanted.name
                    AND rhnPackageChangeLogData.time = wanted.time
                    AND rhnPackageChangeLogData.text = wanted.text
        """
        h = self.dbmodule.prepare(sql)
        changelogs = h.execute_values(sql, values)

        for changelog in changelogs:
            changelogHash[(changelog[0], changelog[1].strftime('%Y-%m-%d %H:%M:%S'), changelog[2])] = changelog[3]


    def processSuseProductFiles(self, prodfileHash):
        sql = """
            SELECT spf.id
              FROM suseProductFile spf
             WHERE spf.name = :name
               AND spf.evr_id = :evr_id
               AND spf.package_arch_id = :package_arch_id
               AND spf.vendor = :vendor
               AND spf.summary = :summary
               AND spf.description = :description
        """
        h = self.dbmodule.prepare(sql)
        toinsert = [[], [], [], [], [], [], []]
        for name, evr_id, package_arch_id, vendor, summary, description in list(prodfileHash.keys()):
            val = {}
            _buildExternalValue(val, { 'name'        : name,
                                       'evr_id'      : evr_id,
                                       'package_arch_id' : package_arch_id,
                                       'vendor'      : vendor,
                                       'summary'     : summary,
                                       'description' : description
                                      }, self.tables['suseProductFile'])
            h.execute(name=val['name'], evr_id=val['evr_id'], package_arch_id=val['package_arch_id'],
                      vendor=val['vendor'], summary=val['summary'], description=val['description'])
            row = h.fetchone_dict()
            if row:
                prodfileHash[(name, evr_id, package_arch_id, vendor, summary, description)] = row['id']
                continue

            id = self.sequences['suseProductFile'].next()
            prodfileHash[(name, evr_id, package_arch_id, vendor, summary, description)] = id

            toinsert[0].append(id)
            toinsert[1].append(val['name'])
            toinsert[2].append(val['evr_id'])
            toinsert[3].append(val['package_arch_id'])
            toinsert[4].append(val['vendor'])
            toinsert[5].append(val['summary'])
            toinsert[6].append(val['description'])

        if not toinsert[0]:
            # Nothing to do
            return

        sql = """
            INSERT INTO suseProductFile (id, name, evr_id, package_arch_id, vendor, summary, description)
            VALUES (:id, :name, :evr_id, :package_arch_id, :vendor, :summary, :description)"""
        h = self.dbmodule.prepare(sql)
        h.executemany(id=toinsert[0], name=toinsert[1], evr_id=toinsert[2], package_arch_id=toinsert[3],
                      vendor=toinsert[4], summary=toinsert[5], description=toinsert[6])

    def processSuseEulas(self, eulaHash):
        query_lookup = """
            SELECT id
              FROM suseEula
             WHERE checksum = :checksum
        """
        h_lookup = self.dbmodule.prepare(query_lookup)

        query_insert = """
            INSERT INTO suseEula (id, text, checksum)
            VALUES (:id, :text, :checksum)"""
        h_insert = self.dbmodule.prepare(query_insert, blob_map={ 'text' : 'text' })

        for text, checksum in list(eulaHash.keys()):
            val = {}
            _buildExternalValue(val, { 'text'     : text,
                                       'checksum' : checksum
                                     }, self.tables['suseEula'])
            h_lookup.execute(checksum=val['checksum'])
            row = h_lookup.fetchone_dict()
            if row:
                eulaHash[(text, checksum)] = row['id']
                continue

            id = self.sequences['suseEula'].next()
            eulaHash[(text, checksum)] = id
            h_insert.execute(id=id, text=to_string(val['text']), checksum=val['checksum'])

    def processCVEs(self, cveHash):
        # First figure out which CVE's are already inserted
        sql = "select id from rhnCVE where name = :name"
        h = self.dbmodule.prepare(sql)
        toinsert = [[], []]

        for cve_name in list(cveHash.keys()):
            h.execute(name=cve_name)
            row = h.fetchone_dict()

            if row:
                cveHash[cve_name] = row['id']
                continue

            # Generate an id
            id = self.sequences['rhnCVE'].next()

            cveHash[cve_name] = id

            toinsert[0].append(id)
            toinsert[1].append(cve_name)

        if not toinsert[0]:
            # Nothing to do
            return

        sql = "insert into rhnCVE (id, name) values (:id, :name)"
        h = self.dbmodule.prepare(sql)
        h.executemany(id=toinsert[0], name=toinsert[1])

    def processExtraTags(self, extraTags):
        query_lookup = """
            SELECT id
              FROM rhnPackageExtraTagKey
             WHERE name = :name
        """
        h_lookup = self.dbmodule.prepare(query_lookup)
        toinsert = [[], []]

        for name in list(extraTags.keys()):
            val = {}
            _buildExternalValue(val, { 'name'     : name},
                                self.tables['rhnPackageExtraTagKey'])
            h_lookup.execute(name=name)
            row = h_lookup.fetchone_dict()
            if row:
                extraTags[name] = row['id']
                continue

            # Generate an id
            id = self.sequences['rhnPackageExtraTagKey'].next()
            extraTags[name] = id

            toinsert[0].append(id)
            toinsert[1].append(val['name'])

        if not toinsert[0]:
            # Nothing to do
            return

        query_insert = """
            INSERT INTO rhnPackageExtraTagKey (id, name)
            VALUES (:id, :name)"""
        h_insert = self.dbmodule.prepare(query_insert)
        h_insert.executemany(id=toinsert[0], name=toinsert[1])

    def lookupErrataFileTypes(self, hash):
        hash.clear()
        h = self.dbmodule.prepare("select id, label from rhnErrataFileType")
        h.execute()
        while 1:
            row = h.fetchone_dict()
            if not row:
                break
            hash[row['label']] = row['id']
        return hash

    def __lookupArches(self, archHash, table):
        if not archHash:
            return

        sql = "select id from %s where label = :name" % table
        h = self.dbmodule.prepare(sql)
        for k in list(archHash.keys()):
            h.execute(name=str(k))
            row = h.fetchone_dict()
            if row:
                archHash[k] = row['id']
            # Else, it's an unsupported architecture

    def lookupChannelArches(self, archHash):
        return self.__lookupArches(archHash, 'rhnChannelArch')

    def lookupPackageArches(self, archHash):
        return self.__lookupArches(archHash, 'rhnPackageArch')

    def lookupServerArches(self, archHash):
        return self.__lookupArches(archHash, 'rhnServerArch')

    def lookupArchTypes(self, arch_types_hash):
        h = self.dbmodule.prepare(
            "select id, name from rhnArchType where label = :label")
        seq = self.sequences['rhnArchType']
        updates = [[], []]
        inserts = [[], [], []]
        results = {}
        for label, name in list(arch_types_hash.items()):
            h.execute(label=label)
            row = h.fetchone_dict()
            if not row:
                next_id = seq.next()
                inserts[0].append(next_id)
                inserts[1].append(label)
                inserts[2].append(name)
                results[label] = next_id
                continue
            aid = row['id']
            results[label] = aid
            if name == row['name']:
                # Nothing to do
                continue
            updates[0].append(aid)
            updates[1].append(name)
        if inserts[0]:
            h = self.dbmodule.prepare("""
                    insert into rhnArchType (id, label, name)
                    values (:id, :label, :name)
            """)
            h.executemany(id=inserts[0], label=inserts[1], name=inserts[2])
        if updates[0]:
            h = self.dbmodule.prepare("""
                    update rhnArchType
                       set name = :name
                     where id = :id
            """)
            h.executemany(id=updates[0], name=updates[1])

        # Finally, update the hash
        arch_types_hash.update(results)

    def _lookupOrg(self):
        # Returns the org id
        sql = "select min(id) as id from web_customer"
        h = self.dbmodule.prepare(sql)
        h.execute()
        rows = h.fetchall_dict()
        if not rows:
            raise ValueError("No user is created")
        return rows[0]['id']

    def lookupOrg(self, org_name=None):
        if not org_name:
            return self._lookupOrg()
        # Returns id of the org if found, None otherwise
        sql = "select id from web_customer where name = :name"
        h = self.dbmodule.prepare(sql)
        h.execute(name=org_name)
        row = h.fetchone_dict()
        if not row:
            return None
        return row['id']

    def lookupMaster(self, master_label):
        # Returns the master record (if it exists)
        sql = "select * from rhnISSMaster where label = :label"
        h = self.dbmodule.prepare(sql)
        h.execute(label=master_label)
        return h.fetchone_dict()

    def createMaster(self, master_label):
        # Creates a master record with label master_label
        sql = """
            insert into rhnISSMaster (id, label)
            values (sequence_nextval('rhn_issmaster_seq'), :label)
        """
        h = self.dbmodule.prepare(sql)
        h.execute(label=master_label)

    def createMasterOrgs(self, master, orgs):
        # Create master org records
        insert = [[], [], []]
        for org in orgs:
            insert[0].append(master)
            insert[1].append(org['id'])
            insert[2].append(org['name'])
        sql = """
            insert into rhnISSMasterOrgs
                   (id, master_id, master_org_id, master_org_name)
            values (sequence_nextval('rhn_issmasterorgs_seq'),
                   (select id from rhnISSMaster where label = :label),
                   :id, :name)
        """
        h = self.dbmodule.prepare(sql)
        h.executemany(label=insert[0], id=insert[1], name=insert[2])

    def createOrgs(self, orgs):
        # Create local org records
        sql = """
            insert into web_customer (id, name)
            values (sequence_nextval('web_customer_id_seq'), :name)
        """
        h = self.dbmodule.prepare(sql)
        h.executemany(name=orgs)
        sql = "select id, name from web_customer"
        h = self.dbmodule.prepare(sql)
        h.execute()
        rows = h.fetchall_dict()
        ret = {}
        for row in rows:
            ret[row['name']] = row['id']
        return ret

    def updateMasterOrgs(self, master_orgs):
        # Update the master org to local org mapping
        insert = [[], []]
        for org in master_orgs:
            insert[0].append(org['master_id'])
            insert[1].append(org['local_id'])
        sql = """
            update rhnISSMasterOrgs
               set local_org_id=:local
             where master_org_id=:master
        """
        h = self.dbmodule.prepare(sql)
        h.executemany(master=insert[0], local=insert[1])

    def lookupOrgTrusts(self):
        # Return a hash of org trusts
        sql = "select org_id, org_trust_id from rhnTrustedOrgs"
        h = self.dbmodule.prepare(sql)
        h.execute()
        rows = h.fetchall_dict()
        ret = {}
        if rows:
            for row in rows:
                if row['org_id'] not in list(ret.keys()):
                    ret[row['org_id']] = []
                ret[row['org_id']].append(row['org_trust_id'])
        return ret

    def clearOrgTrusts(self, org_id):
        # Delete all trusts involving this org; trusts are always
        # bi-directional
        sql = """
        delete from rhnTrustedOrgs
              where org_id = :org_id
                 or org_trust_id = :org_id
        """
        h = self.dbmodule.prepare(sql)
        h.execute(org_id=org_id)

    def createOrgTrusts(self, trusts):
        # Create org trusts
        insert = [[], []]
        for trust in trusts:
            insert[0].append(trust['org_id'])
            insert[1].append(trust['trust'])
        sql = """
            insert into rhnTrustedOrgs (org_id, org_trust_id)
            values (:id, :trust)
        """
        h = self.dbmodule.prepare(sql)
        h.executemany(id=insert[0], trust=insert[1])

    def lookupOrgMap(self, master_label):
        sql = """
            select imo.master_org_id, imo.master_org_name, imo.local_org_id
              from rhnISSMasterOrgs imo,
                   rhnISSMaster im
             where im.id = imo.master_id
               and im.label = :master_label
        """
        h = self.dbmodule.prepare(sql)
        h.execute(master_label=master_label)
        rows = h.fetchall_dict()
        maps = {'master-name-to-master-id': {},
                'master-id-to-local-id': {}}
        if not rows:
            return maps
        mn_to_mi = {}  # master org name to master org id map
        mi_to_li = {}  # master org id to local org id map
        for org in rows:
            if ('master_org_id' in list(org.keys())
                    and 'master_org_name' in list(org.keys())
                    and org['master_org_id']
                    and org['master_org_name']):
                mn_to_mi[org['master_org_name']] = org['master_org_id']
            if ('master_org_id' in list(org.keys())
                    and 'local_org_id' in list(org.keys())
                    and org['master_org_id']
                    and org['local_org_id']):
                mi_to_li[org['master_org_id']] = org['local_org_id']
        maps['master-name-to-master-id'] = mn_to_mi
        maps['master-id-to-local-id'] = mi_to_li
        return maps

    def lookupChannels(self, hash):
        if not hash:
            return
        sql = "select id, channel_arch_id from rhnChannel where label = :label"
        h = self.dbmodule.prepare(sql)
        for k in list(hash.keys()):
            h.execute(label=k)
            row = h.fetchone_dict()
            if row:
                hash[k] = row
            # Else, it's an unsupported channel

    def lookupChannelPackageArchCompat(self, channelArchHash):
        # Return all the arches compatible with each key of archHash
        sql = """
            select package_arch_id
            from rhnChannelPackageArchCompat
            where channel_arch_id = :channel_arch_id
        """
        h = self.dbmodule.prepare(sql)
        for channel_arch_id in list(channelArchHash.keys()):
            dict = {}
            h.execute(channel_arch_id=channel_arch_id)
            while 1:
                row = h.fetchone_dict()
                if not row:
                    break
                dict[row['package_arch_id']] = None
            channelArchHash[channel_arch_id] = dict

    def lookupServerGroupTypes(self, entries_hash):
        sql = """
            select id
              from rhnServerGroupType
             where label = :label
        """
        h = self.dbmodule.prepare(sql)
        for sgt in list(entries_hash.keys()):
            h.execute(label=sgt)
            row = h.fetchone_dict()
            if not row:
                # server group not found
                continue
            entries_hash[sgt] = row['id']

    def lookupPackageNames(self, nameHash):
        if not nameHash:
            return
        sql = "select LOOKUP_PACKAGE_NAME(:name) id from dual"
        h = self.dbmodule.prepare(sql)
        for k in sorted(nameHash.keys()):
            h.execute(name=k)
            nameHash[k] = h.fetchone_dict()['id']

    def lookupErratum(self, erratum):
        if not erratum:
            return None

        sql = """
            select advisory
              from rhnErrata
             where advisory_name = :advisory_name
        """
        h = self.dbmodule.prepare(sql)
        h.execute(advisory_name=erratum['advisory_name'])
        return h.fetchone_dict()

    def lookupErrataSeverityId(self, erratum):
        """
        for the given severity type retuns the id
        associated in the rhnErratSeverity table.
        """
        if not erratum:
            return None

        sql = """
            select id
              from rhnErrataSeverity
             where label = :severity
        """

        h = self.dbmodule.prepare(sql)

        if 'security_impact' in erratum and erratum['security_impact']:
            #concatenate the severity to reflect the db
            #bz-204374: rhnErrataSeverity tbl has lower case severity values,
            #so we convert severity in errata hash to lower case to lookup.
            severity_label = 'errata.sev.label.' + erratum['security_impact'].lower()
        elif 'severity' in erratum and erratum['severity']:
            severity_label = erratum['severity']
        else:
            return None

        h.execute(severity=severity_label)
        row = h.fetchone_dict()

        if not row:
            log_debug(2, "Invalid severity: %s. Returning None." % severity_label)
            return None

        return row['id']

    def lookupEVRs(self, evrHash):
        sql = "select LOOKUP_EVR(:epoch, :version, :release) id from dual"
        h = self.dbmodule.prepare(sql)
        for evr in sorted(evrHash.keys(), key=lambda k: (str(k[0] or 0), k[1], k[2])):
            epoch, version, release = evr
            if epoch == '' or epoch is None:
                epoch = None
            else:
                epoch = str(epoch)
            h.execute(epoch=epoch, version=version, release=release)
            row = h.fetchone_dict()
            if row:
                evrHash[evr] = row['id']

    def lookupChecksums(self, checksumHash):
        if not checksumHash:
            return

        sql = """
            WITH wanted (ordering, checksum_type, checksum) AS (
              VALUES %s
            ),
            missing AS (
              SELECT nextval('rhnchecksum_seq') AS id, rhnChecksumType.id AS checksum_type_id, wanted.*
                FROM wanted
                  JOIN rhnChecksumType ON wanted.checksum_type = rhnChecksumType.label
                  LEFT JOIN rhnChecksum
                    ON rhnChecksum.checksum_type_id = rhnChecksumType.id
                      AND rhnChecksum.checksum = wanted.checksum
                WHERE rhnChecksum.id IS NULL
            )
            INSERT INTO rhnChecksum(id, checksum_type_id, checksum)
              SELECT id, checksum_type_id, checksum
                FROM missing
                ORDER BY ordering
              ON CONFLICT DO NOTHING
        """
        sorted_checksums = sorted(checksumHash.keys(), key=lambda k:(k[0], k[1] or ''))
        values = [(i, key[0], key[1]) for i, key in enumerate(sorted_checksums) if key[1] != '']

        if not values:
            return

        h = self.dbmodule.prepare(sql)
        r = h.execute_values(sql, values, fetch=False)


        sql = """
        WITH wanted (ordering, checksum_type, checksum) AS (
            VALUES %s
          )
          SELECT wanted.checksum_type, wanted.checksum, rhnChecksum.id
            FROM wanted
              JOIN rhnChecksumType ON wanted.checksum_type = rhnChecksumType.label
              JOIN rhnChecksum
                ON rhnChecksum.checksum_type_id = rhnChecksumType.id
                  AND rhnChecksum.checksum = wanted.checksum
        """
        h = self.dbmodule.prepare(sql)
        checksums = h.execute_values(sql, values)

        for checksum in checksums:
            checksumHash[(checksum[0], checksum[1])] = checksum[2]

    def lookupChecksumTypes(self, checksumTypeHash):
        if not checksumTypeHash:
            return
        sql = "select id from rhnChecksumType where label = :label"
        h = self.dbmodule.prepare(sql)
        for l in list(checksumTypeHash.keys()):
            h.execute(label=l)
            row = h.fetchone_dict()
            if row:
                checksumTypeHash[l] = row['id']

    def lookupPackageNEVRAs(self, nevraHash):
        sql = "select LOOKUP_PACKAGE_NEVRA(:name, :evr, :arch) id from dual"
        h = self.dbmodule.prepare(sql)
        for nevra in nevraHash:
            name, evr, arch = nevra
            if arch is None:
                arch = ''
            h.execute(name=name, evr=evr, arch=arch)
            row = h.fetchone_dict()
            if row:
                nevraHash[nevra] = row['id']

    def lookupPackagesByNEVRA(self, nevraHash):
        sql = """
              select id from rhnPackage
              where name_id = :name and
                    evr_id = :evr and
                    package_arch_id = :arch
              """
        h = self.dbmodule.prepare(sql)

        for nevra in nevraHash:
            name, evr, arch = nevra
            h.execute(name=name, evr=evr, arch=arch)
            row = h.fetchone_dict()
            if row:
                nevraHash[nevra] = row['id']

    def lookupPackageKeyId(self, header):
        lookup_keyid_sql = rhnSQL.prepare("""
           select pk.id
             from rhnPackagekey pk,
                  rhnPackageKeyType pkt,
                  rhnPackageProvider pp
            where pk.key_id = :key_id
              and pk.key_type_id = pkt.id
              and pk.provider_id = pp.id
        """)
        sigkeys = rhn_rpm.RPM_Header(header).signatures
        key_id = None  # _key_ids(sigkeys)[0]
        for sig in sigkeys:
            if sig['signature_type'] == 'gpg':
                key_id = sig['key_id']

        lookup_keyid_sql.execute(key_id=key_id)
        keyid = lookup_keyid_sql.fetchall_dict()

        return keyid[0]['id']

    def lookupSourceRPMs(self, hash):
        self.__processHash('lookup_source_name', hash)

    def lookupPackageGroups(self, hash):
        self.__processHash('lookup_package_group', hash)

    def lookupPackages(self, packages, checksums, ignore_missing=0):
        # If nevra is enabled use checksum as primary key
        self.validate_pks()
        for package in packages:
            if not isinstance(package, IncompletePackage):
                raise TypeError("Expected an IncompletePackage instance, found %s" %
                                str(type(package)))
        for package in packages:
            # here we need to figure out which checksum we have in the database
            not_found = None
            for type, chksum in list(package['checksums'].items()):
                package['checksum_type'] = type
                package['checksum'] = chksum
                package['checksum_id'] = checksums[(type, chksum)]
                try:
                    self.__lookupObjectCollection([package], 'rhnPackage')
                    not_found = None
                    break
                except InvalidPackageError:
                    e = sys.exc_info()[1]
                    not_found = (e, sys.exc_info()[2])
            if not_found and not ignore_missing:
                # package is not in database at all
                raise_with_tb(not_found[0], not_found[1])

    def lookupChannelFamilies(self, hash):
        if not hash:
            return
        sql = "select id from rhnChannelFamily where label = :label"
        h = self.dbmodule.prepare(sql)
        for k in list(hash.keys()):
            h.execute(label=k)
            row = h.fetchone_dict()
            if row:
                hash[k] = row['id']
            # Else, it's an unsupported channel

    def lookup_kstree_types(self, hash):
        return self._lookup_in_table('rhnKSTreeType', 'rhn_kstree_type_seq',
                                     hash)

    def lookup_ks_install_types(self, hash):
        return self._lookup_in_table('rhnKSInstallType',
                                     'rhn_ksinstalltype_id_seq', hash)

    def _lookup_in_table(self, table_name, sequence_name, hash):
        t = self.dbmodule.Table(table_name, 'label')
        seq = self.dbmodule.Sequence(sequence_name)
        to_insert = []
        to_update = []
        result = {}
        for label, name in list(hash.items()):
            row = t[label]
            if not row:
                row_id = seq.next()
                result[label] = row_id
                to_insert.append((label, name, row_id))
                continue
            row_id = row['id']
            result[label] = row_id
            if row['name'] != name:
                to_update.append((label, name))
                continue
            # Entry found in the table - nothing more to do

        if to_insert:
            # Have to insert rows
            row_ids = []
            labels = []
            names = []
            for label, name, row_id in to_insert:
                row_ids.append(row_id)
                labels.append(label)
                names.append(name)

            sql = """
                insert into %s (id, label, name) values (:id, :label, :name)
            """
            h = self.dbmodule.prepare(sql % table_name)
            h.executemany(id=row_ids, label=labels, name=names)

        if to_update:
            labels = []
            names = []
            for label, name in to_update:
                labels.append(label)
                names.append(name)

            sql = """
                update %s set name = :name where label = :label
            """
            h = self.dbmodule.prepare(sql % table_name)
            h.executemany(label=labels, name=names)

        # Update the returning value
        hash.clear()
        hash.update(result)
        return hash

    def processChannelArches(self, arches):
        self.__processObjectCollection(arches, 'rhnChannelArch',
                                       uploadForce=4, ignoreUploaded=1, severityLimit=4)

    def processPackageArches(self, arches):
        self.__processObjectCollection(arches, 'rhnPackageArch',
                                       uploadForce=4, ignoreUploaded=1, severityLimit=4)

    def processServerArches(self, arches):
        self.__processObjectCollection(arches, 'rhnServerArch',
                                       uploadForce=4, ignoreUploaded=1, severityLimit=4)

    def processCPUArches(self, arches):
        self.__processObjectCollection(arches, 'rhnCPUArch',
                                       uploadForce=4, ignoreUploaded=1, severityLimit=4)

    def processMasterOrgs(self, orgs):
        self.__processObjectCollection(orgs, 'rhnISSMasterOrgs',
                                       uploadForce=4, ignoreUploaded=1, severityLimit=4)

    def processOrgs(self, orgs):
        self.__processObjectCollection(orgs, 'web_customer',
                                       uploadForce=4, ignoreUploaded=1, severityLimit=4)

    def processServerPackageArchCompatMap(self, entries):
        self.__populateTable('rhnServerPackageArchCompat', entries,
                             delete_extra=1)

    def processServerChannelArchCompatMap(self, entries):
        self.__populateTable('rhnServerChannelArchCompat', entries,
                             delete_extra=1)

    def processChannelPackageArchCompatMap(self, entries):
        self.__populateTable('rhnChannelPackageArchCompat', entries,
                             delete_extra=1)

    def processServerGroupServerArchCompatMap(self, entries):
        self.__populateTable('rhnServerServerGroupArchCompat', entries,
                             delete_extra=1)

    def processPackages(self, packages, uploadForce=0, ignoreUploaded=0,
                        forceVerify=0, transactional=0):
        # Insert/update the packages
        self.validate_pks()

        childTables = {
            'rhnPackageProvides':   'package_id',
            'rhnPackageRequires':   'package_id',
            'rhnPackageConflicts':  'package_id',
            'rhnPackageObsoletes':  'package_id',
            'rhnPackageRecommends': 'package_id',
            'rhnPackageSuggests':   'package_id',
            'rhnPackageSupplements': 'package_id',
            'rhnPackageEnhances': 'package_id',
            'rhnPackageBreaks':     'package_id',
            'rhnPackagePredepends': 'package_id',
            'rhnPackageFile':       'package_id',
            'rhnPackageChangeLogRec':  'package_id',
            'susePackageProductFile':  'package_id',
            'susePackageEula':         'package_id',
            'rhnPackageExtraTag':     'package_id',
        }

        if CFG.has_key('package_import_skip_changelog') and CFG.package_import_skip_changelog:
            del childTables['rhnPackageChangeLogRec']

        for package in packages:
            if not isinstance(package, Package):
                raise TypeError("Expected a Package instance")

            tableList = copy.deepcopy(childTables)

            # older sat packages wont have these fields
            # avoid Null insertions
            if package['header_start'] is None:
                package['header_start'] = -1
                package['header_end'] = -1

            self.__processObjectCollection__([package, ], 'rhnPackage', tableList,
                                             uploadForce=uploadForce, forceVerify=forceVerify,
                                             ignoreUploaded=ignoreUploaded, severityLimit=1,
                                             transactional=transactional)

    def processErrata(self, errata):
        # Insert/update the packages

        childTables = [
            'rhnChannelErrata',
            'rhnErrataBugList',
            'rhnErrataFile',
            'rhnErrataKeyword',
            'rhnErrataPackage',
            'rhnErrataCVE',
        ]

        for erratum in errata:
            if not isinstance(erratum, Erratum):
                raise TypeError("Expected an Erratum instance")

        return self.__processObjectCollection(errata, 'rhnErrata', childTables,
                                              'errata_id', uploadForce=4, ignoreUploaded=1, forceVerify=1,
                                              transactional=1)

    def update_channels_affected_by_errata(self, dml):

        # identify errata that were affected
        affected_errata_ids = {}
        for op_type in ['insert', 'update', 'delete']:
            op_values = getattr(dml, op_type)
            for table_name, values_hash in list(op_values.items()):
                if table_name == 'rhnErrata':
                    field = 'id'
                elif 'errata_id' in values_hash:
                    field = 'errata_id'

                # Now we know in which field to look for changes
                for erratum_id in values_hash[field]:
                    affected_errata_ids[erratum_id] = None

        # Get affected channels
        affected_channel_ids = {}
        h = self.dbmodule.prepare("""
            select channel_id
              from rhnChannelErrata
             where errata_id = :errata_id
        """)
        for errata_id in list(affected_errata_ids.keys()):
            h.execute(errata_id=errata_id)

            channel_ids = h.fetchall_dict() or []
            channel_ids = [x['channel_id'] for x in channel_ids]
            for channel_id in channel_ids:
                affected_channel_ids[channel_id] = errata_id

        # Now update the channels
        update_channel = self.dbmodule.Procedure('rhn_channel.update_channel')
        invalidate_ss = 0

        for channel_id in list(affected_channel_ids.keys()):
            update_channel(channel_id, invalidate_ss)
            h = self.dbmodule.prepare("""
                select advisory from rhnErrata where id = :errata_id
            """)
            h.execute(errata_id=affected_channel_ids[channel_id])
            advisory = h.fetchone()[0]

            channel = rhnChannel.Channel()
            channel.load_by_id(channel_id)
            taskomatic.add_to_repodata_queue(channel.get_label(), "errata",
                                             advisory)

    def processKickstartTrees(self, ks_trees):
        childTables = [
            'rhnKSTreeFile',
            #'rhnKSTreeType',
            #'rhnKSInstallType',
        ]
        self.__processObjectCollection(ks_trees, 'rhnKickstartableTree',
                                       childTables, 'kstree_id', uploadForce=4, forceVerify=1,
                                       ignoreUploaded=1, severityLimit=1, transactional=1)

    def queue_errata(self, errata, timeout=0):
        # timeout is the numer of seconds we want the execution to be delayed
        if not errata:
            return
        # Figure out the errata ids
        errata_channel_ids = []
        for erratum in errata:
            if erratum.ignored:
                # Skip it
                continue
            if erratum.diff_result is not None:
                if erratum.diff_result.level != 0:
                    # New or modified in some way, queue it
                    # XXX we may not want to do this for trivial changes,
                    # but not sure what trivial is
                    for cid in erratum['channels']:
                        errata_channel_ids.append(
                            (erratum.id, cid['channel_id']))

        if not errata_channel_ids:
            # Nothing to do
            return

        hdel = self.dbmodule.prepare("""
            delete from rhnErrataQueue where errata_id = :errata_id
        """)

        h = self.dbmodule.prepare("""
            insert into rhnErrataQueue (errata_id, channel_id, next_action)
            values (:errata_id, :channel_id, current_timestamp + numtodsinterval(:timeout, 'second'))
        """)
        errata_ids = [x[0] for x in errata_channel_ids]
        channel_ids = [x[1] for x in errata_channel_ids]
        timeouts = [timeout] * len(errata_ids)
        hdel.executemany(errata_id=errata_ids)
        h.executemany(errata_id=errata_ids, channel_id=channel_ids, timeout=timeouts)

    def processChannels(self, channels, base_channels):
        childTables = [
            'rhnChannelFamilyMembers', 'rhnReleaseChannelMap',
        ]
        if base_channels:
            childTables.append('rhnDistChannelMap')
        self.__processObjectCollection(channels, 'rhnChannel', childTables,
                                       'channel_id', uploadForce=4, ignoreUploaded=1, forceVerify=1)

    def orgTrustExists(self, org_id, trust_id):
        sql = """
        select *
          from rhnTrustedOrgs
         where org_id = :org_id
           and org_trust_id = :trust_id
        """
        h = self.dbmodule.prepare(sql)
        h.execute(org_id=org_id, trust_id=trust_id)
        row = h.fetchone_dict()
        if row:
            return True
        return False

    def clearChannelTrusts(self, label):
        sql = """
        delete from rhnChannelTrust where channel_id =
        (select id from rhnChannel where label = :label)
        """
        h = self.dbmodule.prepare(sql)
        h.execute(label=label)

    def processChannelTrusts(self, channel_trusts):
        # Create channel trusts
        insert = [[], []]
        for trust in channel_trusts:
            insert[0].append(trust['channel-label'])
            insert[1].append(trust['org-id'])
        sql = """
            insert into rhnChannelTrust (channel_id, org_trust_id)
            values ((select id from rhnChannel where label = :label),
                    :org_id)
        """
        h = self.dbmodule.prepare(sql)
        h.executemany(label=insert[0], org_id=insert[1])

    def processChannelFamilies(self, channels):
        childTables = []
        self.__processObjectCollection(channels, 'rhnChannelFamily',
                                       childTables, 'channel_family_id', uploadForce=4, ignoreUploaded=1,
                                       forceVerify=1)

    def processChannelFamilyMembers(self, channel_families):
        # Channel families now contain channel memberships too
        h_lookup_cfid = self.dbmodule.prepare("""
            select channel_family_id
              from rhnChannelFamilyMembers
             where channel_id = :channel_id
        """)
        cf_ids = []
        c_ids = []
        for cf in channel_families:
            if 'private-channel-family' in cf['label']:
                # Its a private channel family and channel family members
                # will be different from server as this is most likely ISS
                # sync. Don't compare and delete custom channel families.
                continue
            for cid in cf['channel_ids']:
                # Look up channel families for this channel
                h_lookup_cfid.execute(channel_id=cid)
                row = h_lookup_cfid.fetchone_dict()
                if row and row['channel_family_id'] == cf.id:
                    # Nothing to do here, we already have this mapping
                    continue
                # need to delete this entry and add the one for the new
                # channel family
                cf_ids.append(cf.id)
                c_ids.append(cid)
        if not c_ids:
            # We're done
            return

        hdel = self.dbmodule.prepare("""
            delete from rhnChannelFamilyMembers
             where channel_id = :channel_id
        """)
        hins = self.dbmodule.prepare("""
            insert into rhnChannelFamilyMembers (channel_id, channel_family_id)
            values (:channel_id, :channel_family_id)
        """)
        hdel.executemany(channel_id=c_ids)
        hins.executemany(channel_family_id=cf_ids, channel_id=c_ids)

    def processChannelFamilyPermissions(self, channel_families):
        # Since this is not evaluated in rhn_entitlements anymore,
        # make channel families without org globally visible

        cf_ids = [cf.id for cf in channel_families if 'private-channel-family' not in cf['label']]

        h_public_sel = self.dbmodule.prepare("""
            select channel_family_id from rhnPublicChannelFamily
        """)
        h_public_sel.execute()
        
        public_cf_in_db = [x['channel_family_id'] for x in h_public_sel.fetchall_dict() or []]
        public_cf_to_insert = [x for x in cf_ids if x not in public_cf_in_db]

        h_public_ins = self.dbmodule.prepare("""
            insert into rhnPublicChannelFamily (channel_family_id)
            values (:channel_family_id)
        """)
        h_public_ins.executemany(channel_family_id=public_cf_to_insert)

    def processDistChannelMap(self, dcms):
        dcmTable = self.tables['rhnDistChannelMap']
        lookup = TableLookup(dcmTable, self.dbmodule)
        dmlobj = DML([dcmTable.name], self.tables)

        for dcm in dcms:
            if dcm.ignored:
                # Skip it
                continue
            h = lookup.query(dcm)
            row = h.fetchone_dict()
            if not row:
                extObject = {}
                _buildExternalValue(extObject, dcm, dcmTable)
                addHash(dmlobj.insert[dcmTable.name], extObject)
            # Since this table has all the columns in unique constraints, we
            # don't care much about updates

        self.__doDML(dmlobj)

    def processChannelProduct(self, channel):
        """ Associate product with channel """

        channel['channel_product'] = channel['product_name']
        channel['channel_product_version'] = channel['product_version']
        channel['channel_product_beta'] = channel['product_beta']
        channel['channel_product_id'] = self.lookupChannelProduct(channel)

        if not channel['channel_product_id']:
            # If no channel product dont update
            return
        statement = self.dbmodule.prepare("""
            UPDATE rhnChannel
               SET channel_product_id = :channel_product_id
             WHERE id = :id
               AND (channel_product_id is NULL
                OR channel_product_id <> :channel_product_id)
        """)

        statement.execute(id=channel.id,
                          channel_product_id=channel['channel_product_id'])

    def processChannelContentSources(self, channel):
        """ Associate content sources with channel """

        # Which content sources are assigned to this channel
        select_sql = self.dbmodule.prepare("""
            select source_id from rhnChannelContentSource
            where channel_id = :channel_id
        """)

        select_sql.execute(channel_id=channel.id)
        sources_in_db = [x['source_id'] for x in select_sql.fetchall_dict() or []]

        # Which content sources should be assigned to this channel
        sources_needed = []
        if 'content-sources' in channel and channel['content-sources']:
            for source in channel['content-sources']:
                sources_needed.append(self.lookupContentSource(source['label']))

        # What to delete and insert
        sources_to_delete = [x for x in sources_in_db if x not in sources_needed]
        sources_to_insert = [x for x in sources_needed if x not in sources_in_db]

        delete_sql = self.dbmodule.prepare("""
            delete from rhnChannelContentSource
            where source_id = :source_id
            and channel_id = :channel_id
        """)

        insert_sql = self.dbmodule.prepare("""
           insert into rhnChannelContentSource
           (source_id, channel_id)
           values (:source_id, :channel_id)
        """)

        for source_id in sources_to_delete:
            delete_sql.execute(source_id=source_id, channel_id=channel.id)

        for source_id in sources_to_insert:
            insert_sql.execute(source_id=source_id, channel_id=channel.id)

    def processProductNames(self, batch):
        """ Check if ProductName for channel in batch is already in DB.
            If not add it there.
        """
        statement = self.dbmodule.prepare("""
            insert into rhnProductName
                 (id, label, name)
              values (sequence_nextval('rhn_productname_id_seq'),
                      :product_label, :product_name)
        """)

        for channel in batch:
            if not self.lookupProductNames(channel['label']):
                statement.execute(product_label=channel['label'],
                                  product_name=channel['name'])

    def processContentSources(self, batch):
        """ Insert content source into DB """

        childTables = ['rhnContentSourceSsl']
        self.__processObjectCollection(batch, 'rhnContentSource',
                                       childTables, 'content_source_id', uploadForce=4, ignoreUploaded=1,
                                       forceVerify=1)

    def lookupContentSource(self, label):
        """ Get id for given content source """

        sql = self.dbmodule.prepare("""
            select id from rhnContentSource where label = :label and org_id is null
        """)

        sql.execute(label=label)

        content_source = sql.fetchone_dict()

        if content_source:
            return content_source['id']

        return

    def lookupContentSourceType(self, label):
        """ Get id for given content type label """

        sql = self.dbmodule.prepare("""
            select id from rhnContentSourceType where label = :label
        """)

        sql.execute(label=label)

        source_type = sql.fetchone_dict()

        if source_type:
            return source_type['id']

        return

    def lookupProductNames(self, label):
        """ For given label of product return its id.
                 If product do not exist return None
        """
        statement = self.dbmodule.prepare("""
            SELECT id
              FROM rhnProductName
             WHERE label = :label
        """)

        statement.execute(label=label)

        product = statement.fetchone_dict()

        if product:
            return product['id']

        return

    def processSupportInformation(self, batch):
        """Check if SupportInformation is already in DB.
           If not, add it
        """
        insert_support_info = self.dbmodule.prepare("""
            INSERT INTO suseMdData (channel_id, package_id, keyword_id)
            VALUES (:channel_id, :package_id, :keyword_id)
        """)
        delete_support_info = self.dbmodule.prepare("""
            DELETE FROM suseMdData
            WHERE channel_id = :channel_id
              AND package_id = :package_id
              AND keyword_id = :keyword_id
        """)
        _query_keywords = self.dbmodule.prepare("""
            SELECT channel_id, package_id, keyword_id
              FROM suseMdData
        """)
        _query_keywords.execute()
        existing_data = ["%s-%s-%s" % (x['channel_id'], x['package_id'], x['keyword_id']) for x in _query_keywords.fetchall_dict() or []]
        toinsert = [[], [], []]
        todelete = [[], [], []]
        for item in batch:
            ident = "%s-%s-%s" % (item['channel_id'], item['package_id'], item['keyword_id'])
            if ident in existing_data:
                existing_data.remove(ident)
                continue
            toinsert[0].append(int(item['channel_id']))
            toinsert[1].append(int(item['package_id']))
            toinsert[2].append(int(item['keyword_id']))
        for ident in existing_data:
            cid, pid, kid = ident.split('-')
            todelete[0].append(int(cid))
            todelete[1].append(int(pid))
            todelete[2].append(int(kid))
        if todelete[0]:
            delete_support_info.executemany(channel_id=todelete[0], package_id=todelete[1], keyword_id=todelete[2])
        if toinsert[0]:
            insert_support_info.executemany(channel_id=toinsert[0], package_id=toinsert[1], keyword_id=toinsert[2])

    def processSuseProducts(self, batch):
        """Check if SUSE Product is already in DB.
           If yes, update it, if not add it.
        """
        insert_product = self.dbmodule.prepare("""
            INSERT INTO suseProducts (id, name, version, friendly_name, arch_type_id, release, product_id, free, base, release_stage, channel_family_id)
            VALUES (:pid, :name, :version, :friendly_name, :arch_type_id, :release, :product_id, :free, :base, :release_stage, :channel_family_id)
            """)
        delete_product = self.dbmodule.prepare("""
            DELETE FROM suseProducts WHERE product_id = :product_id
            """)
        update_product = self.dbmodule.prepare("""
            UPDATE suseProducts
               SET name = :name,
                   version = :version,
                   friendly_name = :friendly_name,
                   arch_type_id = :arch_type_id,
                   release = :release,
                   free = :free,
                   base = :base,
                   release_stage = :release_stage,
                   channel_family_id = :channel_family_id
             WHERE product_id = :product_id
             """)
        _query_product = self.dbmodule.prepare("""
            SELECT product_id FROM suseProducts
            """)
        _query_product.execute()
        existing_data = ["%s" % (x['product_id']) for x in _query_product.fetchall_dict() or []]
        toinsert = [[], [], [], [], [], [], [], [], [], [], []]
        todelete = [[]]
        toupdate = [[], [], [], [], [], [], [], [], [], []]
        for item in batch:
            if not item['channel_family_id']:
                continue
            ident = "%s" % (item['product_id'])
            if ident in existing_data:
                existing_data.remove(ident)
                toupdate[0].append(item['name'])
                toupdate[1].append(item['version'])
                toupdate[2].append(item['friendly_name'])
                toupdate[3].append(item['arch_type_id'])
                toupdate[4].append(item['release'])
                toupdate[5].append(item['free'])
                toupdate[6].append(item['base'])
                toupdate[7].append(item['release_stage'])
                toupdate[8].append(int(item['channel_family_id']))
                toupdate[9].append(int(item['product_id']))
                continue
            toinsert[0].append(self.sequences['suseProducts'].next())
            toinsert[1].append(item['name'])
            toinsert[2].append(item['version'])
            toinsert[3].append(item['friendly_name'])
            toinsert[4].append(item['arch_type_id'])
            toinsert[5].append(item['release'])
            toinsert[6].append(item['free'])
            toinsert[7].append(item['base'])
            toinsert[8].append(item['release_stage'])
            toinsert[9].append(int(item['channel_family_id']))
            toinsert[10].append(int(item['product_id']))
        for ident in existing_data:
            todelete[0].append(int(ident))
        if todelete[0]:
            delete_product.executemany(product_id=todelete[0])
        if toinsert[0]:
            insert_product.executemany(pid=toinsert[0], name=toinsert[1], version=toinsert[2],
                                       friendly_name=toinsert[3], arch_type_id=toinsert[4],
                                       release=toinsert[5], free=toinsert[6], base=toinsert[7],
                                       release_stage=toinsert[8], channel_family_id=toinsert[9],
                                       product_id=toinsert[10])
        if toupdate[0]:
            update_product.executemany(name=toupdate[0], version=toupdate[1],
                                       friendly_name=toupdate[2], arch_type_id=toupdate[3],
                                       release=toupdate[4], free=toupdate[5], base=toupdate[6],
                                       release_stage=toupdate[7], channel_family_id=toupdate[8],
                                       product_id=toupdate[9])

    def processSuseProductChannels(self, batch):
        """Check if the SUSE ProductChannel is already in DB.
           If yes, update it, if not add it. We get only "mandatory" product channels
           This is jut to update this flag.
        """
        insert_pc = self.dbmodule.prepare("""
            INSERT INTO suseProductChannel
                   (id, product_id, channel_id, mandatory)
            VALUES (sequence_nextval('suse_product_channel_id_seq'), :pid, :cid, 'Y')
            """)
        update_pc = self.dbmodule.prepare("""
            UPDATE suseProductChannel
               SET mandatory = :mand
             WHERE product_id = :pid
               AND channel_id = :cid
             """)
        _query_pc = self.dbmodule.prepare("""
            SELECT product_id, channel_id FROM suseProductChannel
            """)
        _query_pc.execute()
        existing_data = ["%s-%s" % (x['product_id'], x['channel_id']) for x in _query_pc.fetchall_dict() or []]
        toinsert = [[], []]
        toupdate = [[], [], []]
        for item in batch:
            ident = "%s-%s" % (item['product_id'], item['channel_id'])
            if ident in existing_data:
                existing_data.remove(ident)
                toupdate[0].append('Y')
                toupdate[1].append(item['product_id'])
                toupdate[2].append(item['channel_id'])
                continue
            toinsert[0].append(item['product_id'])
            toinsert[1].append(item['channel_id'])
        for ident in existing_data:
            pid, cid = ident.split('-', 1)
            toupdate[0].append('N')
            toupdate[1].append(int(pid))
            toupdate[2].append(int(cid))
        if toinsert[0]:
            insert_pc.executemany(pid=toinsert[0], cid=toinsert[1])
        if toupdate[0]:
            update_pc.executemany(mand=toupdate[0], pid=toupdate[1], cid=toupdate[2])

    def processSuseUpgradePaths(self, batch):
        """Check if the SUSE Upgrade Paths are already in DB.
           If not add it.
        """
        insert_up = self.dbmodule.prepare("""
            INSERT INTO suseUpgradePath
                   (from_pdid, to_pdid)
            VALUES (:from_pdid, :to_pdid)
            """)
        delete_up = self.dbmodule.prepare("""
            DELETE FROM suseUpgradePath
             WHERE from_pdid = :from_pdid
               AND to_pdid = :to_pdid
            """)
        _query_up = self.dbmodule.prepare("""
            SELECT from_pdid, to_pdid FROM suseUpgradePath
            """)
        _query_up.execute()
        existing_data = ["%s-%s" % (x['from_pdid'], x['to_pdid']) for x in _query_up.fetchall_dict() or []]
        toinsert = [[], []]
        todelete = [[], []]
        for item in batch:
            ident = "%s-%s" % (item['from_pdid'], item['to_pdid'])
            if ident in existing_data:
                existing_data.remove(ident)
                continue
            toinsert[0].append(item['from_pdid'])
            toinsert[1].append(item['to_pdid'])
        for ident in existing_data:
            fpdid, tpdid = ident.split('-', 1)
            todelete[0].append(int(fpdid))
            todelete[1].append(int(tpdid))
        if todelete[0]:
            delete_up.executemany(from_pdid=todelete[0], to_pdid=todelete[1])
        if toinsert[0]:
            insert_up.executemany(from_pdid=toinsert[0], to_pdid=toinsert[1])

    def processSuseProductExtensions(self, batch):
        """Check if the SUSE Extensions are already in DB.
           If not add it.
        """
        insert_pe = self.dbmodule.prepare("""
            INSERT INTO suseProductExtension
                   (base_pdid, root_pdid, ext_pdid, recommended)
            VALUES (:product_id, :root_id, :ext_id, :recommended)
            """)
        delete_pe = self.dbmodule.prepare("""
            DELETE FROM suseProductExtension
             WHERE base_pdid = :product_id
               AND root_pdid = :root_id
               AND ext_pdid = :ext_id
            """)
        update_pe = self.dbmodule.prepare("""
            UPDATE suseProductExtension
               SET recommended = :recommended
             WHERE base_pdid = :product_id
               AND root_pdid = :root_id
               AND ext_pdid = :ext_id
        """)
        _query_pe = self.dbmodule.prepare("""
            SELECT base_pdid, root_pdid, ext_pdid FROM suseProductExtension
            """)
        _query_pe.execute()
        existing_data = ["%s-%s-%s" % (x['base_pdid'], x['root_pdid'], x['ext_pdid']) for x in _query_pe.fetchall_dict() or []]
        toinsert = [[], [], [], []]
        todelete = [[], [], []]
        toupdate = [[], [], [], []]
        for item in batch:
            ident = "%s-%s-%s" % (item['product_pdid'], item['root_pdid'], item['ext_pdid'])
            if ident in existing_data:
                existing_data.remove(ident)
                toupdate[0].append(item['recommended'])
                toupdate[1].append(item['product_pdid'])
                toupdate[2].append(item['root_pdid'])
                toupdate[3].append(item['ext_pdid'])
                continue
            toinsert[0].append(item['product_pdid'])
            toinsert[1].append(item['root_pdid'])
            toinsert[2].append(item['ext_pdid'])
            toinsert[3].append(item['recommended'])
        for ident in existing_data:
            product_id, root_id, ext_id = ident.split('-', 2)
            todelete[0].append(int(product_id))
            todelete[1].append(int(root_id))
            todelete[2].append(int(ext_id))
        if todelete[0]:
            delete_pe.executemany(product_id=todelete[0], root_id=todelete[1], ext_id=todelete[2])
        if toinsert[0]:
            insert_pe.executemany(product_id=toinsert[0], root_id=toinsert[1], ext_id=toinsert[2], recommended=toinsert[3])
        if toupdate[0]:
            update_pe.executemany(product_id=toupdate[1], root_id=toupdate[2], ext_id=toupdate[3], recommended=toupdate[0])

    def processSuseProductRepositories(self, batch):
        """Check if the SUSE Product Repositories are already in DB.
           If not add it.
        """
        insert_pr = self.dbmodule.prepare("""
            INSERT INTO suseProductSCCRepository
                   (id, product_id, root_product_id, repo_id, channel_label, parent_channel_label,
                    channel_name, mandatory, update_tag)
            VALUES (:id, :product_id, :root_id, :repo_id, :channel_label, :parent_channel_label,
                    :channel_name, :mandatory, :update_tag)
            """)
        delete_pr = self.dbmodule.prepare("""
            DELETE FROM suseProductSCCRepository
             WHERE product_id = :product_id
               AND root_product_id = :root_id
               AND repo_id = :repo_id
            """)
        update_pr = self.dbmodule.prepare("""
            UPDATE suseProductSCCRepository
               SET channel_label = :channel_label,
                   parent_channel_label = :parent_channel_label,
                   channel_name = :channel_name,
                   mandatory = :mandatory,
                   update_tag = :update_tag
             WHERE product_id = :product_id
               AND root_product_id = :root_id
               AND repo_id = :repo_id
        """)
        _query_pr = self.dbmodule.prepare("""
            SELECT product_id, root_product_id, repo_id FROM suseProductSCCRepository
            """)
        _query_pr.execute()
        existing_data = ["%s-%s-%s" % (x['product_id'], x['root_product_id'], x['repo_id']) for x in _query_pr.fetchall_dict() or []]
        toinsert = [[], [], [], [], [], [], [], [], []]
        todelete = [[], [], []]
        toupdate = [[], [], [], [], [], [], [], []]
        for item in batch:
            ident = "%s-%s-%s" % (item['product_pdid'], item['root_pdid'], item['repo_pdid'])
            if ident in existing_data:
                existing_data.remove(ident)
                toupdate[0].append(item['channel_label'])
                toupdate[1].append(item['parent_channel_label'])
                toupdate[2].append(item['channel_name'])
                toupdate[3].append(item['mandatory'])
                toupdate[4].append(item['update_tag'])
                toupdate[5].append(int(item['product_pdid']))
                toupdate[6].append(int(item['root_pdid']))
                toupdate[7].append(int(item['repo_pdid']))
                continue
            toinsert[0].append(self.sequences['suseProductSCCRepository'].next())
            toinsert[1].append(int(item['product_pdid']))
            toinsert[2].append(int(item['root_pdid']))
            toinsert[3].append(int(item['repo_pdid']))
            toinsert[4].append(item['channel_label'])
            toinsert[5].append(item['parent_channel_label'])
            toinsert[6].append(item['channel_name'])
            toinsert[7].append(item['mandatory'])
            toinsert[8].append(item['update_tag'])
        for ident in existing_data:
            product_id, rootid, repo_id = ident.split('-', 2)
            todelete[0].append(int(product_id))
            todelete[1].append(int(rootid))
            todelete[2].append(int(repo_id))
        if todelete[0]:
            delete_pr.executemany(product_id=todelete[0], root_id=todelete[1], repo_id=todelete[2])
        if toinsert[0]:
            insert_pr.executemany(id=toinsert[0], product_id=toinsert[1], root_id=toinsert[2], repo_id=toinsert[3],
                                  channel_label=toinsert[4], parent_channel_label=toinsert[5],
                                  channel_name=toinsert[6], mandatory=toinsert[7], update_tag=toinsert[8])
        if toupdate[0]:
            update_pr.executemany(product_id=toupdate[5], root_id=toupdate[6], repo_id=toupdate[7],
                                  channel_label=toupdate[0], parent_channel_label=toupdate[1],
                                  channel_name=toupdate[2], mandatory=toupdate[3], update_tag=toupdate[4])

    def processSCCRepositories(self, batch):
        """Check if SCC Repository is already in DB.
           If yes, update it, if not add it.
        """
        # suseSCCRepositoryAuth should be empty in ISS case
        self.dbmodule.prepare("""
            DELETE FROM suseSCCRepositoryAuth
        """).execute()
        insert_repo = self.dbmodule.prepare("""
            INSERT INTO suseSCCRepository (id, scc_id, autorefresh, name, distro_target, description, url, signed, installer_updates)
            VALUES (:rid, :sccid, :autorefresh, :name, :target, :description, :url, :signed, :installer_updates)
            """)
        delete_repo = self.dbmodule.prepare("""
            DELETE FROM suseSCCRepository WHERE scc_id = :sccid
            """)
        update_repo = self.dbmodule.prepare("""
            UPDATE suseSCCRepository
               SET name = :name,
                   autorefresh = :autorefresh,
                   distro_target = :target,
                   description = :description,
                   url = :url,
                   signed = :signed,
                   installer_updates = :installer_updates
             WHERE scc_id = :sccid
             """)
        _query_repo = self.dbmodule.prepare("""
            SELECT scc_id FROM suseSCCRepository
            """)
        _query_repo.execute()
        existing_data = ["%s" % (x['scc_id']) for x in _query_repo.fetchall_dict() or []]
        toinsert = [[], [], [], [], [], [], [], [], []]
        todelete = [[]]
        toupdate = [[], [], [], [], [], [], [], []]
        for item in batch:
            ident = "%s" % item['sccid']
            if ident in existing_data:
                existing_data.remove(ident)
                toupdate[0].append(item['name'])
                toupdate[1].append(item['autorefresh'])
                toupdate[2].append(item['distro_target'])
                toupdate[3].append(item['description'])
                toupdate[4].append(item['url'])
                toupdate[5].append(item['signed'])
                toupdate[6].append(item['installer_updates'])
                toupdate[7].append(item['sccid'])
                continue
            toinsert[0].append(self.sequences['suseSCCRepository'].next())
            toinsert[1].append(item['sccid'])
            toinsert[2].append(item['autorefresh'])
            toinsert[3].append(item['name'])
            toinsert[4].append(item['distro_target'])
            toinsert[5].append(item['description'])
            toinsert[6].append(item['url'])
            toinsert[7].append(item['signed'])
            toinsert[8].append(item['installer_updates'])
        for ident in existing_data:
            todelete[0].append(int(ident))
        if todelete[0]:
            delete_repo.executemany(sccid=todelete[0])
        if toinsert[0]:
            insert_repo.executemany(rid=toinsert[0], sccid=toinsert[1], autorefresh=toinsert[2],
                                    name=toinsert[3], target=toinsert[4], description=toinsert[5],
                                    url=toinsert[6], signed=toinsert[7], installer_updates=toinsert[8])
        if toupdate[0]:
            update_repo.executemany(name=toupdate[0], autorefresh=toupdate[1], target=toupdate[2],
                                    description=toupdate[3], url=toupdate[4], signed=toupdate[5],
                                    installer_updates=toupdate[6], sccid=toupdate[7])

    def processClonedChannels(self, batch):
        """Check if cloned channel info is already in DB.
           If not add it.
        """
        insert_cc = self.dbmodule.prepare("""
            INSERT INTO rhnChannelCloned
                   (original_id, id)
            VALUES (:orig_id, :id)
            """)
        delete_cc = self.dbmodule.prepare("""
            DELETE FROM rhnChannelCloned
             WHERE original_id = :orig_id
               AND id = :id
            """)
        _query_cc = self.dbmodule.prepare("""
            SELECT original_id orig_id, id FROM rhnChannelCloned
            """)
        _query_cc.execute()
        existing_data = ["%s-%s" % (x['orig_id'], x['id']) for x in _query_cc.fetchall_dict() or []]
        toinsert = [[], []]
        todelete = [[], []]
        for item in batch:
            ident = "%s-%s" % (item['orig_id'], item['id'])
            if ident in existing_data:
                existing_data.remove(ident)
                continue
            toinsert[0].append(item['orig_id'])
            toinsert[1].append(item['id'])
        for ident in existing_data:
            fpdid, tpdid = ident.split('-', 1)
            todelete[0].append(int(fpdid))
            todelete[1].append(int(tpdid))
        if todelete[0]:
            delete_cc.executemany(orig_id=todelete[0], id=todelete[1])
        if toinsert[0]:
            insert_cc.executemany(orig_id=toinsert[0], id=toinsert[1])

    def processSuseSubscriptions(self, batch):
        """Check if the Subscriptions are already in DB.
           If yes, update it, if not add it.
        """
        insert_pcf = self.dbmodule.prepare("""
            INSERT INTO rhnPrivateChannelFamily
                   (channel_family_id, org_id)
            VALUES (:cfid, :org_id)
            """)
        _query_pcf = self.dbmodule.prepare("""
            SELECT channel_family_id, org_id FROM rhnPrivateChannelFamily
            """)
        _query_pcf.execute()
        existing_data = ["%s-%s" % (x['channel_family_id'], x['org_id']) for x in _query_pcf.fetchall_dict() or []]
        toinsert = [[], []]
        for item in batch:
            ident = "%s-%s" % (item['channel_family_id'], item['org_id'])
            if ident in existing_data:
                existing_data.remove(ident)
                continue
            toinsert[0].append(item['channel_family_id'])
            toinsert[1].append(item['org_id'])
        if toinsert[0]:
            insert_pcf.executemany(cfid=toinsert[0],
                                   org_id=toinsert[1])


    def lookupPackageIdFromPackage(self, package):
        if not isinstance(package, IncompletePackage):
            raise TypeError("Expected an IncompletePackage instance, found %s" % \
                            str(type(package)))
        statement = self.dbmodule.prepare("""
            SELECT p.id
              FROM rhnPackage p
              JOIN rhnPackageName pn ON p.name_id = pn.id
              JOIN rhnPackageEVR pe ON p.evr_id = pe.id
              JOIN rhnPackageArch pa ON p.package_arch_id = pa.id
              JOIN rhnChecksumView cv ON p.checksum_id = cv.id
             WHERE pn.name = :name
               AND ( pe.epoch  = :epoch or
                     ( pe.epoch is null and :epoch is null )
                   )
               AND pe.version = :version
               AND pe.release = :release
               AND pa.label = :arch
               AND cv.checksum = :checksum
               AND cv.checksum_type = :checksum_type
        """)

        for type, chksum  in list(package['checksums'].items()):
            if not package['epoch']:
                package['epoch'] = None
            statement.execute(name=package['name'],
                              epoch=package['epoch'],
                              version=package['version'],
                              release=package['release'],
                              arch=package['arch'],
                              checksum=chksum,
                              checksum_type=type)
            pkgid = statement.fetchone_dict() or None
            if pkgid:
                package.id = pkgid['id']
                return

    def lookupSuseProductIdByProductId(self, pid):
        _query = self.dbmodule.prepare("""
            SELECT id FROM suseProducts WHERE product_id = :pid
        """)
        _query.execute(pid=pid)
        res = _query.fetchone_dict()
        if res:
            return res['id']
        return None

    def lookupRepoIdBySCCRepoId(self, rid):
        _query = self.dbmodule.prepare("""
            SELECT id FROM suseSCCRepository WHERE scc_id = :rid
        """)
        _query.execute(rid=rid)
        res = _query.fetchone_dict()
        if res:
            return res['id']
        return None

    def lookupKeyword(self, keyword):
        statement = self.dbmodule.prepare("""
            SELECT id
              FROM suseMdKeyword
             WHERE label = :label
        """)
        statement.execute(label=keyword)
        kid = statement.fetchone_dict()

        if kid:
            return kid['id']
        kid = self.sequences['suseMdKeyword'].next()
        statement = self.dbmodule.prepare("""
            INSERT INTO suseMdKeyword (id, label)
            VALUES (:kid, :label)
        """)
        statement.execute(kid=kid,label=keyword)
        return kid


    # bug #528227
    def lookupChannelOrg(self, label):
        """For given label of channel return its org_id.
           If channel with given label does not exist or is NULL, return None.
        """
        statement = self.dbmodule.prepare("""
            SELECT org_id
              FROM rhnChannel
             WHERE label = :label
        """)

        statement.execute(label=label)
        org_id = statement.fetchone_dict()

        if org_id:
            return org_id

        return

    def lookupChannelProduct(self, channel):
        statement = self.dbmodule.prepare("""
            SELECT id
              FROM rhnChannelProduct
             WHERE product = :product
               AND version = :version
               AND beta = :beta
        """)

        statement.execute(product=channel['channel_product'],
                          version=channel['channel_product_version'],
                          beta=channel['channel_product_beta'])

        product = statement.fetchone_dict()

        if product:
            return product['id']

        return self.createChannelProduct(channel)

    def createChannelProduct(self, channel):
        id = self.sequences['rhnChannelProduct'].next()

        statement = self.dbmodule.prepare("""
            INSERT
              INTO rhnChannelProduct
                   (id, product, version, beta)
            VALUES (:id, :product, :version, :beta)
        """)

        statement.execute(id=id,
                          product=channel['channel_product'],
                          version=channel['channel_product_version'],
                          beta=channel['channel_product_beta'])

        return id

    def subscribeToChannels(self, packages, strict=0):
        hash = {
            'package_id': [],
            'channel_id': [],
        }
        # Keep a list of packages for a channel too, so we can easily compare
        # what's extra, if strict is 1
        channel_packages = {}
        sql = """
            select channel_id
            from rhnChannelPackage
            where package_id = :package_id"""
        affected_channels = {}
        statement = self.dbmodule.prepare(sql)
        for package in packages:
            if package.ignored:
                # Skip it
                continue
            if package.id is None:
                raise InvalidPackageError(package, "Invalid package")
            # Look it up first
            statement.execute(package_id=package.id)
            channels = {}
            while 1:
                row = statement.fetchone_dict()
                if not row:
                    break
                channels[row['channel_id']] = None

            for channelId in list(package['channels'].keys()):
                # Build the channel-package list
                if channelId in channel_packages:
                    cp = channel_packages[channelId]
                else:
                    channel_packages[channelId] = cp = {}
                cp[package.id] = None

                if channelId in channels:
                    # Already subscribed
                    continue
                dict = {
                    'package_id': package.id,
                    'channel_id': channelId,
                }
                if channelId not in affected_channels:
                    modified_packages = ([], [])
                    affected_channels[channelId] = modified_packages
                else:
                    modified_packages = affected_channels[channelId]
                # Package was added to this channel
                modified_packages[0].append(package.id)
                addHash(hash, dict)

        # Packages we'd have to delete
        extra_cp = {
            'package_id': [],
            'channel_id': [],
        }
        if strict:
            # if strict remove the extra packages from the DB
            sql = """
                select package_id
                  from rhnChannelPackage
                 where channel_id = :channel_id
            """
        else:
            # or at least we should delete packages from different org
            sql = """
                select package_id
                  from rhnChannelPackage cp
                  join rhnPackage p
                    on p.id = cp.package_id
                  join rhnChannel c
                    on c.id = cp.channel_id
                 where cp.channel_id = :channel_id
                   and c.org_id != p.org_id
            """

        statement = self.dbmodule.prepare(sql)
        for channel_id, pid_hash in list(channel_packages.items()):
            statement.execute(channel_id=channel_id)
            while 1:
                row = statement.fetchone_dict()
                if not row:
                    break
                package_id = row['package_id']
                if package_id not in pid_hash:
                    # Have to remove it
                    extra_cp['package_id'].append(package_id)
                    extra_cp['channel_id'].append(channel_id)
                    # And mark this channel as being affected
                    if channel_id not in affected_channels:
                        modified_packages = ([], [])
                        affected_channels[channel_id] = modified_packages
                    else:
                        modified_packages = affected_channels[channel_id]
                    # Package was deletef from this channel
                    modified_packages[1].append(package_id)

        self.__doDeleteTable('rhnChannelPackage', extra_cp)
        self.__doInsertTable('rhnChannelPackage', hash)
        # This function returns the channels that were affected
        return affected_channels

    def update_newest_package_cache(self, caller, affected_channels, name_ids=[]):
        # affected_channels is a hash keyed on the channel id, and with a
        # tuple (added_package_list, deleted_package_list) as values
        refresh_newest_package = self.dbmodule.Procedure('rhn_channel.refresh_newest_package')
        update_channel = self.dbmodule.Procedure('rhn_channel.update_channel')
        for channel_id, (added_packages_list, deleted_packages_list) in list(affected_channels.items()):
            try:
                if name_ids:
                    for id in name_ids:
                        refresh_newest_package(channel_id, caller, id)
                else:
                    refresh_newest_package(channel_id, caller, None)
            except rhnSQL.SQLError:
                e = sys.exc_info()[1]
                raise_with_tb(rhnFault(23, str(e[1]), explain=0), sys.exc_info()[2])
            if deleted_packages_list:
                invalidate_ss = 1
            else:
                invalidate_ss = 0
            update_channel(channel_id, invalidate_ss)

    def processSourcePackages(self, packages, uploadForce=0, ignoreUploaded=0,
                              forceVerify=0, transactional=0):
        # Insert/update the packages

        childTables = []

        for package in packages:
            if not isinstance(package, SourcePackage):
                raise TypeError("Expected a Package instance")

        # Process the packages

        self.__processObjectCollection(packages, 'rhnPackageSource', childTables,
                                       'package_id', uploadForce=uploadForce, forceVerify=forceVerify,
                                       ignoreUploaded=ignoreUploaded, severityLimit=1,
                                       transactional=transactional)

    def commit(self):
        self.dbmodule.commit()

    def rollback(self):
        self.dbmodule.rollback()

    def __processHash(self, lookup, hash):
        if not hash:
            # Nothing to do
            return

        h = rhnSQL.prepare("select " + lookup + "(:name) from dual")
        for k in list(hash.keys()):
            h.execute(name=k)
            # saving id
            hash[k] = h.fetchone_dict().popitem()[1]

    def __buildQueries(self, childTables):
        childTableLookups = {}
        queryTempl = "select * from %s where %s = :id"
        for childTableName in childTables:
            childTableLookups[childTableName] = self.dbmodule.prepare(
                queryTempl % (childTableName, childTables[childTableName]))
        return childTableLookups

    def __processObjectCollection(self, objColl, parentTable, childTables=[],
                                  colname=None, **kwargs):
        # Returns the DML object that was processed
        # This helps identify what the changes were

        # XXX this is a total hack keeping tranlating the old interface into the
        # new interface to keep me from having to change all the places in the
        # code that call this method, as there are 10 of them...

        childDict = {}

        for tbl in childTables:
            childDict[tbl] = colname

        return self.__processObjectCollection__(objColl, parentTable, childDict, **kwargs)

    def __processObjectCollection__(self, objColl, parentTable, childTables={},
                                    **kwargs):
        # Returns the DML object that was processed
        # This helps identify what the changes were

        # FIXME I need to break this method apart into smaller method calls that
        # will allow *different* colname fields for different childTables
        # NOTE objColl == packages
        # Process the object collection, starting with parentTable, having
        # colname as a link column between the parent and child tables
        #
        # We create a DML object for the operations we're supposed to perform
        # on the database
        kwparams = {
            # The 'upload force'
            'uploadForce': 0,
            # Raises exceptions when the object is already uploaded
            'ignoreUploaded': 0,
            # Forces a full object verification - including the child tables
            'forceVerify': 0,
            # When the severity is below this limit, the object is not
            # updated
            'severityLimit': 0,
            # All-or-nothing
            'transactional': 0,
        }

        for k, v in list(kwargs.items()):
            if k not in kwparams:
                raise TypeError("Unknown keyword parameter %s" % k)
            if v is not None:
                # Leave the default values in case of a None
                kwparams[k] = v

        uploadForce = kwparams['uploadForce']
        ignoreUploaded = kwparams['ignoreUploaded']
        severityLimit = kwparams['severityLimit']
        transactional = kwparams['transactional']
        forceVerify = kwparams['forceVerify']

        # All the tables affected
        tables = [parentTable] + list(childTables.keys())

        # Build the hash for the operations on the tables
        dml = DML(tables, self.tables)
        # Reverse hash: object id to object for already-uploaded objects
        uploadedObjects = {}
        # Information related to the parent table
        parentTableObj = self.tables[parentTable]
        ptFields = parentTableObj.getFields()
        severityHash = parentTableObj.getSeverityHash()

        # A flag that indicates if something has to be modified beyond the
        # current severity limit
        brokenTransaction = 0

        # Lookup object
        lookup = TableLookup(parentTableObj, self.dbmodule)
        # XXX
        childTableLookups = self.__buildQueries(childTables)
        # For each valid object in the collection, look it up
        #   if it doesn't exist, insert all the associated information
        #   if it already exists:
        #       save it in the uploadedObjects hash for later processing
        #       the object's diff member will contain data if that object
        #         failed to push; the content should be explicit enough about
        #         what failed
        #   The object's diff_result should reliably say if the object was
        #       different in any way, or if it was new. Each field that gets
        #       compared will present its won severity field (or the default
        #       one if not explicitly specified). The "global" severity is the
        #       max of all severities.
        #   New objects will have a diff level of -1
        for object in objColl:
            if object.ignored:
                # Skip it
                continue
            h = lookup.query(object)
            row = h.fetchone_dict()
            if not row:
                # Object does not exist
                id = self.sequences[parentTable].next()
                object.id = id
                extObject = {'id': id}
                _buildExternalValue(extObject, object, parentTableObj)
                addHash(dml.insert[parentTable], extObject)

                # Insert child table information
                for tname in childTables:
                    tbl = self.tables[tname]
                    # Get the list of objects for this package
                    entry_list = object[tbl.getAttribute()]
                    if entry_list is None:
                        continue
                    seq_col = tbl.sequenceColumn
                    new_ids = self.sequences[tbl.name].next_many(len(entry_list)) if seq_col else []
                    for i, entry in enumerate(entry_list):
                        extObject = {childTables[tname]: id}
                        if seq_col:
                            # This table has to insert values in a sequenced
                            # column; since it's a child table and the entry
                            # in the master table is not created yet, there
                            # shouldn't be a problem with uniqueness
                            # constraints
                            new_id = new_ids[i]
                            extObject[seq_col] = new_id
                            # Make sure we initialize the object's sequenced
                            # column as well
                            entry[seq_col] = new_id
                        _buildExternalValue(extObject, entry, tbl)
                        addHash(dml.insert[tname], extObject)
                object.diff_result = Diff()
                # New object
                object.diff_result.level = -1
                continue

            # Already uploaded
            if not ignoreUploaded:
                raise AlreadyUploadedError(object, "Already uploaded")

            # XXX package id set here!!!!!!!!!!
            object.id = row['id']
            # And save the object and the row for later processing
            uploadedObjects[row['id']] = [object, row]

        # Deal with already-uploaded objects
        for objid, (object, row) in list(uploadedObjects.items()):
            # Build the external value
            extObject = {'id': row['id']}
            _buildExternalValue(extObject, object, parentTableObj)
            # Build the DB value
            row = _buildDatabaseValue(row, ptFields)
            # compare them
            object.diff = object.diff_result = Diff()
            diffval = computeDiff(extObject, row, severityHash, object.diff)
            if not forceVerify:
                # If there is enough karma, force the full object check
                # maybe they want the object overwritten
                if uploadForce < object.diff.level and diffval <= severityLimit:
                    # Same object, or not different enough
                    # not enough karma either
                    continue

            localDML = self.__processUploaded(objid, object, childTables,
                                              childTableLookups)

            if uploadForce < object.diff.level:
                # Not enough karma
                if object.diff.level > severityLimit:
                    # Broken transaction - object is too different
                    brokenTransaction = 1
                continue

            # Clean up the object diff since we pushed the package
            object.diff = None

            if diffval:
                # Different parent object
                localDML['update'][parentTable] = [extObject]

            # And transfer the local DML to the global one
            for k, tablehash in list(localDML.items()):
                dmlhash = getattr(dml, k)
                for tname, vallist in list(tablehash.items()):
                    for val in vallist:
                        addHash(dmlhash[tname], val)

        if transactional and brokenTransaction:
            raise TransactionError("Error uploading package source batch")
        return self.__doDML(dml)

    def __processUploaded(self, objid, object, childTables, childTableLookups):
        # Store the DML operations locally
        localDML = {
            'insert': {},
            'update': {},
            'delete': {},
        }

        # Grab the rest of the information
        childTablesInfo = self.__getChildTablesInfo(objid, list(childTables.keys()),
                                                    childTableLookups)

        # Start computing deltas
        for childTableName in childTables:
            # Init the local hashes
            for k in ['insert', 'update', 'delete']:
                localDML[k][childTableName] = []

            dbside = childTablesInfo[childTableName]
            # The child table object
            childTableObj = self.tables[childTableName]
            # The name of the attribute in the parent object
            parentattr = childTableObj.getAttribute()
            # The list of entries associated with the attribute linked to
            # this table
            entrylist = object[parentattr]
            fields = childTableObj.getFields()
            pks = childTableObj.getPK()
            childSeverityHash = childTableObj.getSeverityHash()
            if entrylist is None:
                continue
            for ent in entrylist:
                # Build the primary key
                key = []
                for f in pks:
                    if f == childTables[childTableName]:
                        # Special-case it
                        key.append(objid)
                        continue
                    datatype = fields[f]
                    # Get the proper attribute name for this column
                    attr = childTableObj.getObjectAttribute(f)
                    key.append(sanitizeValue(ent[attr], datatype))
                key = tuple(key)
                # Build the value
                val = {childTables[childTableName]: objid}
                if childTableObj.sequenceColumn:
                    # Initialize the sequenced column with a dummy value
                    ent[childTableObj.sequenceColumn] = None
                _buildExternalValue(val, ent, childTableObj)

                # Look this value up
                if key not in dbside:
                    if childTableObj.sequenceColumn:
                        # Initialize the sequence column too
                        sc = childTableObj.sequenceColumn
                        nextid = self.sequences[childTableName].next()
                        val[sc] = ent[sc] = nextid
                    # This entry has to be inserted
                    object.diff.append((parentattr, val, None))
                    # XXX change to a default value
                    object.diff.setLevel(4)

                    localDML['insert'][childTableName].append(val)
                    continue

                # Already exists in the DB
                dbval = _buildDatabaseValue(dbside[key], fields)

                if childTableObj.sequenceColumn:
                    # Copy the sequenced value - we dpn't want it updated
                    sc = childTableObj.sequenceColumn
                    val[sc] = ent[sc] = dbval[sc]
                # check for updates
                diffval = computeDiff(val, dbval, childSeverityHash,
                                      object.diff, parentattr)
                if not diffval:
                    # Same value
                    del dbside[key]
                    continue

                # Different value; have to update the entry
                localDML['update'][childTableName].append(val)
                del dbside[key]

            # Anything else should be deleted
            for key, val in list(dbside.items()):
                # Send only the PKs
                hash = {}
                for k in pks:
                    hash[k] = val[k]

                # XXX change to a default value
                object.diff.setLevel(4)

                localDML['delete'][childTableName].append(hash)
                object.diff.append((parentattr, None, val))

        return localDML

    def __doDML(self, dml):
        self.__doDelete(dml.delete, dml.tables)
        self.__doUpdate(dml.update, dml.tables)
        self.__doInsert(dml.insert, dml.tables)
        return dml

    def __doInsert(self, hash, tables):
        for tname in tables:
            dict = hash[tname]
            try:
                self.__doInsertTable(tname, dict)
            except rhnSQL.SQLError:
                e = sys.exc_info()[1]
                raise_with_tb(rhnFault(54, str(e[1]), explain=0), sys.exc_info()[2])

    def __doInsertTable(self, table, hash):
        if not hash:
            return
        tab = self.tables[table]
        k = list(hash.keys())[0]
        if not hash[k]:
            # Nothing to do
            return

        insertObj = TableInsert(tab, self.dbmodule)
        insertObj.query(hash)
        return

    def __doDelete(self, hash, tables):
        for tname in tables:
            dict = hash[tname]
            self.__doDeleteTable(tname, dict)

    def __doDeleteTable(self, tname, hash):
        if not hash:
            return
        tab = self.tables[tname]
        # Need to extract the primary keys and look for items to delete only
        # in those columns, the other ones may not be populated
        # See bug 154216 for details (misa 2005-04-08)
        pks = tab.getPK()
        k = pks[0]
        if not hash[k]:
            # Nothing to do
            return
        deleteObj = TableDelete(tab, self.dbmodule)
        deleteObj.query(hash)

    def __doUpdate(self, hash, tables):
        for tname in tables:
            dict = hash[tname]
            self.__doUpdateTable(tname, dict)

    def __doUpdateTable(self, tname, hash):
        if not hash:
            return
        tab = self.tables[tname]
        # See bug 154216 for details (misa 2005-04-08)
        pks = tab.getPK()
        k = pks[0]
        if not hash[k]:
            # Nothing to do
            return
        updateObj = TableUpdate(tab, self.dbmodule)
        updateObj.query(hash)
        return

    def __lookupObjectCollection(self, objColl, tableName, ignore_missing=0):
        # Looks the object up in tableName, and fills in its id
        lookup = TableLookup(self.tables[tableName], self.dbmodule)
        for object in objColl:
            if object.ignored:
                # Skip it
                continue
            h = lookup.query(object)
            row = h.fetchone_dict()
            if not row:
                if ignore_missing:
                    # Ignore the missing objects
                    object.ignored = 1
                    continue
                # Invalid
                raise InvalidPackageError(object, "Could not find object %s in table %s" % (object, tableName))
            object.id = row['id']

    def __getChildTablesInfo(self, id, tables, queries):
        # Returns a hash with the information about package id from tables
        result = {}
        for tname in tables:
            tableobj = self.tables[tname]
            fields = tableobj.getFields()
            q = queries[tname]
            q.execute(id=id)
            hash = {}
            while 1:
                row = q.fetchone_dict()
                if not row:
                    break
                pks = tableobj.getPK()
                key = []
                for f in pks:
                    value = row[f]
                    datatype = fields[f]
                    value = sanitizeValue(value, datatype)
                    key.append(value)
                val = {}
                for f, datatype in list(fields.items()):
                    value = row[f]
                    value = sanitizeValue(value, datatype)
                    val[f] = value
                hash[tuple(key)] = val

            result[tname] = hash
        return result

    def __populateTable(self, table_name, data, delete_extra=1):
        table = self.tables[table_name]
        fields = table.getFields()
        # Build a hash with the incoming data
        incoming = {}
        for entry in data:
            t = hash2tuple(entry, fields)
            incoming[t] = entry

        # Build the query to dump the table's contents
        h = self.dbmodule.prepare("select * from %s" % table.name)
        h.execute()
        deletes = {}
        inserts = {}
        for f in list(fields.keys()):
            inserts[f] = []
            deletes[f] = []

        while 1:
            row = h.fetchone_dict()
            if not row:
                break

            t = hash2tuple(row, fields)
            if t in incoming:
                # we already have this value uploaded
                del incoming[t]
                continue
            addHash(deletes, row)

        for row in list(incoming.values()):
            addHash(inserts, row)

        if delete_extra:
            self.__doDeleteTable(table.name, deletes)
        self.__doInsertTable(table.name, inserts)

    # This function does a diff on the specified table name for the presented
    # data, using pk_fields as unique fields
    def _do_diff(self, data, table_name, uq_fields, fields):
        first_uq_col = uq_fields[0]
        uq_col_values = {}
        all_fields = uq_fields + fields
        for entry in data:
            for f in all_fields:
                if f not in entry:
                    raise Exception("Missing field %s" % f)
            val = entry[first_uq_col]
            if val not in uq_col_values:
                valhash = {}
                uq_col_values[val] = valhash
            else:
                valhash = uq_col_values[val]
            key = build_key(entry, uq_fields)
            valhash[key] = entry

        query = "select %s from %s where %s = :%s" % (
            ", ".join(all_fields),
            table_name,
            first_uq_col, first_uq_col,
        )
        h = self.dbmodule.prepare(query)
        updates = []
        deletes = []
        for val, valhash in list(uq_col_values.items()):
            params = {first_uq_col: val}
            h.execute(**params)
            while 1:
                row = h.fetchone_dict()
                if not row:
                    break
                key = build_key(row, uq_fields)
                if key not in valhash:
                    # Need to delete this one
                    deletes.append(row)
                    continue
                entry = valhash[key]
                for f in fields:
                    if entry[f] != row[f]:
                        # Different, we have to update
                        break
                else:
                    # Same value, remove it from valhash
                    del valhash[key]
                    continue
                # Need to update
                updates.append(entry)

        inserts = []
        list(map(inserts.extend, [list(x.values()) for x in list(uq_col_values.values())]))

        if deletes:
            params = transpose(deletes, uq_fields)
            query = "delete from %s where %s" % (
                table_name,
                ' and '.join(["%s = :%s" % (x, x) for x in uq_fields]),
            )
            h = self.dbmodule.prepare(query)
            h.executemany(**params)
        if inserts:
            params = transpose(inserts, all_fields)
            query = "insert into %s (%s) values (%s)" % (
                table_name,
                ', '.join(all_fields),
                ', '.join([":" + x for x in all_fields]),
            )
            h = self.dbmodule.prepare(query)
            h.executemany(**params)
        if updates:
            params = transpose(updates, all_fields)
            query = "update % set %s where %s" % (
                table_name,
                ', '.join(["%s = :s" + (x, x) for x in fields]),
                ' and '.join(["%s = :%s" % (x, x) for x in uq_fields]),
            )
            h = self.dbmodule.prepare(query)
            h.executemany(**params)

    def validate_pks(self):
        # If nevra is enabled use checksum as primary key
        tbs = self.tables['rhnPackage']
        if not CFG.ENABLE_NVREA:
            # remove checksum from a primary key if nevra is disabled.
            if 'checksum_id' in tbs.pk:
                tbs.pk.remove('checksum_id')

# Returns a tuple for the hash's values


def build_key(hash, fields):
    return tuple(map(lambda x, h=hash: h[x], fields))


def transpose(arrhash, fields):
    params = {}
    for f in fields:
        params[f] = []
    for h in arrhash:
        for f in fields:
            params[f].append(h[f])
    return params


def hash2tuple(hash, fields):
    # Converts the hash into a tuple, with the fields ordered as presented in
    # the fields list
    result = []
    for fname, ftype in list(fields.items()):
        result.append(sanitizeValue(hash[fname], ftype))
    return tuple(result)


class DML:

    def __init__(self, tables, tableHash):
        self.update = {}
        self.delete = {}
        self.insert = {}
        self.tables = tables
        for k in ('insert', 'update', 'delete'):
            dmlhash = {}
            setattr(self, k, dmlhash)
            for tname in tables:
                hash = {}
                for f in list(tableHash[tname].getFields().keys()):
                    hash[f] = []
                dmlhash[tname] = hash


def _buildDatabaseValue(row, fieldsHash):
    # Returns a dictionary containing the interesting values of the row,
    # sanitized
    dict = {}
    for f, datatype in list(fieldsHash.items()):
        dict[f] = sanitizeValue(row.get(f), datatype)
    return dict


def _buildExternalValue(dict, entry, tableObj):
    # updates dict with values from entry
    # entry is a hash-like object (non-db)
    for f, datatype in list(tableObj.getFields().items()):
        if f in dict:
            # initialized somewhere else
            continue
        # Get the attribute's name
        attr = tableObj.getObjectAttribute(f)
        # Sanitize the value according to its datatype
        if attr not in entry:
            entry[attr] = None
        dict[f] = sanitizeValue(entry[attr], datatype)


def computeDiff(hash1, hash2, diffHash, diffobj, prefix=None):
    # Compare if the key-values of hash1 are a subset of hash2's
    difference = 0
    ignore_keys = ['last_modified']

    for k, v in list(hash1.items()):
        if k in ignore_keys:
            # Dont decide the diff based on last_modified
            # as this obviously wont match due to our db
            # other triggers.
            continue
        if hash2[k] == v:
            # Same values
            continue
        if k == 'installed_size' and v is not None and hash2[k] is None:
            # Skip installed_size which might not have been populated
            continue
        if k in diffHash:
            diffval = diffHash[k]
            if diffval == 0:
                # Completely ignore this key
                continue
        else:
            diffval = diffobj.level + 1

        if prefix:
            diffkey = prefix + '::' + k
        else:
            diffkey = k

        diffobj.setLevel(diffval)
        diffobj.append((diffkey, v, hash2[k]))

        difference = diffobj.level

    return difference
 07070100000181000081B40000000000000000000000015FBBE8EE00003D74000000000000000000000000000000000000003100000000spacewalk-backend/server/importlib/backendLib.py  #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Generic DB backend data structures
#

import time
import string

try:
    #  python 2
    from UserDict import UserDict
except ImportError:
    #  python3
    from collections import UserDict
from uyuni.common.usix import ListType, StringType, DictType, IntType, UnicodeType

# A function that formats a UNIX timestamp to the session's format


def gmtime(timestamp):
    return _format_time(time.gmtime(float(timestamp)))


def localtime(timestamp):
    return _format_time(time.localtime(float(timestamp)))


def _format_time(time_tuple):
    return time.strftime("%Y-%m-%d %H:%M:%S", time_tuple)

# Database datatypes


class DBtype:
    pass


class DBint(DBtype):
    pass


class DBstring(DBtype):

    def __init__(self, limit):
        self.limit = limit


class DBblob(DBtype):
    pass


class DBdate(DBtype):
    pass


class DBdateTime(DBtype):
    pass

# Database objects


class Table:
    # A list of supported keywords
    keywords = {
        'fields': DictType,
        'pk': ListType,
        'attribute': str,
        'map': DictType,
        'nullable': ListType,  # Will become a hash eventually
        'severityHash': DictType,
        'defaultSeverity': IntType,
        'sequenceColumn': str,
    }

    def __init__(self, name, **kwargs):
        self.name = name
        for k in list(kwargs.keys()):
            if k not in self.keywords:
                raise TypeError("Unknown keyword attribute '%s'" % k)
        # Initialize stuff
        # Fields
        self.fields = {}
        # Primary keys
        self.pk = []
        # Mapping from database fields to generic attribute names
        self.map = {}
        # Name of the attribute this table links back to
        self.attribute = None
        # Nullable columns; will become a hash
        self.nullable = []
        # Compute the diff
        self.severityHash = {}
        self.defaultSeverity = 4
        # Sequence column - a column that is populated off a sequence
        self.sequenceColumn = None

        for k, v in list(kwargs.items()):
            datatype = self.keywords[k]
            if not isinstance(v, datatype):
                raise TypeError("%s expected to be %s; got %s" % (
                    k, datatype, type(v)))
            setattr(self, k, v)

        # Fix nullable
        nullable = self.nullable
        self.nullable = {}
        if nullable:
            for field in nullable:
                if field not in self.fields:
                    raise TypeError("Unknown nullable field %s in table %s" % (
                        field, name))
                self.nullable[field] = None

        # Now analyze pk
        for field in self.pk:
            if field not in self.fields:
                raise TypeError("Unknown primary key field %s" % field)

    def __str__(self):
        return "Instance of class %s.%s: PK: %s, Fields: %s" % (self.__class__.__module__,
                                                                self.__class__.__name__, self.pk, self.fields)
    __repr__ = __str__

    def isNullable(self, field):
        if field not in self.fields:
            raise TypeError("Unknown field %s" % field)
        return field in self.nullable

    def getPK(self):
        return self.pk

    def getFields(self):
        return self.fields

    def getAttribute(self):
        return self.attribute

    def getObjectAttribute(self, attribute):
        if attribute in self.map:
            return self.map[attribute]
        return attribute

    def getSeverityHash(self):
        for field in list(self.fields.keys()):
            if field not in self.severityHash:
                self.severityHash[field] = self.defaultSeverity
        return self.severityHash

# A collection of tables


class TableCollection(UserDict):

    def __init__(self, *list):
        UserDict.__init__(self)
        # Verify if the list's items are the right format
        for table in list:
            if not isinstance(table, Table):
                raise TypeError("Expected a Table instance; got %s" %
                                type(table))
        # Now initialize the collection
        for table in list:
            self.__setitem__(table.name, table)

# Lookup class
# The problem stems from the different way we're supposed to build a query if
# the value is nullable


class BaseTableLookup:

    def __init__(self, table, dbmodule):
        # Generates a bunch of queries that look up data based on the primary
        # keys of this table
        self.dbmodule = dbmodule
        self.table = table
        self.pks = self.table.getPK()
        self.whereclauses = {}
        self.queries = {}
        self._buildWhereClauses()

    def _buildWhereClauses(self):
        # Keys is a list of lists of 0/1, 0 if the column is not nullable
        keys = [[]]
        # The corresponding query arguments
        queries = [[]]
        for col in self.pks:
            k = []
            q = []
            for i in range(len(keys)):
                key = keys[i]
                query = queries[i]
                k.append(key + [0])
                q.append(query + ["%s = :%s" % (col, col)])
                if self.table.isNullable(col):
                    k.append(key + [1])
                    q.append(query + ["%s is null" % col])
            keys = k
            queries = q
        # Now put the queries in self.sqlqueries, keyed on the list of 0/1
        for i in range(len(keys)):
            key = tuple(keys[i])
            query = ' and '.join(queries[i])
            self.whereclauses[key] = query

    def _selectQueryKey(self, value):
        # Determine which query should we use
        # Build the key first
        hash = {}
        key = []
        for col in self.pks:
            if self.table.isNullable(col) and value[col] in [None, '']:
                key.append(1)
            else:
                key.append(0)
                hash[col] = value[col]
        key = tuple(key)
        return key, hash

    def _buildQuery(self, key):
        # Stub
        return None

    def _getCachedQuery(self, key, blob_map=None):
        if key in self.queries:
            # Serve it from the pool
            return self.queries[key]

        statement = self.dbmodule.prepare(self._buildQuery(key), blob_map=blob_map)
        # And save it to the cached queries pool
        self.queries[key] = statement
        return statement

    def query(self, values):
        key, values = self._selectQueryKey(values)
        statement = self._getCachedQuery(key)
        statement.execute(**values)
        return statement


class TableLookup(BaseTableLookup):

    def __init__(self, table, dbmodule):
        BaseTableLookup.__init__(self, table, dbmodule)
        self.queryTemplate = "select * from %s where %s"

    def _buildQuery(self, key):
        return self.queryTemplate % (self.table.name, self.whereclauses[key])


class TableUpdate(BaseTableLookup):

    def __init__(self, table, dbmodule):
        BaseTableLookup.__init__(self, table, dbmodule)
        self.queryTemplate = "update %s set %s where %s"
        self.fields = list(self.table.getFields().keys())
        # Fields minus pks
        self.otherfields = []
        # BLOBs cannot be PKs, and have to be updated differently
        self.blob_fields = []
        for field in self.fields:
            if field in self.pks:
                continue
            datatype = self.table.fields[field]
            if isinstance(datatype, DBblob):
                self.blob_fields.append(field)
            else:
                self.otherfields.append(field)
        self.updateclause = ', '.join(["%s = :%s" % (x, x) for x in self.otherfields])
        # key
        self.firstkey = None
        for pk in self.pks:
            if not self.table.isNullable(pk):
                # This is it
                self.firstkey = pk
                break

    def _buildQuery(self, key):
        return self.queryTemplate % (self.table.name, self.updateclause,
                                     self.whereclauses[key])

    def _split_blob_values(self, values, blob_only=0):
        # Splits values that have to be inserted
        # Blobs will be in a separate hash
        valuesHash = {}
        # blobValuesHash is a hash keyed on the primary key fields
        # should only have one element if the primary key has no nullable
        # fields
        blobValuesHash = {}
        for key in list(self.whereclauses.keys()):
            hash = {}
            for i in range(len(key)):
                pk = self.pks[i]
                # Only add the PK if it's non-null
                if not key[i]:
                    hash[pk] = []
            # And then add everything else
            for k in self.otherfields:
                hash[k] = []
            valuesHash[key] = hash
            blobValuesHash[key] = []

        # Split the query values on key components
        for i in range(len(values[self.firstkey])):
            # Build the value
            pk_val = {}
            val = {}
            for k in self.pks:
                pk_val[k] = val[k] = values[k][i]
            key, val = self._selectQueryKey(val)

            if not blob_only:
                # Add the rest of the values
                for k in self.otherfields:
                    val[k] = values[k][i]
                addHash(valuesHash[key], val)

            if not self.blob_fields:
                # Nothing else to do
                continue
            val = {}
            for k in self.blob_fields:
                val[k] = values[k][i]
            blobValuesHash[key].append((pk_val, val))

        return valuesHash, blobValuesHash

    def query(self, values):
        valuesHash, blobValuesHash = self._split_blob_values(values, blob_only=0)
        # And now do the actual update for non-blobs
        if self.otherfields:
            for key, val in list(valuesHash.items()):
                if not val[self.firstkey]:
                    # Nothing to do
                    continue
                statement = self._getCachedQuery(key)
                statement.executemany(**val)

        if not self.blob_fields:
            return

        self._update_blobs(blobValuesHash)

    def _update_blobs(self, blobValuesHash):
        # Now update BLOB fields
        template = "select %s from %s where %s for update"
        blob_fields_string = ", ".join(self.blob_fields)
        for key, val in list(blobValuesHash.items()):
            statement = template % (blob_fields_string, self.table.name,
                                    self.whereclauses[key])
            h = self.dbmodule.prepare(statement)
            for lookup_hash, blob_hash in val:
                h.execute(**lookup_hash)
                # Should have exactly one row here
                row = h.fetchone_dict()
                if not row:
                    # XXX This should normally not happen
                    raise ValueError("BLOB query did not retrieve a value")
                for k, v in list(blob_hash.items()):
                    blob = row[k]
                    len_v = len(v)
                    # If new value is shorter than old value, we have to trim
                    # the blob
                    if blob.size() > len_v:
                        blob.trim(len_v)
                    # blobs don't like to write the empty string
                    if len_v:
                        blob.write(v)
                # Is this the only row?
                row = h.fetchone_dict()
                if row is not None:
                    # XXX This should not happen, the primary key was not
                    # unique
                    raise ValueError("Primary key not unique",
                                     self.table.name, lookup_hash)


class TableDelete(TableLookup):

    def __init__(self, table, dbmodule):
        TableLookup.__init__(self, table, dbmodule)
        self.queryTemplate = "delete from %s where %s"

    def query(self, values):
        # Build the values hash
        valuesHash = {}
        for key in list(self.whereclauses.keys()):
            hash = {}
            for i in range(len(key)):
                pk = self.pks[i]
                # Only add the PK if it's non-null
                if not key[i]:
                    hash[pk] = []
            valuesHash[key] = hash

        # Split the query values on key components
        firstkey = self.pks[0]
        for i in range(len(values[firstkey])):
            # Build the value
            val = {}
            for k in self.pks:
                val[k] = values[k][i]
            key, val = self._selectQueryKey(val)
            addHash(valuesHash[key], val)

        # And now do the actual delete
        for key, val in list(valuesHash.items()):
            firstkey = list(val.keys())[0]
            if not val[firstkey]:
                # Nothing to do
                continue
            statement = self._getCachedQuery(key)
            statement.executemany(**val)


class TableInsert(TableUpdate):

    def __init__(self, table, dbmodule):
        TableUpdate.__init__(self, table, dbmodule)
        self.queryTemplate = "insert into %s (%s) values %%s"

        self.insert_fields = self.pks + self.otherfields + self.blob_fields

    def _buildQuery(self, key):
        q = self.queryTemplate % (self.table.name, ', '.join(self.insert_fields))
        return q

    def query(self, values):
        if self.blob_fields:
            blob_map = {}
            for f in self.blob_fields:
                blob_map[f] = f
        else:
            blob_map = None

        # Do the insert
        statement = self._getCachedQuery(None, blob_map=blob_map)
        l = len(values[self.insert_fields[0]])
        value_list = [[values[f][i] for f in self.insert_fields] for i in range(l)]
        statement.execute_values(self._buildQuery(None), value_list, fetch=False, page_size=10_000)

def sanitizeValue(value, datatype):
    if isinstance(datatype, DBstring):
        if value is None or value == '':
            return None         # we really want to preserve Nones
            # and not depend on Oracle converting
            # empty strings to NULLs -- PostgreSQL
            # does not do this
        if len(value) > datatype.limit:
            value = value[:datatype.limit]
            # ignore incomplete characters created after truncating
        return value
    if isinstance(datatype, DBblob):
        if value is None:
            value = ''
        return str(value)
    if value in [None, '']:
        return None
    if isinstance(datatype, DBdateTime):
        s = str(value)
        if len(s) == 10:
            # Pad it to be a real datetime
            s = s + " 00:00:00"
        return s
    if isinstance(datatype, DBdate):
        return str(value)[:10]
    if isinstance(datatype, DBint):
        return int(value)
    return value


def addHash(hasharray, hash):
    # hasharray is a hash of arrays
    # add hash's values to hasharray
    for k, v in list(hash.items()):
        if k in hasharray:
            hasharray[k].append(v)
07070100000182000081B40000000000000000000000015FBBE8EE00005EA9000000000000000000000000000000000000003400000000spacewalk-backend/server/importlib/backendOracle.py   #
# Copyright (c) 2008--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Oracle-specific stuff
#
# FIXME: need more documentation
#

import sys
from .backend import Backend
from .backendLib import DBint, DBstring, DBdateTime, Table, \
    TableCollection, DBblob
from spacewalk.server import rhnSQL
from spacewalk.server.rhnSQL.const import POSTGRESQL
from spacewalk.common.rhnConfig import CFG
from uyuni.common import timezone_utils


class OracleBackend(Backend):
    tables = TableCollection(
        # NOTE: pk = primary keys
        #       attribute = attribute this table links back to
        #       map = mapping from database fields to generic attribute names
        Table('rhnPackageProvides',
              fields={
                  'package_id': DBint(),
                  'capability_id': DBint(),
                  'sense': DBint(),
              },
              pk=['package_id', 'capability_id', 'sense'],
              attribute='provides',
              map={'sense': 'flags', },
              ),
        Table('rhnPackageRequires',
              fields={
                  'package_id': DBint(),
                  'capability_id': DBint(),
                  'sense': DBint(),
              },
              pk=['package_id', 'capability_id', 'sense'],
              attribute='requires',
              map={'sense': 'flags', },
              ),
        Table('rhnPackageConflicts',
              fields={
                  'package_id': DBint(),
                  'capability_id': DBint(),
                  'sense': DBint(),
              },
              pk=['package_id', 'capability_id', 'sense'],
              attribute='conflicts',
              map={'sense': 'flags', },
              ),
        Table('rhnPackageObsoletes',
              fields={
                  'package_id': DBint(),
                  'capability_id': DBint(),
                  'sense': DBint(),
              },
              pk=['package_id', 'capability_id', 'sense'],
              attribute='obsoletes',
              map={'sense': 'flags', },
              ),
        Table('rhnPackageRecommends',
              fields={
                  'package_id': DBint(),
                  'capability_id': DBint(),
                  'sense': DBint(),
              },
              pk=['package_id', 'capability_id', 'sense'],
              attribute='recommends',
              map={'sense': 'flags', },
              ),
        Table('rhnPackageSuggests',
              fields={
                  'package_id': DBint(),
                  'capability_id': DBint(),
                  'sense': DBint(),
              },
              pk=['package_id', 'capability_id', 'sense'],
              attribute='suggests',
              map={'sense': 'flags', },
              ),
        Table('rhnPackageSupplements',
              fields={
                  'package_id': DBint(),
                  'capability_id': DBint(),
                  'sense': DBint(),
              },
              pk=['package_id', 'capability_id', 'sense'],
              attribute='supplements',
              map={'sense': 'flags', },
              ),
        Table('rhnPackageEnhances',
              fields={
                  'package_id': DBint(),
                  'capability_id': DBint(),
                  'sense': DBint(),
              },
              pk=['package_id', 'capability_id', 'sense'],
              attribute='enhances',
              map={'sense': 'flags', },
              ),
        Table('rhnPackageBreaks',
              fields={
                  'package_id': DBint(),
                  'capability_id': DBint(),
                  'sense': DBint(),
              },
              pk=['package_id', 'capability_id', 'sense'],
              attribute='breaks',
              map={'sense': 'flags', },
              ),
        Table('rhnPackagePredepends',
              fields={
                  'package_id': DBint(),
                  'capability_id': DBint(),
                  'sense': DBint(),
              },
              pk=['package_id', 'capability_id', 'sense'],
              attribute='predepends',
              map={'sense': 'flags', },
              ),
        Table('rhnPackageChangeLogRec',
              fields={
                  'id': DBint(),
                  'package_id': DBint(),
                  'changelog_data_id': DBint(),
              },
              pk=['package_id', 'changelog_data_id'],
              attribute='changelog',
              sequenceColumn='id',
              ),
        Table('rhnPackageChangeLogData',
              fields={
                  'id': DBint(),
                  'name': DBstring(128),
                  'text': DBblob(),
                  'time': DBdateTime()
              },
              ),
        Table('rhnPackageFile',
              fields={
                  'package_id': DBint(),
                  'capability_id': DBint(),
                  'device': DBint(),
                  'inode': DBint(),
                  'file_mode': DBint(),
                  'username': DBstring(32),
                  'groupname': DBstring(32),
                  'rdev': DBint(),
                  'file_size': DBint(),
                  'mtime': DBdateTime(),
                  'checksum_id': DBint(),
                  'linkto': DBstring(256),
                  'flags': DBint(),
                  'verifyflags': DBint(),
                  'lang': DBstring(32),
              },
              pk=['package_id', 'capability_id'],
              attribute='files',
              severityHash={
                  'mtime': 0,
                  'file_size': 4,
              },
              ),
        Table('rhnPackage',
              fields={
                  'id': DBint(),
                  'org_id': DBint(),
                  'name_id': DBint(),
                  'evr_id': DBint(),
                  'package_arch_id': DBint(),
                  'package_group': DBint(),
                  'rpm_version': DBstring(16),
                  'description': DBstring(4000),
                  'summary': DBstring(4000),
                  'package_size': DBint(),
                  'payload_size': DBint(),
                  'installed_size': DBint(),
                  'build_host': DBstring(256),
                  'build_time': DBdateTime(),
                  'source_rpm_id': DBint(),
                  'checksum_id': DBint(),
                  'vendor': DBstring(64),
                  'payload_format': DBstring(32),
                  'path': DBstring(1000),
                  'copyright': DBstring(128),
                  'cookie': DBstring(128),
                  'header_start': DBint(),
                  'header_end': DBint(),
                  'last_modified': DBdateTime(),
              },
              pk=['org_id', 'name_id', 'evr_id', 'package_arch_id',
                  'checksum_id'],
              nullable=['org_id'],
              severityHash={
                  'path': 1,
                  'package_size': 2,
                  'build_time': 3,
                  'build_host': 3,
                  'last_modified': 0.5,
                  # rpm got it wrong so now we have to ignore it
                  'payload_size': 0,
              },
              ),
        Table('rhnChannelPackage',
              fields={
                  'package_id': DBint(),
                  'channel_id': DBint(),
              },
              pk=['channel_id', 'package_id'],
              ),
        Table('rhnErrata',
              fields={
                  'id': DBint(),
                  'advisory': DBstring(100),
                  'advisory_type': DBstring(32),
                  'advisory_name': DBstring(100),
                  'advisory_rel': DBint(),
                  'product': DBstring(64),
                  'description': DBstring(4000),
                  'synopsis': DBstring(4000),
                  'topic': DBstring(4000),
                  'solution': DBstring(4000),
                  'notes': DBstring(4000),
                  'refers_to': DBstring(4000),
                  'org_id': DBint(),
                  'locally_modified': DBstring(1),
                  'severity_id': DBint(),
                  'errata_from': DBstring(127),
                  # We will treat issue_date and update_date as regular dates
                  # with times instead of DBdate types, otherwise we'd have
                  # issues with timezones
                  'issue_date': DBdateTime(),
                  'update_date': DBdateTime(),
                  'last_modified': DBdateTime(),
              },
              pk=['advisory_name', 'org_id'],
              nullable=['org_id'],
              defaultSeverity=4,
              ),
        Table('rhnErrataBugList',
              fields={
                  'errata_id': DBint(),
                  'bug_id': DBint(),
                  'summary': DBstring(4000),
                  'href': DBstring(255),
              },
              pk=['errata_id', 'bug_id'],
              attribute='bugs',
              defaultSeverity=4,
              ),
        Table('rhnCVE',
              fields={
                  'id': DBint(),
                  'name': DBstring(20),
              },
              pk=['name'],
              ),
        Table('rhnErrataCVE',
              fields={
                  'errata_id': DBint(),
                  'cve_id': DBint(),
              },
              pk=['errata_id', 'cve_id'],
              attribute='cve',
              defaultSeverity=4,
              ),
        Table('rhnErrataFile',
              fields={
                  'id': DBint(),
                  'errata_id': DBint(),
                  'type': DBint(),
                  'checksum_id': DBint(),
                  'filename': DBstring(4000),
              },
              pk=['errata_id', 'filename', 'checksum_id'],
              attribute='files',
              defaultSeverity=4,
              sequenceColumn='id',
              ),
        Table('rhnErrataFilePackage',
              fields={
                  'errata_file_id': DBint(),
                  'package_id': DBint(),
              },
              pk=['errata_file_id', 'package_id'],
              ),
        Table('rhnErrataFilePackageSource',
              fields={
                  'errata_file_id': DBint(),
                  'package_id': DBint(),
              },
              pk=['errata_file_id', 'package_id'],
              ),
        Table('rhnErrataFileChannel',
              fields={
                  'errata_file_id': DBint(),
                  'channel_id': DBint(),
              },
              pk=['errata_file_id', 'channel_id'],
              ),
        Table('rhnErrataKeyword',
              fields={
                  'errata_id': DBint(),
                  'keyword': DBstring(64),
              },
              pk=['errata_id', 'keyword'],
              attribute='keywords',
              defaultSeverity=4,
              ),
        Table('rhnErrataPackage',
              fields={
                  'errata_id': DBint(),
                  'package_id': DBint(),
              },
              pk=['errata_id', 'package_id'],
              attribute='packages',
              defaultSeverity=4,
              ),
        Table('rhnChannelErrata',
              fields={
                  'errata_id': DBint(),
                  'channel_id': DBint(),
              },
              pk=['errata_id', 'channel_id'],
              attribute='channels',
              defaultSeverity=4,
              ),
        Table('rhnChannel',
              fields={
                  'id': DBint(),
                  'parent_channel': DBint(),
                  'org_id': DBint(),
                  'channel_arch_id': DBint(),
                  'label': DBstring(128),
                  'basedir': DBstring(256),
                  'name': DBstring(256),
                  'summary': DBstring(500),
                  'description': DBstring(4000),
                  'product_name_id': DBint(),
                  'gpg_key_url': DBstring(256),
                  'gpg_key_id': DBstring(14),
                  'gpg_key_fp': DBstring(50),
                  'end_of_life': DBdateTime(),
                  'receiving_updates': DBstring(1),
                  'last_modified': DBdateTime(),
                  'channel_product_id': DBint(),
                  'checksum_type_id': DBint(),
                  'channel_access': DBstring(10),
                  'update_tag': DBstring(128),
                  'installer_updates': DBstring(1)
              },
              pk=['label'],
              severityHash={
                  'channel_product_id': 0,
              },
              ),
        Table('rhnChannelFamily',
              fields={
                  'id': DBint(),
                  'name': DBstring(128),
                  'label': DBstring(128),
              },
              pk=['label'],
              defaultSeverity=4,
              ),
        Table('rhnDistChannelMap',
              fields={
                  'os': DBstring(64),
                  'release': DBstring(64),
                  'channel_arch_id': DBint(),
                  'channel_id': DBint(),
                  'org_id': DBint(),
              },
              pk=['release', 'channel_arch_id', 'org_id'],
              attribute='dists',
              defaultSeverity=4,
              ),
        Table('rhnReleaseChannelMap',
              fields={
                  'product': DBstring(64),
                  'version': DBstring(64),
                  'release': DBstring(64),
                  'channel_arch_id': DBint(),
                  'channel_id': DBint()
              },
              pk=['product', 'version', 'release', 'channel_arch_id', 'channel_id'],
              attribute='release',
              defaultSeverity=4,
              ),
        Table('rhnChannelTrust',
              fields={
                  'channel_id': DBint(),
                  'org_trust_id': DBint(),
              },
              pk=['channel_id', 'org_trust_id'],
              attribute='trust_list',
              defaultSeverity=4,
              ),
        Table('rhnChannelFamilyMembers',
              fields={
                  'channel_id': DBint(),
                  'channel_family_id': DBint(),
              },
              pk=['channel_id', 'channel_family_id'],
              attribute='families',
              defaultSeverity=4,
              ),
        Table('rhnPackageSource',
              fields={
                  'id': DBint(),
                  'org_id': DBint(),
                  'source_rpm_id': DBint(),
                  'package_group': DBint(),
                  'rpm_version': DBstring(16),
                  'payload_size': DBint(),
                  'build_host': DBstring(256),
                  'build_time': DBdateTime(),
                  'path': DBstring(1000),
                  'package_size': DBint(),
                  'checksum_id': DBint(),
                  'sigchecksum_id': DBint(),
                  'vendor': DBstring(64),
                  'cookie': DBstring(128),
                  'last_modified': DBdateTime(),
              },
              pk=['source_rpm_id', 'org_id',
                  'sigchecksum_id', 'checksum_id'],
              nullable=['org_id'],
              severityHash={
                  'path': 1,
                  'file_size': 2,
                  'build_host': 3,
                  'build_time': 3,
                  # rpm got it wrong so now we have to ignore it
                  'payload_size': 0,
                  'last_modified': 0.5,
              },
              ),
        Table('rhnServerArch',
              fields={
                  'id': DBint(),
                  'label': DBstring(64),
                  'name': DBstring(64),
                  'arch_type_id': DBint(),
              },
              pk=['label'],
              ),
        Table('rhnPackageArch',
              fields={
                  'id': DBint(),
                  'label': DBstring(64),
                  'name': DBstring(64),
                  'arch_type_id': DBint(),
              },
              pk=['label'],
              ),
        Table('rhnChannelArch',
              fields={
                  'id': DBint(),
                  'label': DBstring(64),
                  'name': DBstring(64),
                  'arch_type_id': DBint(),
              },
              pk=['label'],
              ),
        Table('rhnCPUArch',
              fields={
                  'id': DBint(),
                  'label': DBstring(64),
                  'name': DBstring(64),
              },
              pk=['label'],
              ),
        Table('rhnServerPackageArchCompat',
              fields={
                  'server_arch_id': DBint(),
                  'package_arch_id': DBint(),
                  'preference': DBint(),
              },
              pk=['server_arch_id', 'package_arch_id', 'preference'],
              ),
        Table('rhnServerChannelArchCompat',
              fields={
                  'server_arch_id': DBint(),
                  'channel_arch_id': DBint(),
              },
              pk=['server_arch_id', 'channel_arch_id'],
              ),
        Table('rhnChannelPackageArchCompat',
              fields={
                  'channel_arch_id': DBint(),
                  'package_arch_id': DBint(),
              },
              pk=['channel_arch_id', 'package_arch_id'],
              ),
        Table('rhnServerServerGroupArchCompat',
              fields={
                  'server_arch_id': DBint(),
                  'server_group_type': DBint(),
              },
              pk=['server_arch_id', 'server_group_type'],
              ),
        Table('rhnKickstartableTree',
              fields={
                  'id': DBint(),
                  'org_id': DBint(),
                  'base_path': DBstring(256),
                  'channel_id': DBint(),
                  'label': DBstring(64),
                  'boot_image': DBstring(128),
                  'kstree_type': DBint(),
                  'install_type': DBint(),
                  'last_modified': DBdateTime()
              },
              pk=['label', 'org_id'],
              nullable=['org_id'],
              ),
        Table('rhnKSTreeType',
              # not used at the moment
              fields={
                  'id': DBint(),
                  'label': DBstring(32),
                  'name': DBstring(64),
              },
              pk=['label'],
              ),
        Table('rhnKSInstallType',
              # not used at the moment
              fields={
                  'id': DBint(),
                  'label': DBstring(32),
                  'name': DBstring(64),
              },
              pk=['label'],
              ),
        Table('rhnKSTreeFile',
              fields={
                  'kstree_id': DBint(),
                  'relative_filename': DBstring(256),
                  'checksum_id': DBint(),
                  'file_size': DBint(),
                  'last_modified': DBdateTime()
              },
              pk=['kstree_id', 'relative_filename', 'checksum_id'],
              attribute='files',
              map={
                  'relative_filename': 'relative_path',
              },
              ),

        Table('rhnProductName',
              fields={
                  'id': DBint(),
                  'label': DBstring(128),
                  'name': DBstring(128),
              },
              pk=['id', 'label', 'name'],
              ),
        Table('rhnContentSource',
              fields={
                  'id': DBint(),
                  'org_id': DBint(),
                  'label': DBstring(128),
                  'source_url': DBstring(2048),
                  'type_id': DBint(),
              },
              pk=['label', 'org_id', 'type_id'],
              nullable=['org_id'],
              ),
        Table('rhnContentSourceSsl',
              fields={
                  'content_source_id': DBint(),
                  'ssl_ca_cert_id': DBint(),
                  'ssl_client_cert_id': DBint(),
                  'ssl_client_key_id': DBint()
              },
              attribute='ssl-sets',
              pk=['content_source_id', 'ssl_ca_cert_id', 'ssl_client_cert_id', 'ssl_client_key_id'],
              nullable=['ssl_client_cert_id', 'ssl_client_key_id'],
              ),

        Table('suseProductFile',
            fields      = {
                'id'                : DBint(),
                'name'              : DBstring(256),
                'evr_id'            : DBint(),
                'package_arch_id'   : DBint(),
                'vendor'            : DBstring(256),
                'summary'           : DBstring(4000),
                'description'       : DBstring(4000),
            },
            pk          = ['id'],
            nullable    = ['vendor', 'summary', 'description'],
        ),
        Table('susePackageProductFile',
            fields      = {
                'package_id'       : DBint(),
                'prodfile_id'      : DBint(),
            },
            pk          = ['package_id', 'prodfile_id'],
            attribute   = 'product_files',
        ),
        Table('suseEula',
            fields      = {
                'id'       : DBint(),
                'text'     : DBblob(),
                'checksum' : DBstring(64),
            },
            pk          = ['id'],
            nullable    = [],
        ),
        Table('susePackageEula',
            fields      = {
                'package_id' : DBint(),
                'eula_id'    : DBint(),
            },
            pk          = ['package_id', 'eula_id'],
            attribute   = 'eulas',
        ),
        Table('rhnPackageExtraTagKey',
              fields={
                  'id'      : DBint(),
                  'name'    : DBstring(256),
              },
              pk=['id'],
              attribute='extra_tags',
              ),
        Table('rhnPackageExtraTag',
            fields={
              'package_id'  : DBint(),
              'key_id'      : DBint(),
              'value'       : DBstring(2048),
            },
            pk=['package_id', 'key_id'],
            attribute='extra_tags',
        ),
    )

    def __init__(self):
        Backend.__init__(self, rhnSQL)

    def setSessionTimeZoneToLocalTimeZone(self):
        sth = self.dbmodule.prepare("alter session set time_zone = '%s'"
                                    % timezone_utils.get_utc_offset())
        sth.execute()

    def init(self):
        """
        Override parent to do explicit setting of the date format. (Oracle
        specific)
        """
        # Set date format
        self.setSessionTimeZoneToLocalTimeZone()
        self.setDateFormat("YYYY-MM-DD HH24:MI:SS")
        return Backend.init(self)


class PostgresqlBackend(OracleBackend):

    """
    PostgresqlBackend specific implementation. The bulk of the OracleBackend
    is not actually Oracle specific, so we'll re-use as much as we can and just
    avoid the few bits that are.
    """

    def setSessionTimeZoneToLocalTimeZone(self):
        sth = self.dbmodule.prepare("set session time zone '%s'"
                                    % timezone_utils.get_utc_offset())
        sth.execute()

    def init(self):
        """
        Avoid the Oracle specific stuff here in parent method.
        """
        self.setSessionTimeZoneToLocalTimeZone()
        return Backend.init(self)

def SQLBackend():
    if CFG.DB_BACKEND == POSTGRESQL:
        backend = PostgresqlBackend()
    backend.init()
    return backend
   07070100000183000081FD0000000000000000000000015FBBE8EE00000438000000000000000000000000000000000000003600000000spacewalk-backend/server/importlib/backend_checker.py #!/usr/bin/python

import sys
from spacewalk.server import rhnSQL
from spacewalk.server.importlib import backendOracle
from spacewalk.server.importlib.backendLib import DBstring

exitval = 0

rhnSQL.initDB()
q = rhnSQL.prepare("""select data_length
                        from user_tab_columns
                       where upper(table_name) = upper(:tname)
                         and upper(column_name) = upper(:cname)""")

backend = backendOracle.PostgresqlBackend()

for tn, tc in list(backend.tables.items()):
    for cn, cv in list(tc.getFields().items()):
        if isinstance(cv, DBstring):
            q.execute(tname=tn, cname=cn)
            row = q.fetchone_dict()
            if not row or row['data_length'] != cv.limit:
                print((("ERROR: database column %s.%s is %s chars long "
                       + "but defined as %s chars in backendOracle.py") % (
                    tn, cn, row['data_length'], cv.limit)))
                exitval = 1
            else:
                print(("%s.%s = %d" % (tn, cn, row['data_length'])))

sys.exit(exitval)
07070100000184000081B40000000000000000000000015FBBE8EE000033E9000000000000000000000000000000000000003400000000spacewalk-backend/server/importlib/channelImport.py   #
# Copyright (c) 2008--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# Channel import process
#

from .importLib import Import, InvalidArchError, \
    InvalidChannelError, InvalidChannelFamilyError, MissingParentChannelError
from spacewalk.satellite_tools.syncLib import log


class ChannelImport(Import):

    def __init__(self, batch, backend):
        Import.__init__(self, batch, backend)
        self.arches = {}
        self.families = {}
        self.dists = {}
        self.will_commit = 1
        self.releases = {}
        self.channels = {}
        self.checksum_types = {}

    def preprocess(self):
        # Processes the batch to a form more suitable for database
        # operations
        for channel in self.batch:
            self.__processChannel(channel)

    def __processChannel(self, channel):
        # Processes a package
        arch = channel['channel_arch']
        if arch not in self.arches:
            self.arches[arch] = None
        for family in channel['families']:
            self.families[family['label']] = None
        # Dists
        if 'dists' in channel and channel['dists'] is not None:
            for dist in channel['dists']:
                self.arches[dist['channel_arch']] = None
        # Product Names
        if 'release' in channel and channel['release'] is not None:
            for release in channel['release']:
                self.arches[release['channel_arch']] = None
        if 'receiving_updates' not in channel or channel['receiving_updates'] is None:
            channel['receiving_updates'] = 'N'
        # Yum repo checksum type
        if (channel['checksum_type']
                and channel['checksum_type'] not in self.checksum_types):
            self.checksum_types[channel['checksum_type']] = None

        # bug #528227
        # Print a warning in case the sync would move the channel between orgs
        if 'org_id' in channel and channel['org_id']:
            org_id = self.backend.lookupChannelOrg(channel['label'])

            if org_id and int(channel['org_id']) != org_id['org_id']:
                log(1, "WARNING: Channel %s is already present in orgid %s." %
                    (channel['label'], org_id['org_id']))
                log(1, "         Running synchronization will move the channel to orgid %s." %
                    channel['org_id'])
                log(1, '')

    def fix(self):
        self.backend.lookupChannelArches(self.arches)
        self.backend.lookupChannelFamilies(self.families)
        self.backend.lookupChecksumTypes(self.checksum_types)
        # Fix
        for channel in self.batch:
            self.__postprocessChannel(channel)

    def __postprocessChannel(self, channel):
        if channel.ignored:
            return
        arch = channel['channel_arch']
        if self.arches[arch] is None:
            # Mark it as ignored
            channel.ignored = 1
            raise InvalidArchError(arch, "Unsupported channel arch %s" % arch)
        channel['channel_arch_id'] = self.arches[arch]
        if channel['checksum_type']:
            channel['checksum_type_id'] = self.checksum_types[channel['checksum_type']]
        else:
            channel['checksum_type_id'] = None

        if 'product_name' in channel:
            channel['product_name_id'] = self.backend.lookupProductNames(
                channel['product_name'])
        families = []
        for family in channel['families']:
            # Link back the channel to families
            channel_family_id = self.families[family['label']]

            if channel_family_id is None:
                # Still cant get the id, Unknown channel family
                raise InvalidChannelFamilyError(family['label'])

            families.append({
                'channel_family_id': self.families[family['label']]
            })
        channel['families'] = families
        # Dists
        self.__postprocessChannelMaps(channel, 'dists')
        # release
        self.__postprocessChannelMaps(channel, 'release')

    def __postprocessChannelMaps(self, channel, map):
        if map in channel and channel[map] is not None:
            for dict in channel[map]:
                arch = dict['channel_arch']
                if self.arches[arch] is None:
                    # Mark it as ignored
                    channel.ignored = 1
                    raise InvalidArchError(arch, "Unsupported channel arch %s" % arch)
                dict['channel_arch_id'] = self.arches[arch]

    def submit(self):
        parentChannels = {}
        # Split the batch into null and non-null parent channels
        nullParentBatch = []
        nonNullParentBatch = []
        channel_trusts = []
        for channel in self.batch:
            if channel.ignored:
                continue
            if 'trust_list' in channel and channel['trust_list']:
                self.backend.clearChannelTrusts(channel['label'])
                for trust in channel['trust_list']:
                    if ('org_id' in channel and channel['org_id']
                            and self.backend.orgTrustExists(
                            channel['org_id'], trust['org_trust_id'])):
                        channel_trusts.append(
                            {'channel-label': channel['label'],
                             'org-id': trust['org_trust_id']})
            parent = channel['parent_channel']
            if not parent:
                nullParentBatch.append(channel)
                continue
            nonNullParentBatch.append(channel)
            # And save the parent channel's label in a hash too
            parentChannels[parent] = None
        # Process the easy case of null parent channels
        try:
            self.backend.processChannels(nullParentBatch, True)
        except:
            self.backend.rollback()
            raise

        # Find the parent channels ids
        for channel in nullParentBatch:
            if channel.ignored:
                continue
            label = channel['label']
            if label not in parentChannels:
                # This channel is not a parent channel to anybody
                continue
            parentChannels[label] = channel.id

        # Build an extra hash for the channels with unknown ids
        unknownChannels = {}
        for k, v in list(parentChannels.items()):
            if v is None:
                unknownChannels[k] = None

        # And look them up
        self.backend.lookupChannels(unknownChannels)

        # Copy the ids back into parentChannels, to make life easier
        missingParents = []
        for k, v in list(unknownChannels.items()):
            if v is None:
                missingParents.append(k)
            else:
                parentChannels[k] = v['id']
        if missingParents:
            raise MissingParentChannelError(
                missingParents, "Invalid import, this parents need to be imported: %s" % str(", ".join(missingParents)))

        # Fix up the parent channels
        for channel in nonNullParentBatch:
            parent = channel['parent_channel']
            if parent not in parentChannels:
                # Unknown parent channel
                channel.ignored = 1
                continue
            # Replace the label with the id
            channel['parent_channel'] = parentChannels[parent]

        # And process these channels too
        try:
            self.backend.processChannels(nonNullParentBatch, False)
        except:
            self.backend.rollback()
            raise

        # Process the channel trusts
        if len(channel_trusts) > 0:
            self.backend.processChannelTrusts(channel_trusts)

        # Finally go back and add the products and content sources, if any
        for channel in self.batch:
            if channel.ignored:
                continue

            if ('channel_product' in channel and channel['channel_product']) \
                    or ('product_name' in channel and channel['product_name']):
                self.backend.processChannelProduct(channel)

            self.backend.processChannelContentSources(channel)

        # Sometimes we may want to turn commits off
        if self.will_commit:
            self.backend.commit()


class ChannelFamilyImport(Import):

    def preprocess(self):
        self.__filterCustomChannelFamilies()
        # We have to look up the channels for this channel family first
        self.channels = {}
        for cf in self.batch:
            for c in cf['channels']:
                self.channels[c] = None

    def fix(self):
        self.backend.lookupChannels(self.channels)
        for cf in self.batch:
            channel_ids = cf['channel_ids'] = []
            for c in cf['channels']:
                chash = self.channels[c]
                if chash is None:
                    # Skip
                    continue
                cid = chash['id']
                channel_ids.append(cid)

    def submit(self):
        try:
            self.backend.processChannelFamilies(self.batch)
            self.backend.processChannelFamilyMembers(self.batch)
            self.backend.processChannelFamilyPermissions(self.batch)
        except:
            self.backend.rollback()
            raise
        self.backend.commit()

    def __filterCustomChannelFamilies(self):
        """Filter out private channel families from ISS syncs. WebUI
           creates these for us at the org creation time.
        """
        new_batch = []
        for cf in self.batch:
            if not cf['label'].startswith("private-channel-family"):
                new_batch.append(cf)
        self.batch = new_batch


class DistChannelMapImport(Import):

    def __init__(self, batch, backend):
        Import.__init__(self, batch, backend)
        self.arches = {}
        self.channels = {}

    def preprocess(self):
        # Processes the batch to a form more suitable for database
        # operations
        for dcm in self.batch:
            self.arches[dcm['arch']] = None
            self.channels[dcm['channel']] = None

    def fix(self):
        # Look up arches and channels
        self.backend.lookupChannelArches(self.arches)
        self.backend.lookupChannels(self.channels)
        for dcm in self.batch:
            arch = self.arches[dcm['arch']]
            if arch is None:
                # Invalid arch
                dcm.ignored = 1
                raise InvalidArchError(dcm['arch'],
                                       "Invalid dist_channel_map arch %s" % dcm['arch'])
            channel = self.channels[dcm['channel']]
            if channel is None:
                dcm.ignored = 1
                raise InvalidChannelError(dcm['channel'],
                                          "Invalid dist_channel_map channel %s" % dcm['channel'])
            dcm['arch'] = arch
            dcm['channel_id'] = channel['id']
            dcm['org_id'] = None

    def submit(self):
        try:
            self.backend.processDistChannelMap(self.batch)
        except:
            self.backend.rollback()
            raise
        self.backend.commit()


# for testing only
if __name__ == '__main__':
    import sys
    from spacewalk.server import rhnSQL
    from backendOracle import OracleBackend
    from .importLib import Collection, ChannelFamily, DistChannelMap
    backend = OracleBackend()
    if 1:
        batch = Collection()
        dcms = [
            {
                'os': 'Red Hat Linux',
                'release': '7.2',
                'arch': 'i386',
                'channel': 'redhat-linux-i386-7.2',
            },
            {
                'os': 'Red Hat Linux',
                'release': '6.2',
                'arch': 'i386',
                'channel': 'redhat-linux-i386-6.2',
            },
        ]

        for dcm in dcms:
            x = DistChannelMap()
            x.populate(dcm)
            batch.append(x)
        rhnSQL.initDB()
        backend.init()
        dcmimp = DistChannelMapImport(batch, backend)
        dcmimp.run()
        sys.exit(0)
    if 0:
        batch = Collection()
        families = [
            {
                'name': 'Cisco Linux',
                'label': 'cisco',
                'product_url': 'http://www.redhat.com/products/ADSFASDFASDF',
            },
            {
                'name': 'Misa Linux',
                'label': 'misa',
                'product_url': 'http://people.redhat.com/misa/ASDFASDFASDF',
            },
        ]
        for fam in families:
            cf = ChannelFamily()
            cf.populate(fam)
            batch.append(cf)
        rhnSQL.initDB()
        backend.init()
        cfimp = ChannelFamilyImport(batch, backend)
        cfimp.run()
        sys.exit(0)
   07070100000185000081B40000000000000000000000015FBBE8EE000007F7000000000000000000000000000000000000003B00000000spacewalk-backend/server/importlib/contentSourcesImport.py    #
# Copyright (c) 2016--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

from .importLib import Import, Channel
from spacewalk.server.rhnChannel import channel_info


class ContentSourcesImport(Import):

    def __init__(self, batch, backend):
        Import.__init__(self, batch, backend)
        self.channels_to_link = {}

    def preprocess(self):
        for content_source in self.batch:
            # Link back content sources to channel objects to subscribe them to existing channels right after import
            if 'channels' in content_source and content_source['channels'] is not None:
                for channel_label in content_source['channels']:
                    if channel_label not in self.channels_to_link:
                        db_channel = channel_info(channel_label)
                        channel_obj = Channel()
                        channel_obj.id = db_channel['id']
                        channel_obj['content-sources'] = []
                        self.channels_to_link[channel_label] = channel_obj
                    self.channels_to_link[channel_label]['content-sources'].append(content_source)

    def fix(self):
        pass

    def submit(self):
        try:
            self.backend.processContentSources(self.batch)
            for channel in list(self.channels_to_link.values()):
                self.backend.processChannelContentSources(channel)
        except:
            self.backend.rollback()
            raise
        self.backend.commit()
 07070100000186000081B40000000000000000000000015FBBE8EE00001E4D000000000000000000000000000000000000003100000000spacewalk-backend/server/importlib/debPackage.py  #
# Copyright (c) 2010--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Converts headers to the intermediate format
#

from . import headerSource
import time
from .importLib import Channel
from .backendLib import gmtime, localtime
from uyuni.common.usix import IntType, UnicodeType
from uyuni.common.stringutils import to_string


class debBinaryPackage(headerSource.rpmBinaryPackage):

    def __init__(self, header, size, checksum_type, checksum, path=None, org_id=None,
                 channels=[]):

        headerSource.rpmBinaryPackage.__init__(self)

        self.tagMap = headerSource.rpmBinaryPackage.tagMap.copy()

        # Remove already-mapped tags
        self._already_mapped = [
            'rpm_version', 'payload_size', 'payload_format',
            'package_group', 'build_time', 'build_host'
        ]

        for t in self._already_mapped:
            if t in self.tagMap:
                del self.tagMap[t]

        # XXX is seems to me that this is the place that 'source_rpm' is getting
        # set
        for f in list(self.keys()):
            field = f
            if f in self.tagMap:
                field = self.tagMap[f]
                if not field:
                    # Unsupported
                    continue

            # get the db field value from the header
            val = header[field]
            if f == 'build_time':
                if val is not None and isinstance(val, IntType):
                    # A UNIX timestamp
                    val = gmtime(val)
            elif val:
                # Convert to strings
                if isinstance(val, UnicodeType):
                    val = to_string(val)
                else:
                    val = str(val)
            elif val == []:
                val = None
            self[f] = val

        self['package_size'] = size
        self['checksum_type'] = checksum_type
        self['checksum'] = checksum
        self['path'] = path
        self['org_id'] = org_id
        self['header_start'] = None
        self['header_end'] = None
        self['last_modified'] = localtime(time.time())
        if self['sigmd5']:
            self['sigchecksum_type'] = 'md5'
            self['sigchecksum'] = self['sigmd5']
        del(self['sigmd5'])

        # Fix some of the information up
        vendor = self['vendor']
        if vendor is None:
            self['vendor'] = 'Debian'
        payloadFormat = self['payload_format']
        if payloadFormat is None:
            self['payload_format'] = 'ar'
        if self['payload_size'] is None:
            self['payload_size'] = 0

        # Populate file information
        self._populateFiles(header)
        # Populate dependency information
        self._populateDependencyInformation(header)
        # Populate changelogs
        self._populateChangeLog(header)
        # Channels
        self._populateChannels(channels)
        # populate extraTags from headers not in already mapped fields
        self._populateExtraTags(header)

        self['source_rpm'] = None

        group = self.get('package_group', '')
        if group == '' or group is None:
            self['package_group'] = 'NoGroup'

    def _populateFiles(self, header):
        files = []
        # for f in header.get('files', []):
        #    fc = headerSource.rpmFile()
        #    fc.populate(f)
        #    files.append(fc)
        self['files'] = files

    def _populateDependencyInformation(self, header):
        mapping = {
            'provides': headerSource.rpmProvides,
            'requires': headerSource.rpmRequires,
            'conflicts': headerSource.rpmConflicts,
            'obsoletes': headerSource.rpmObsoletes,
            'suggests': headerSource.rpmSuggests,
            'recommends': headerSource.rpmRecommends,
            'breaks': headerSource.rpmBreaks,
            'predepends': headerSource.rpmPredepends,
        }
        for k, dclass in list(mapping.items()):
            l = []
            values = header[k]
            if values is not None:
                val = values.split(', ')  # split packages
                i = 0
                for v in val:
                    relation = 0
                    version = ''
                    if '|' in v:
                        # TODO: store alternative-package-names semantically someday
                        name = v + '_' + str(i)
                    else:
                        nv = v.split('(')
                        name = nv[0] + '_' + str(i)
                        if (len(nv) > 1):
                            version = nv[1].rstrip(')')
                            if version:
                                while version.startswith(("<", ">", "=")):
                                    if version.startswith("<"):
                                        relation |= 2
                                    if version.startswith(">"):
                                        relation |= 4
                                    if version.startswith("="):
                                        relation |= 8
                                    version = version[1:]
                    hash = {'name': name, 'version': version, 'flags': relation}
                    finst = dclass()
                    finst.populate(hash)
                    l.append(finst)
                    i += 1
            self[k] = l

    def _populateChangeLog(self, header):
        l = []
        # for cinfo in header.get('changelog', []):
        #    cinst = headerSource.rpmChangeLog()
        #    cinst.populate(cinfo)
        #    l.append(cinst)
        self['changelog'] = l

    def _populateChannels(self, channels):
        l = []
        for channel in channels:
            dict = {'label': channel}
            obj = Channel()
            obj.populate(dict)
            l.append(obj)
        self['channels'] = l

    def _populateExtraTags(self, header):
        already_processed = ['arch',
                            'name',
                            'summary',
                            'epoch',
                            'version',
                            'release',
                            'payload_size',
                            'vendor',
                            'package_group',
                            'requires',
                            'obsoletes',
                            'predepends',
                            'package',
                            'architecture',
                            'description',
                            'maintainer',
                            'section',
                            'version',
                            'depends',
                            'provides',
                            'conflicts',
                            'replaces',
                            'recommends',
                            'suggests',
                            'breaks',
                            'pre-depends',
                            'installed-size',
                            ]
        l = []
        for k, v in header.items():
            if k.lower() not in already_processed and v:
                l.append({'name': k, 'value': v})

        self['extra_tags'] = l
   07070100000187000081B40000000000000000000000015FBBE8EE000010C4000000000000000000000000000000000000002B00000000spacewalk-backend/server/importlib/doc.txt    There are 3 layers of data munging happening in the import code.

importLib.py has a representation of each high-level object (ChannelFamily,
Channel, Errata, Package etc). The representation defines the properties and
the types for each of those properties. This should be really _the_ data model
for us.

backendOracle.py has an Oracle representation of that data model, i.e. a
mapping to the table structures we chose to use. Some conversions may be
necessary to go from one to the other. It also defines the primary keys for
each of the tables, necessary to perform the lookups properly.

Also, each table has a severityHash dictionary, describing how "fatal" a
difference in one of those fields is. I will explain this later.

The third layer (but it is really the first if you think about how stuff gets
called) is:

<foo><object>Source.py

bugzillaErrataSource.py, headerSource.py etc.

This layer is responsible for reading the data from the source to the
importLib data object.

The business logic is supposed to happen in the *Import.py files, while all
the database access should be in backend.py (but I don't think it's very
consistent).


In general, a data object (like a Package) will span across multiple tables.
In the case of a package, it spans over rhnPackage,
rhnPackage{Provides,Requires,Conflicts,Obsoletes,Files}, rhnChannelPackage
(when channel subscription is requested) etc. Therefore, we needed a way to
generically persist an object in the database using the nested table
structures we have in the relational DB.

One problem showing up is, how do you reconcile differences?
For instance, most of our tables have a "created" and "modified" field (and
some of them have a "last_modified" field, to track the change of the object
itself, instead of the row in the table). While it is important to control the
data in the last_modified field, it doesn't necessarily participate in the
comparison between an incoming object and its current representation in the
database (if one exists).

So, in rough lines, the code will:
    - read the data from the data source and convert it into the proper object
    - using the object's primary key attributes, look it up in the database
    - if the object doesn't exist, it initializes all the IDs for the primary
      keys from sequences, and proceeds to insert it into the DB
    - if the object does exist, it will check to see how different it is from
      the incoming one.

Each "import" process has an uploadForce and an ignoreUploaded flag associated
with it. These are all documented in __processObjectCollection__ (and some of
the documentation exists there already).

The uploadForce is the amount of karma you have in order to go over
differences on fields with various severity levels. Looking at severityHash in
backendOracle.py, you'll notice several values for severities:
    0 means "if things are different in this field, just ignore them"
    1 means "almost the same, difference can be ignored" (only used for 
        packages and only for the path). Two packages that are identical
        except for the path are identical, but sometimes you may still want to
        fix the path.
    2 means "same object, different signature" (only for packages too). If
      build_time and build_host are the same (as well as everything else except
      for checksum and package_size), then the package was resigned.
    3 means "everything the same, except build_time and build_host". Probably
      package recompiled.
    4 (default) means something critical changed.

You'll notice that last_modified is 0.5, I think I needed it that way for a
reason I don't quite remember - probably in the satellite sync code.

As the comments in __processObjectCollection suggest, the diff object
generated as a result of a comparison will draw its severity as the max of the
severities in each field.

The upload force has to be greater than or equal to the severity diff.

One other thing that proved to be a major performance factor was multi-row
inserts. You will notice processObjectCollection returns a DML object, which
has the changes to perform on each table. The changes will be performed one
table at the time, using executemany (mapped into Oracle's OCI interface to
perform bulk inserts/deletes/updates).
07070100000188000081B40000000000000000000000015FBBE8EE000004B1000000000000000000000000000000000000003200000000spacewalk-backend/server/importlib/errataCache.py #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Adds tasks to be executed by the errata cache daemon
#

from spacewalk.server import rhnSQL


def schedule_errata_cache_update(channels):
    # If no channels were supplied, exit here to shortcut parsing the query
    if not channels:
        return
    h = rhnSQL.prepare("""
        insert into rhnTaskQueue
       (org_id, task_name, task_data, priority, earliest)
       select coalesce(c.org_id, 1), 'update_errata_cache_by_channel', c.id, 0, current_timestamp
       from rhnChannel c
       where c.label = :label
    """)
    h.executemany(label=channels)
    rhnSQL.commit()
   07070100000189000081B40000000000000000000000015FBBE8EE000035B3000000000000000000000000000000000000003300000000spacewalk-backend/server/importlib/errataImport.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Errata import process
#

from spacewalk.common.rhnException import rhnFault
from .importLib import GenericPackageImport
from spacewalk.satellite_tools.syncLib import log


class ErrataImport(GenericPackageImport):

    def __init__(self, batch, backend, queue_timeout=600):
        GenericPackageImport.__init__(self, batch, backend)
        # A composite key of the name, evr, arch plus org_id
        self.packages = {}
        self.ignoreMissing = 0
        self.cve = {}
        self.queue_timeout = queue_timeout
        self.file_types = {}

    def preprocess(self):
        # Processes the package batch to a form more suitable for database
        # operations

        # We use this to avoid having the same erratum pushed multiple times
        advisories = {}
        errata_hash = {}

        for errata in self.batch:
            advisory = errata['advisory_name']
            release = errata['advisory_rel']
            errata_hash["%s%s" % (advisory, release)] = errata
            if advisory in advisories:
                if int(release) < int(advisories[advisory]):
                    # Seen a newer one already
                    errata.ignored = 1
                    continue
                else:
                    # if this release is higher
                    # we have to ignore the older one!
                    errata_hash["%s%s" % (advisory, advisories[advisory])].ignored = 1
            advisories[advisory] = release
            self._preprocessErratum(errata)
            self._preprocessErratumCVE(errata)
            self._preprocessErratumFiles(errata)
            self._preprocessErratumFileChannels(errata)

    def _preprocessErratum(self, errata):
        # Process packages
        for package in errata['packages']:
            self._processPackage(package)

        # Process channels
        channelHash = {}
        for channel in errata['channels']:
            channelName = channel['label']
            channelHash[channelName] = channel
            self.channels[channelName] = None
        # Replace the channel list with the unique one
        errata['channels'] = list(channelHash.values())

    def _preprocessErratumCVE(self, erratum):
        # Build the CVE dictionary
        # FIXME: this if decision is here to deal with missing cve data.
        #        fix later.
        if not erratum['cve']:
            erratum['cve'] = []
        for cve in erratum['cve']:
            self.cve[cve] = None

    def _preprocessErratumFiles(self, erratum):
        for f in (erratum['files'] or []):
            checksumTuple = (f['checksum_type'], f['checksum'])
            if checksumTuple not in self.checksums:
                self.checksums[checksumTuple] = None

            if f['file_type'] == 'RPM':
                package = f.get('pkgobj')
                if package:
                    self._processPackage(package)
                    nevrao = tuple(get_nevrao(package))
                    self.packages[nevrao] = package
            # Oval errata files need to be removed from the import for now.
            # This is to make sure non-oval capable satellites won't be importing
            # the oval data from an oval-enabled dump.
            elif f['file_type'] == 'OVAL':
                erratum['files'].remove(f)
            # elif f['file_type'] == 'SRPM':
            #    # XXX misa: do something here
            #    pass

    def _preprocessErratumFileChannels(self, erratum):
        for f in (erratum['files'] or []):
            for channel_name in (f.get('channel_list') or []):
                self.channels[channel_name] = None

    def fix(self):
        self.backend.lookupChannels(self.channels)
        self.backend.lookupErrataFileTypes(self.file_types)
        for erratum in self.batch:
            for ef in erratum['files']:
                eft = ef['file_type']
                if eft not in self.file_types:
                    raise Exception("Unknown file type %s" % eft)
                ef['type'] = self.file_types[eft]

        self._fixCVE()

        self.backend.lookupPackageNames(self.names)
        self.backend.lookupEVRs(self.evrs)
        self.backend.lookupChecksums(self.checksums)
        self.backend.lookupPackageArches(self.package_arches)

        for erratum in self.batch:
            if erratum.ignored:
                # Skip it
                continue
            self._fix_erratum_channels(erratum)
            self._fix_erratum_packages_lookup(erratum)
            self._fix_erratum_file_packages(erratum)
            # fix severity stuff
            self._fix_erratum_severity(erratum)
            # fix oval info to populate the relevant dbtables
            self._fix_erratum_oval_info(erratum)

        self.backend.lookupPackages(list(self.packages.values()), self.checksums, self.ignoreMissing)
        for erratum in self.batch:
            if erratum.ignored:
                # Skip it
                continue
            self._fix_erratum_packages(erratum)
            self._fix_erratum_file_channels(erratum)

        # remove erratas that have been ignored
        ignored_erratas = list([x for x in self.batch if x.ignored])
        if len(ignored_erratas) > 0:
            log(0, "Ignoring %d old, superseded erratas" % len(ignored_erratas))
            self.batch = list([x for x in self.batch if not x.ignored])

    def _fixCVE(self):
        # Look up and insert the missing CVE's
        self.backend.processCVEs(self.cve)
        # Fix the CVE stuff
        for erratum in self.batch:
            if erratum.ignored:
                continue
            cves = []
            for cve in erratum['cve']:
                entry = {
                    'cve_id': self.cve[cve],
                }
                cves.append(entry)
            erratum['cve'] = cves

    def _fix_files(self):
        rpm_files = []
        srpm_files = []
        oval_files = []
        channel_files = []
        for erratum in self.batch:
            if erratum.ignored:
                continue
            for file in erratum['files']:
                file_type = file['file_type']
                file_id = file['id']
                package_id = file.get('package_id')
                if package_id is not None:
                    pkg = {
                        'errata_file_id': file_id,
                        'package_id': package_id,
                    }
                    if file_type == 'RPM':
                        rpm_files.append(pkg)
                    elif file_type == 'SRPM':
                        srpm_files.append(pkg)
                    elif file_type == 'OVAL':
                        pkg = {
                            'errata_id': file_id,
                            'filename': file['filename'],
                        }
                        oval_files.append(pkg)
                for channel_id in file['channels']:
                    channel_files.append({
                        'errata_file_id': file_id,
                        'channel_id': channel_id,
                    })
        self.backend._do_diff(rpm_files, 'rhnErrataFilePackage',
                              ['errata_file_id', 'package_id'], [])
        self.backend._do_diff(srpm_files, 'rhnErrataFilePackageSource',
                              ['errata_file_id', 'package_id'], [])
        self.backend._do_diff(channel_files, 'rhnErrataFileChannel',
                              ['errata_file_id', 'channel_id'], [])
        self.backend._do_diff(oval_files, 'rhnErrataFile',
                              ['errata_id', 'filename'], [])

    def submit(self):
        try:
            dml = self.backend.processErrata(self.batch)
            self.backend.update_channels_affected_by_errata(dml)
            self._fix_files()
            self.backend.queue_errata(self.batch, self.queue_timeout)
        except:
            self.backend.rollback()
            raise
        self.backend.commit()

    def _fix_erratum_channels(self, erratum):
        # Fix the erratum's channels
        channels = {}
        for ch in erratum['channels']:
            label = ch['label']
            channel = self.channels[label]
            if not channel:
                # Invalid channel
                if self.ignoreMissing:
                    # Ignore missing channel
                    continue
                # XXX Raising an exception here; it may be too harsh though
                erratum.ignored = 1
                raise Exception("XXX Invalid channel %s" % label)

            channels[channel['id']] = None

        erratum['channels'] = [{'channel_id': x} for x in list(channels.keys())]

    def _fix_erratum_packages_lookup(self, erratum):
        # To make the packages unique
        packageHash = {}
        for package in erratum['packages']:
            if package.ignored:
                # Skip it
                continue

            self._postprocessPackageNEVRA(package)

            # Check the uniqueness
            nevrao = tuple(get_nevrao(package))

            if nevrao in packageHash:
                # Been there already
                package.ignored = 1
                continue

            package['nevrao'] = nevrao

            # And put this package both in the local and in the global hash
            packageHash[nevrao] = package
            self.packages[nevrao] = package

        erratum['packages'] = packageHash

    def _fix_erratum_file_packages(self, erratum):
        for ef in erratum['files']:
            ef['checksum_id'] = self.checksums[(ef['checksum_type'], ef['checksum'])]
            if ef['file_type'] == 'RPM':
                package = ef.get('pkgobj')
                if not package:
                    continue
                self._postprocessPackageNEVRA(package)
            # XXX fix source rpms

    def _fix_erratum_packages(self, erratum):
        pkgs = []
        # This is a workaround; It would be much straightforward to use
        # 'package in erratum['packages'].values()' here. But for (to me) unknown
        # reason it sometimes has package.id == None which makes whole import fail.
        # And self.packages[nevrao].id contains always right value.
        for nevrao in list(erratum['packages'].keys()):
            package = self.packages[nevrao]
            if package.ignored:
                # Ignore this package
                continue
            pkgs.append({'package_id': package.id})

        erratum['packages'] = pkgs

        for ef in (erratum['files'] or []):
            if ef['file_type'] == 'RPM':
                package = ef.get('pkgobj')
                if package:
                    ef['package_id'] = package.id

    def _fix_erratum_file_channels(self, erratum):
        for f in (erratum['files'] or []):
            channels = []
            for c in (f.get('channel_list') or []):
                if not self.channels[c]:
                    # Unsupported channel
                    # XXX misa: should we gripe loudly?
                    continue
                channels.append(self.channels[c]['id'])
            f['channels'] = channels

    def _fix_erratum_severity(self, erratum):
        """sets the severity-id to insert into rhnErrata
        """
	# Re-check for severity, it could be a RHBA or RHEA
	# If RHBA/RHEA severity is irrelevant and posibly
	# not included or it could not be hosted
        severity = None

        if 'security_impact' in erratum:
            severity = erratum['security_impact']
        elif 'severity' in erratum:
            severity = erratum['severity']

        if severity:
            erratum['severity_id'] = self.backend.lookupErrataSeverityId(erratum)

    def _fix_erratum_oval_info(self, erratum):
        """
        manipulate oval package info to populate in the
        appropriate fields in the db tables.

        """
        import os

        if 'oval_info' not in erratum:
            return

        for oval_file in erratum['oval_info']:
            if has_suffix(oval_file['filename'], '.xml'):
                eft = oval_file['file_type'] = 'OVAL'
                if eft not in self.file_types:
                    raise Exception("Unknown file type %s" % eft)
                oval_file['type'] = self.file_types[eft]

            # XXX: stubs incase we need to associate them to channels/packages
            oval_file['channel_list'] = []
            oval_file['channels'] = []
            oval_file['package_id'] = None

            if not os.path.isfile(oval_file['filename']):
                # Don't bother to copy the package
                raise rhnFault(47,
                               "Oval file %s not found on the server. " % oval_file['filename'],
                               explain=0)

            # add the oval info into the files field to get
            # populated into db
            erratum['files'].append(oval_file)


def get_nevrao(package):
    return list(map(lambda x, d=package: d[x],
               ['name', 'epoch', 'version', 'release', 'arch', 'org_id', 'checksum_type', 'checksum']))


def has_suffix(s, suffix):
    return s[-len(suffix):] == suffix
 0707010000018A000081B40000000000000000000000015FBBE8EE0000442A000000000000000000000000000000000000003300000000spacewalk-backend/server/importlib/headerSource.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Converts headers to the intermediate format
#

import time
from .importLib import File, Dependency, ChangeLog, Channel, \
    IncompletePackage, Package, SourcePackage
from .backendLib import gmtime, localtime
from uyuni.common.usix import ListType, TupleType, IntType, LongType, StringType, UnicodeType
from uyuni.common.stringutils import to_string
from spacewalk.common.rhnLog import log_debug


class rpmPackage(IncompletePackage):
    # Various mappings
    tagMap = {
        # Ignoring these tags
        'last_modified': None,
        # We set them differently
        'checksum': None,
        'checksum_type': None,
        'checksum_list': None,
        'sigchecksum': None,
        'sigchecksum_type': None,
    }

    def populate(self, header, size, checksum_type, checksum, path=None, org_id=None,
                 header_start=None, header_end=None, channels=[]):

        # XXX is seems to me that this is the place that 'source_rpm' is getting
        # set
        for f in list(self.keys()):
            field = f
            if f in self.tagMap:
                field = self.tagMap[f]
                if not field:
                    # Unsupported
                    continue

            # get the db field value from the header
            val = header[field]
            if f == 'build_time':
                if type(val) in (IntType, LongType):
                    # A UNIX timestamp
                    val = gmtime(val)
            if f == 'payload_size':
                if val is None:
                    # use longarchivesize header field for rpms with archive > 4GB
                    if ('longarchivesize' in header) and (header['longarchivesize'] > 0):
                        val = header['longarchivesize']
                elif val < 0:
                    # workaround for older rpms where signed
                    # attributes go negative for size > 2G
                    val = LongType(val) + 2 ** 32
            elif val:
                # Convert to strings
                if isinstance(val, UnicodeType):
                    val = to_string(val)
                else:
                    val = str(val)
            elif val == []:
                val = None
            self[f] = val

        self['package_size'] = size
        self['checksum_type'] = checksum_type
        self['checksum'] = checksum
        self['checksums'] = {checksum_type: checksum}
        self['path'] = path
        self['org_id'] = org_id
        self['header_start'] = header_start
        self['header_end'] = header_end
        self['last_modified'] = localtime(time.time())
        if 'sigmd5' in self:
            if self['sigmd5']:
                self['sigchecksum_type'] = 'md5'
                self['sigchecksum'] = self['sigmd5']
            del(self['sigmd5'])

        # Fix some of the information up
        vendor = self['vendor'] or None
        payloadFormat = self['payload_format']
        if payloadFormat is None:
            self['payload_format'] = 'cpio'
        if self['payload_size'] is None:
            self['payload_size'] = 0
        # Extra tags
        self._populateExtraTags(header)

        return self

    def _populateExtraTags(self, header):
        """
        Populate extra tags. Currently only "modularitylabel".
        """
        mlabel = header.modularity_label()
        if mlabel is not None:
            self["extra_tags"] = [
                {"name": "modularitylabel", "value": mlabel}
            ]


class rpmBinaryPackage(Package, rpmPackage):
    # Various mappings
    tagMap = rpmPackage.tagMap.copy()
    tagMap.update({
        'package_group': 'group',
        'rpm_version': 'rpmversion',
        'payload_size': 'archivesize',
        'installed_size': 'size',
        'payload_format': 'payloadformat',
        'build_host': 'buildhost',
        'build_time': 'buildtime',
        'source_rpm': 'sourcerpm',
        # Arrays: require a different mapping
        'requires': None,
        'provides': None,
        'conflicts': None,
        'obsoletes': None,
        'suggests': None,
        'supplements': None,
        'enhances': None,
        'recommends': None,
        'breaks': None,
        'predepends': None,
        'files': None,
        'changelog': None,
        'channels': None,
        # We set them differently
        'package_size': None,
        'org_id': None,
        'md5sum': None,
        'path': None,
        'header_start': None,
        'header_end': None,
        # Unsupported
        'sigpgp': None,
        'siggpg': None,
        'package_id': None,
        'product_files': None,
        'eulas': None,
        'extra_tags': None,
    })

    def populate(self, header, size, checksum_type, checksum, path=None, org_id=None,
                 header_start=None, header_end=None, channels=[]):

        rpmPackage.populate(self, header, size, checksum_type, checksum, path, org_id,
                            header_start, header_end)

        # bz 1218762: if package group is None
        if self['package_group'] is None:
            self['package_group'] = "Unspecified"

        # workaround for bug in rpm-python <= 4.4.2.3-27.el5 (BZ# 783451)
        self['package_group'] = self['package_group'].rstrip()
        # Populate file information
        self._populateFiles(header)
        # Populate dependency information
        self._populateDependencyInformation(header)
        # Populate changelogs
        self._populateChangeLog(header)
        # Channels
        self._populateChannels(channels)

    def _populateFiles(self, header):
        self._populateTag(header, 'files', rpmFile)

    def _populateDependencyInformation(self, header):
        mapping = {
            'provides'  : rpmProvides,
            'requires'  : rpmRequires,
            'conflicts' : rpmConflicts,
            'obsoletes' : rpmObsoletes,
            'breaks'    : rpmBreaks,
            'predepends': rpmPredepends,
        }

        old_weak_deps_mapping = {
            'supplements' : rpmOldSupplements,
            'enhances'  : rpmOldEnhances,
            'suggests'  : rpmOldSuggests,
            'recommends'  : rpmOldRecommends,
        }

        new_weak_deps_mapping = {
            'supplements' : rpmSupplements,
            'enhances'  : rpmEnhances,
            'suggests'  : rpmSuggests,
            'recommends': rpmRecommends,
        }

        for k, v in list(mapping.items()):
            self._populateTag(header, k, v)
        for k, v in list(old_weak_deps_mapping.items()):
            self._populateTag(header, k, v)
        for k, v in list(new_weak_deps_mapping.items()):
            self._populateTag(header, k, v)

    def _populateChangeLog(self, header):
        self._populateTag(header, 'changelog', rpmChangeLog)

    def _populateChannels(self, channels):
        l = []
        for channel in channels:
            dict = {'label': channel}
            obj = Channel()
            obj.populate(dict)
            l.append(obj)
        self['channels'] = l

    def _populateTag(self, header, tag, Class):
        """
        Populates a tag with a list of Class instances, getting the
        information from a header
        """
        # First fix rpm's brokenness - sometimes singe-elements lists are
        # actually single elements
        fix = {}
        itemcount = 0

        for f, rf in list(Class.tagMap.items()):
            v = sanitizeList(header[rf])
            ic = len(v)
            if not itemcount or ic < itemcount:
                itemcount = ic
            fix[f] = v

        # Now create the array of objects
        if self[tag] is None:
            self[tag] = []

        unique_deps = []
        for i in range(itemcount):
            hash = {}
            for k, v in list(fix.items()):
                # bugzilla 426963: fix for rpm v3 obsoletes header with
                # empty version and flags values
                if not len(v) and k == 'version':
                    hash[k] = ''
                elif not len(v) and k == 'flags':
                    hash[k] = 0
                else:
                    hash[k] = v[i]

            # for the old weak dependency tags
            # RPMSENSE_STRONG(1<<27) indicate recommends; if not set it is suggests only
            if Class in [rpmOldRecommends, rpmOldSupplements, rpmOldSuggests, rpmOldEnhances]:
                if tag in ['recommends', 'supplements'] and not(hash['flags'] & (1 << 27)):
                    continue
                if tag in ['suggests', 'enhances'] and (hash['flags'] & (1 << 27)):
                    continue
            # Create a file
            obj = Class()
            # Fedora 10+ rpms have duplicate provides deps,
            # Lets clean em up before db inserts.
            if tag in ['requires', 'provides', 'obsoletes', 'conflicts', 'recommends', 'suggests', 'supplements', 'enhances', 'breaks', 'predepends']:
                if not len(hash['name']):
                    continue
                dep_nv = (hash['name'], hash['version'], hash['flags'])

                if dep_nv not in unique_deps:
                    unique_deps.append(dep_nv)
                    obj.populate(hash)
                    self[tag].append(obj)
                else:
                    # duplicate dep, ignore
                    continue
            else:
                if tag == 'files':
                    hash['checksum_type'] = header.checksum_type()
                obj.populate(hash)
                self[tag].append(obj)


class rpmSourcePackage(SourcePackage, rpmPackage):
    tagMap = rpmPackage.tagMap.copy()
    tagMap.update({
        'package_group': 'group',
        'rpm_version': 'rpmversion',
        'payload_size': 'archivesize',
        'build_host': 'buildhost',
        'build_time': 'buildtime',
        'source_rpm': 'sourcerpm',
        # Arrays: require a different mapping
        # We set them differently
        'package_size': None,
        'org_id': None,
        'md5sum': None,
        'path': None,
        # Unsupported
        'payload_format': None,
        'channels': None,
        'package_id': None,
        'extra_tags': None,
    })

    def populate(self, header, size, checksum_type, checksum, path=None, org_id=None,
                 header_start=None, header_end=None, channels=[]):
        rpmPackage.populate(self, header, size, checksum_type, checksum, path, org_id,
                            header_start, header_end)
        # bz 1218762: if package group is None
        if self['package_group'] is None:
            self['package_group'] = "Unspecified"

        nvr = []
        # workaround for bug in rpm-python <= 4.4.2.3-27.el5 (BZ# 783451)
        self['package_group'] = self['package_group'].rstrip()
        # Fill in source_rpm
        for tag in ['name', 'version', 'release']:
            nvr.append(header[tag])

        # 5/13/05 wregglej - 154248 If 1051 is in the list of keys in the header,
        # the package is a nosrc package and needs to be saved as such.
        if 1051 in list(header.keys()):
            self['source_rpm'] = "%s-%s-%s.nosrc.rpm" % tuple(nvr)
        else:
            self['source_rpm'] = "%s-%s-%s.src.rpm" % tuple(nvr)

        # Convert sigchecksum to ASCII
        self['sigchecksum_type'] = 'md5'
        self['sigchecksum'] = ''.join(["%02x" % ord(x) for x in self['sigchecksum']])


class rpmFile(File, ChangeLog):
    # Mapping from the attribute's names to rpm tags
    tagMap = {
        'name': 'filenames',
        'device': 'filedevices',
        'inode': 'fileinodes',
        'file_mode': 'filemodes',
        'username': 'fileusername',
        'groupname': 'filegroupname',
        'rdev': 'filerdevs',
        'file_size': 'filesizes',
        'mtime': 'filemtimes',
        'filedigest': 'filemd5s',     # FILEMD5S is a pre-rpm4.6 name for FILEDIGESTS
        # we have to use it for compatibility reason
        'linkto': 'filelinktos',
        'flags': 'fileflags',
        'verifyflags': 'fileverifyflags',
        'lang': 'filelangs',
    }

    def populate(self, hash):
        ChangeLog.populate(self, hash)
        # Fix the time
        tm = self['mtime']
        if type(tm) in (IntType, LongType):
            # A UNIX timestamp
            self['mtime'] = localtime(tm)
        if type(self['filedigest']) == StringType:
            self['checksum'] = self['filedigest']
            del(self['filedigest'])


class rpmProvides(Dependency):
    # More mappings
    tagMap = {
        'name': 'provides',
        'version': 'provideversion',
        'flags': 'provideflags',
    }


class rpmRequires(Dependency):
    # More mappings
    tagMap = {
        'name': 'requirename',
        'version': 'requireversion',
        'flags': 'requireflags',
    }

class rpmOldSuggests(Dependency):
    # More mappings
    tagMap = {
        'name': 1156,  # 'suggestsname',
        'version': 1157,  # 'suggestsversion',
        'flags': 1158,  # 'suggestsflags',
    }

class rpmSuggests(Dependency):
    # More mappings
    tagMap = {
        'name'      : 5049, #'suggestsname',
        'version'   : 5050, #'suggestsversion',
        'flags'     : 5051, #'suggestsflags',
    }

class rpmOldRecommends(Dependency):
    # More mappings
    tagMap = {
        'name'      : 1156, #'recommendsname',
        'version'   : 1157, #'recommendsversion',
        'flags'     : 1158, #'recommendsflags',
    }

class rpmRecommends(Dependency):
    # More mappings
    tagMap = {
        'name'      : 5046, #'recommendsname',
        'version'   : 5047, #'recommendsversion',
        'flags'     : 5048, #'recommendsflags',
    }

class rpmOldSupplements(Dependency):
    # More mappings
    tagMap = {
        'name'      : 1159, #'supplementsname',
        'version'   : 1160, #'supplementsversion',
        'flags'     : 1161, #'supplementsflags',
    }

class rpmSupplements(Dependency):
    # More mappings
    tagMap = {
        'name'      : 5052, #'supplementsname',
        'version'   : 5053, #'supplementsversion',
        'flags'     : 5054, #'supplementsflags',
    }

class rpmOldEnhances(Dependency):
    # More mappings
    tagMap = {
        'name'      : 1159, #'enhancesname',
        'version'   : 1160, #'enhancesversion',
        'flags'     : 1161, #'enhancesflags',
    }

class rpmEnhances(Dependency):
    # More mappings
    tagMap = {
        'name'      : 5055, #'enhancesname',
        'version'   : 5056, #'enhancesversion',
        'flags'     : 5057, #'enhancesflags',
    }

class rpmConflicts(Dependency):
    # More mappings
    tagMap = {
        'name': 'conflictname',
        'version': 'conflictversion',
        'flags': 'conflictflags',
    }


class rpmObsoletes(Dependency):
    # More mappings
    tagMap = {
        'name': 'obsoletename',
        'version': 'obsoleteversion',
        'flags': 'obsoleteflags',
    }


class rpmBreaks(Dependency):
    # More mappings
    tagMap = {
        'name':  1159,  # 'enhancesname'
        'version':  1160,  # 'enhancesversion'
        'flags':  1161,  # 'enhancesflags'
    }


class rpmPredepends(Dependency):
    # More mappings
    tagMap = {
        'name':  1159,  # 'enhancesname'
        'version':  1160,  # 'enhancesversion'
        'flags':  1161,  # 'enhancesflags'
    }


class rpmChangeLog(ChangeLog):
    tagMap = {
        'name': 'changelogname',
        'text': 'changelogtext',
        'time': 'changelogtime',
    }

    def populate(self, hash):
        ChangeLog.populate(self, hash)
        # Fix the time
        tm = self['time']
        if type(tm) in (IntType, LongType):
            # A UNIX timestamp
            self['time'] = localtime(tm)
        # In changelog, data is either in UTF-8, or in any other
        # undetermined encoding. Assume ISO-Latin-1 if not UTF-8.
        for i in ('text', 'name'):
            if type(self[i]) == bytes:
                try:
                    self[i] = self[i].encode("utf-8")
                except:
                    self[i] = self[i].encode("iso-8859-1")


def sanitizeList(l):
    if l is None:
        return []
    if type(l) in (ListType, TupleType):
        return l
    return [l]


def createPackage(header, size, checksum_type, checksum, relpath, org_id, header_start,
                  header_end, channels):
    """
    Returns a populated instance of rpmBinaryPackage or rpmSourcePackage
    """
    if header.is_source:
        log_debug(4, "Creating source package")
        p = rpmSourcePackage()
    else:
        log_debug(4, "Creating package")
        p = rpmBinaryPackage()

    # bug #524231 - we need to call fullFilelist() for RPM v3 file list
    # to expand correctly
    header.hdr.fullFilelist()
    p.populate(header, size, checksum_type, checksum, relpath, org_id, header_start, header_end,
               channels)
    return p
  0707010000018B000081B40000000000000000000000015FBBE8EE00006C26000000000000000000000000000000000000003000000000spacewalk-backend/server/importlib/importLib.py   #
# Copyright (c) 2008--2018 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Common data structures used throughout the import code
#

import os
import shutil
from uyuni.common.usix import IntType, StringType, InstanceType
try:
    #  python 2
    from UserDict import UserDict
    from UserList import UserList
except ImportError:
    #  python3
    from collections import UserList, UserDict

from uyuni.common.checksum import getFileChecksum
from uyuni.common.fileutils import createPath
from spacewalk.common.rhnConfig import CFG

# no-op class, used to define the type of an attribute


class DateType:
    pass


# An Item is just an extension for a dictionary
class Item(dict):

    """
    First level object, that stores information in a hash-like structure
    """

    def __init__(self, attributes=None):
        dict.__init__(self, attributes)

    def populate(self, hash):
        self.update(hash)
        return self

    def __repr__(self):
        return "[<%s instance; attributes=%s]" % (str(self.__class__),
                                                  dict.__repr__(self))

# BaseInformation is an Item with a couple of other features (an id, an ignored
# flag, diff information)


class BaseInformation(Item):

    """
    Second level object. It may contain composite items as attributes
    """

    def __init__(self, dict=None):
        Item.__init__(self, dict)
        # Initialize attributes
        for k in list(dict.keys()):
            self[k] = None
        # Each information object has an id (which is set by the database)
        self.id = None
        # If the information is ignored (non-critical)
        self.ignored = None
        # Diff with the object already installed
        self.diff = None
        # Same as above, except that it doesn't get cleared if the upload was
        # forced
        self.diff_result = None

    def toDict(self):
        dict = {
            'ignored': not not self.ignored,
            'diff': self.diff.toDict(),
        }
        return dict

# This class is handy for reducing code duplication


class Information(BaseInformation):
    attributeTypes = {}

    def __init__(self):
        BaseInformation.__init__(self, self.attributeTypes)

# Function that validates the insertion of items in a Collection


def validateInformation(obj):
    if not isinstance(obj, BaseInformation):
        if isinstance(obj, InstanceType):
            strtype = "instance of %s" % obj.__class__
        else:
            strtype = str(type(obj))
        raise TypeError("Expected an Information object; got %s" % strtype)


# A list with the needed functions to validate what gets put in it
class Collection(UserList):

    def __init__(self, list=None):
        if list:
            for obj in list:
                validateInformation(obj)
        UserList.__init__(self, list)

    def __setitem__(self, i, item):
        validateInformation(item)
        UserList.__setitem__(self, i, item)

    def append(self, item):
        validateInformation(item)
        UserList.append(self, item)

    add = append

    def insert(self, i, item):
        validateInformation(item)
        UserList.insert(self, i, item)

    def extend(self, other):
        for obj in other:
            validateInformation(obj)
        UserList.extend(self, other)

    def __setslice__(self, i, j, other):
        for obj in other:
            validateInformation(obj)
        UserList.__setslice__(self, i, j, other)

    def __add__(self, other):
        for obj in other:
            validateInformation(obj)
        UserList.__add__(self, other)

    def __radd__(self, other):
        for obj in other:
            validateInformation(obj)
        UserList.__radd__(self, other)

    def __repr__(self):
        return "[<%s instance; items=%s]" % (str(self.__class__),
                                             str(self.data))


# Import classes
# XXX makes sense to put this in a different file
class ChannelFamily(Information):
    attributeTypes = {
        'name': StringType,
        'label': StringType,
        'product_url': StringType,
        'channels': [StringType],
        'org_id': IntType,
    }

class DistChannelMap(Information):
    attributeTypes = {
        'os': StringType,
        'release': StringType,
        'channel_arch': StringType,
        'channel': StringType,
        'org_id': IntType,
    }

class SupportInformation(Information):
    attributeTypes = {
        'pkgid'             : StringType,
        'keyword'           : StringType,
        'channel'           : StringType,
    }

class SuseProduct(Information):
    attributeTypes = {
        'name'          : StringType,
        'version'       : StringType,
        'friendly_name' : StringType,
        'arch'          : StringType,
        'release'       : StringType,
        'product_id'    : IntType,
        'free'          : StringType,
        'base'          : StringType,
        'release_stage' : StringType,
        'channel_family_label' : StringType,
    }

class SuseProductChannel(Information):
    attributeTypes = {
        'product_id'           : IntType,
        'channel_id'           : IntType,
        'mandatory'            : StringType,
    }

class SuseUpgradePath(Information):
    attributeTypes = {
        'from_pdid' : IntType,
        'to_pdid'   : IntType,
    }

class SuseProductExtension(Information):
    attributeTypes = {
        'product_id'  : IntType,
        'root_id'     : IntType,
        'ext_id'      : IntType,
        'recommended' : StringType
    }

class SuseProductRepository(Information):
    attributeTypes = {
        'product_id'          : IntType,
        'rootid'              : IntType,
        'repo_id'             : IntType,
        'channel_label'       : StringType,
        'parent_channel_label': StringType,
        'channel_name'        : StringType,
        'mandatory'           : StringType,
        'update_tag'          : StringType
    }

class SCCRepository(Information):
    attributeTypes = {
        'sccid'        : IntType,
        'autorefresh'  : StringType,
        'name'         : StringType,
        'distro_target': StringType,
        'description'  : StringType,
        'url'          : StringType,
        'signed'       : StringType,
        'installer_updates' : StringType
    }

class SuseSubscription(Information):
    attributeTypes = {
        'max_members'       : IntType, # Deprecated
        'org_id'            : IntType,
        'channel_family_id' : IntType,
        'group_type'        : IntType
    }

class ClonedChannel(Information):
    attributeTypes = {
        'orig'    : StringType,
        'orig_id' : IntType,
        'clone'   : StringType,
        'id'      : IntType
    }

class ReleaseChannelMap(Information):
    attributeTypes = {
        'product': StringType,
        'version': StringType,
        'release': StringType,
        'channel_arch_id': IntType,
        'channel_id': IntType
    }

class ChannelErratum(Information):
    attributeTypes = {
        'id': StringType,
        'advisory_name': StringType,
        'last_modified': DateType,
    }


class IncompleteSourcePackage(Information):
    attributeTypes = {
        'id': StringType,
        'source_rpm': StringType,
        'last_modified': DateType,
    }


class ChannelTrust(Information):
    attributeTypes = {
        'org_trust_id': IntType,
    }


class ContentSourceSsl(Information):
    attributeTypes = {
        'ssl_ca_cert_id': IntType,
        'ssl_client_cert_id': IntType,
        'ssl_client_key_id': IntType,
    }


class ContentSource(Information):
    attributeTypes = {
        'label': StringType,
        'source_url': StringType,
        'type_id': IntType,
        'org_id': IntType,
        'ssl-sets': [ContentSourceSsl],
        'channels': [StringType],
    }


class Channel(Information):
    attributeTypes = {
        'label'             : StringType,
        'org_id'            : IntType,
        'channel_arch'      : StringType,
        'parent_channel'    : StringType,
        'name'              : StringType,
        'summary'           : StringType,
        'description'       : StringType,
        'last_modified'     : DateType,
        'comps_last_modified' : DateType,
        'modules_last_modified': DateType,
        'gpg_key_url'       : StringType,
        'update_tag'        : StringType,
        'installer_updates' : StringType,
        'product_name_id'   : IntType,
        'channel_product_id': IntType,
        'receiving_updates': StringType,
        'checksum_type': StringType,       # xml dumps >= 3.5
        'channel_access': StringType,
        # XXX Not really useful stuff
        'basedir': StringType,
        'product_name': StringType,
        'product_version': StringType,
        'product_beta': StringType,
        # Families this channel is subscribed to
        'families': [ChannelFamily],
        'packages': [StringType],
        'source_packages': [IncompleteSourcePackage],
        'all-packages': [StringType],
        'dists': [DistChannelMap],
        'release': [ReleaseChannelMap],
        'errata': [StringType],
        'errata_timestamps': [ChannelErratum],
        'kickstartable_trees': [StringType],
        'trust_list': [ChannelTrust],
        'export-type': StringType,
        'export-end-date': StringType,
        'export-start-date': StringType,
        'content-sources': [ContentSource],
    }


class OrgTrust(Information):
    attributeTypes = {
        'org_id': IntType,
    }


class Org(Information):
    attributeTypes = {
        'id': IntType,
        'name': StringType,
        'org_trust_ids': [OrgTrust],
    }


class File(Item):
    attributeTypes = {
        'name': StringType,
        'device': IntType,
        'inode': IntType,
        'file_mode': IntType,
        'username': StringType,
        'groupname': StringType,
        'rdev': IntType,
        'file_size': IntType,
        'mtime': DateType,
        'linkto': StringType,
        'flags': IntType,
        'verifyflags': IntType,
        'lang': StringType,
        'checksum': StringType,
        'checksum_type': StringType,
    }

    def __init__(self):
        Item.__init__(self, self.attributeTypes)


class Dependency(Item):
    attributeTypes = {
        'name': StringType,
        'version': StringType,
        'flags': IntType,
    }

    def __init__(self):
        Item.__init__(self, self.attributeTypes)


class ChangeLog(Item):
    attributeTypes = {
        'name': StringType,
        'text': StringType,
        'time': DateType,
    }

    def __init__(self):
        Item.__init__(self, self.attributeTypes)


class Checksum(Item):
    attributeTypes = {
        'type': StringType,
        'value': StringType,
    }

    def __init__(self):
        Item.__init__(self, self.attributeTypes)

class ProductFile(Information):
    attributeTypes = {
        'name'              : StringType,
        'epoch'             : StringType,
        'version'           : StringType,
        'release'           : StringType,
        'arch'              : StringType,
        'vendor'            : StringType,
        'summary'           : StringType,
        'description'       : StringType
    }

class Eula(Information):
    attributeTypes = {
        'text'              : StringType,
        'checksum'          : StringType,
    }

class ExtraTag(Information):
    attributeTypes = {
        'name'           : StringType,
        'value'          : StringType,
    }

class IncompletePackage(BaseInformation):
    attributeTypes = {
        'package_id': StringType,  # RH db id
        'name': StringType,
        'epoch': StringType,
        'version': StringType,
        'release': StringType,
        'arch': StringType,
        'org_id': IntType,
        'package_size': IntType,
        'last_modified': DateType,
        'md5sum': StringType,       # xml dumps < 3.5
        # These attributes are lists of objects
        'channels': [StringType],
        'checksum_list': [Checksum],
    }

    def __init__(self):
        BaseInformation.__init__(self, IncompletePackage.attributeTypes)
        self.name = None
        self.evr = None
        self.arch = None
        self.org_id = None

    def toDict(self):
        dict = BaseInformation.toDict(self)
        evr = list(self.evr)
        if evr[0] is None:
            evr[0] = ''

        dict['name'] = self.name
        dict['evr'] = evr
        dict['arch'] = self.arch

        org_id = self.org_id
        if org_id is None:
            org_id = ''
        dict['org_id'] = org_id
        return dict

    def short_str(self):
        return "%s-%s-%s.%s.rpm" % (self.name, self.evr[1], self.evr[2],
                                    self.arch)


class Package(IncompletePackage):

    """
    A package is a hash of attributes
    """
    attributeTypes = {
        'description': StringType,
        'summary': StringType,
        'license': StringType,
        'package_group': StringType,
        'rpm_version': StringType,
        'payload_size': IntType,
        'installed_size': IntType,
        'payload_format': StringType,
        'build_host': StringType,
        'build_time': DateType,
        'cookie': StringType,
        'vendor': StringType,
        'source_rpm': StringType,
        'package_size': IntType,
        'last_modified': DateType,
        'sigpgp': StringType,
        'siggpg': StringType,
        'sigsize': IntType,
        'header_start': IntType,
        'header_end': IntType,
        'path': StringType,
        'md5sum': StringType,       # xml dumps < 3.5
        'sigmd5': StringType,
        # These attributes are lists of objects
        'files'             : [File],
        'requires'          : [Dependency],
        'provides'          : [Dependency],
        'conflicts'         : [Dependency],
        'obsoletes'         : [Dependency],
        'recommends'        : [Dependency],
        'supplements'       : [Dependency],
        'enhances'          : [Dependency],
        'suggests'          : [Dependency],
        'breaks'            : [Dependency],
        'predepends'        : [Dependency],
        'changelog'         : [ChangeLog],
        'channels'          : [StringType],
        'checksum_list'     : [Checksum],
        'product_files'     : [ProductFile],
        'eulas'             : [Eula],
        'extra_tags'        : [ExtraTag],
    }

    def __init__(self):
        # Inherit from IncompletePackage
        IncompletePackage.__init__(self)
        # And initialize the specific ones
        for k in list(self.attributeTypes.keys()):
            self[k] = None


class SourcePackage(IncompletePackage):
    attributeTypes = {
        'package_group': StringType,
        'rpm_version': StringType,
        'source_rpm': StringType,
        'payload_size': IntType,
        'payload_format': StringType,
        'build_host': StringType,
        'build_time': DateType,
        'vendor': StringType,
        'cookie': StringType,
        'package_size': IntType,
        'path': StringType,
        'last_modified': DateType,
        # these attributes are mutualy exclusive
        'md5sum': StringType,       # xml dumps < 3.5
        'sigmd5': StringType,       # xml dumps < 3.5 and rpms
        'checksum_list': [Checksum],
    }

    def __init__(self):
        # Inherit from IncompletePackage
        IncompletePackage.__init__(self)
        # And initialize the specific ones
        self.source_rpm = None
        for k in list(self.attributeTypes.keys()):
            self[k] = None

    def short_str(self):
        return self.source_rpm


class Bug(Information):
    attributeTypes = {
        'bug_id': StringType,
        'summary': StringType,
        'href': StringType,
    }


class ErrataFile(Information):
    attributeTypes = {
        'filename': StringType,
        'file_type': StringType,
        'channel_list': [StringType],
        'package_id': IntType,
        # these attributes are mutualy exclusive
        'md5sum': StringType,       # xml dumps < 3.5
        'checksum_list': [Checksum],
    }


class Keyword(Information):
    attributeTypes = {
        'keyword': StringType,
    }


class Erratum(Information):
    attributeTypes = {
        'advisory'          : StringType,
        'advisory_name'     : StringType,
        'advisory_rel'      : IntType,
        'advisory_type'     : StringType,
        'product'           : StringType,
        'description'       : StringType,
        'synopsis'          : StringType,
        'topic'             : StringType,
        'solution'          : StringType,
        'issue_date'        : DateType,
        'update_date'       : DateType,
        'last_modified'     : DateType,
        'notes'             : StringType,
        'org_id'            : IntType,
        'refers_to'         : StringType,
        'severity'          : StringType,
        'errata_from'       : StringType,
        # These attributes are lists of objects
        'channels'          : [Channel],
        'packages'          : [IncompletePackage],
        'files'             : [ErrataFile],
        'keywords'          : [Keyword],
        'bugs'              : [Bug],
        'cve'               : [StringType],
        'severity_id': IntType
    }


class BaseArch(Information):
    attributeTypes = {
        'label': StringType,
        'name': StringType,
    }


class CPUArch(BaseArch):
    pass


class BaseTypedArch(BaseArch):
    attributeTypes = BaseArch.attributeTypes.copy()
    attributeTypes.update({
        'arch-type-label': StringType,
        'arch-type-name': StringType,
    })


class ServerArch(BaseTypedArch):
    pass


class PackageArch(BaseTypedArch):
    pass


class ChannelArch(BaseTypedArch):
    pass


class ServerPackageArchCompat(Information):
    attributeTypes = {
        'server-arch': StringType,
        'package-arch': StringType,
        'preference': IntType,
    }


class ServerChannelArchCompat(Information):
    attributeTypes = {
        'server-arch': StringType,
        'channel-arch': StringType,
    }


class ChannelPackageArchCompat(Information):
    attributeTypes = {
        'channel-arch': StringType,
        'package-arch': StringType,
    }


class ServerGroupServerArchCompat(Information):
    attributeTypes = {
        'server-arch': StringType,
        'server-group-type': StringType,
    }


class KickstartFile(Information):
    attributeTypes = {
        'relative_path': StringType,
        'last_modified': DateType,
        'file_size': IntType,
        'md5sum': StringType,       # xml dumps < 3.5
        'checksum_list': [Checksum],
    }


class KickstartableTree(Information):
    attributeTypes = {
        'label': StringType,
        'base_path': StringType,
        'channel': StringType,
        'boot_image': StringType,
        'kstree_type_label': StringType,
        'install_type_name': StringType,
        'kstree_type_label': StringType,
        'install_type_name': StringType,
        'org_id': IntType,
        'last_modified': DateType,
        'files': [KickstartFile],
    }


class ProductName(Information):
    attributeTypes = {
        'label': StringType,
        'name': StringType,
    }


# Generic error object
class Error(Information):
    attributeTypes = {
        'error': StringType,
    }


# Base import class
class Import:

    def __init__(self, batch, backend):
        self.batch = batch
        self.backend = backend
        # Upload force
        self.uploadForce = 1
        # Force object verification
        self.forceVerify = 0
        # Ignore already-uploaded objects
        self.ignoreUploaded = 0
        # Transactional behaviour
        self.transactional = 0

    def setUploadForce(self, value):
        self.uploadForce = value

    def setForceVerify(self, value):
        self.forceVerify = value

    def setIgnoreUploaded(self, value):
        self.ignoreUploaded = value

    def setTransactional(self, value):
        self.transactional = value

    # This is the generic API exposed by an importer
    def preprocess(self):
        pass

    def fix(self):
        pass

    def submit(self):
        pass

    def run(self):
        self.preprocess()
        self.fix()
        self.submit()

    def cleanup(self):
        # Clean up the objects in the batch
        for object in self.batch:
            self._cleanup_object(object)

    def _cleanup_object(self, object):
        object.clear()

    def status(self):
        # Report the status back
        self.cleanup()
        return self.batch

    def _processPackage(self, package):
        # Build the helper data structures
        evr = []
        for f in ('epoch', 'version', 'release'):
            evr.append(package[f])
        package.evr = tuple(evr)
        package.name = package['name']
        package.arch = package['arch']
        package.org_id = package['org_id']

    def _fix_encoding(self, text):
        if text is None:
            return None
        elif isinstance(text, str):
            return text
        elif isinstance(text, bytes):
            try:
                return text.decode("utf8")
            except:
                return text.decode("iso8859-1")

# Any package processing import class
class GenericPackageImport(Import):

    def __init__(self, batch, backend):
        Import.__init__(self, batch, backend)
        # Packages have to be pre-processed
        self.names = {}
        self.evrs = {}
        self.checksums = {}
        self.package_arches = {}
        self.channels = {}
        self.channel_package_arch_compat = {}

    def _processPackage(self, package):
        Import._processPackage(self, package)

        # Save the fields in the local hashes
        if package.evr not in self.evrs:
            self.evrs[package.evr] = None

        if package.name not in self.names:
            self.names[package.name] = None

        if package.arch not in self.package_arches:
            self.package_arches[package.arch] = None

        for type, chksum in list(package['checksums'].items()):
            checksumTuple = (type, chksum)
            if not checksumTuple in self.checksums:
                self.checksums[checksumTuple] = None

    def _postprocessPackageNEVRA(self, package):
        arch = self.package_arches[package.arch]
        if not arch:
            # Unsupported arch
            package.ignored = 1
            raise InvalidArchError(package.arch,
                                   "Unknown arch %s" % package.arch)

#        package['package_arch_id'] = arch
#        package['name_id'] = self.names[package.name]
#        package['evr_id'] = self.evrs[package.evr]

        nevra = (self.names[package.name], self.evrs[package.evr], arch)
        nevra_dict = {nevra: None}

        self.backend.lookupPackageNEVRAs(nevra_dict)

        package['name_id'], package['evr_id'], package['package_arch_id'] = nevra
        package['nevra_id'] = nevra_dict[nevra]
        package['checksum_id'] = self.checksums[(package['checksum_type'], package['checksum'])]

# Exceptions


class ImportException(Exception):

    def __init__(self, arglist):
        Exception.__init__(self, *arglist)


class AlreadyUploadedError(ImportException):

    def __init__(self, object, *rest):
        ImportException.__init__(self, rest)
        self.object = object


class FileConflictError(AlreadyUploadedError):
    pass


class InvalidPackageError(ImportException):

    def __init__(self, package, *rest):
        ImportException.__init__(self, rest)
        self.package = package


class InvalidArchError(ImportException):

    def __init__(self, arch, *rest):
        ImportException.__init__(self, rest)
        self.arch = arch


class InvalidChannelError(ImportException):

    def __init__(self, channel, *rest):
        ImportException.__init__(self, rest)
        self.channel = channel


class MissingParentChannelError(ImportException):

    def __init__(self, channel, *rest):
        ImportException.__init__(self, rest)
        self.channel = channel


class InvalidChannelFamilyError(ImportException):

    def __init__(self, channel_family, *rest):
        ImportException.__init__(self, rest)
        self.channel_family = channel_family


class IncompatibleArchError(ImportException):

    def __init__(self, arch1, arch2, *rest):
        ImportException.__init__(self, rest)
        self.arch1 = arch1
        self.arch2 = arch2


class TransactionError(ImportException):

    def __init__(self, *rest):
        ImportException.__init__(self, rest)

# Class that stores diff information


class Diff(UserList):

    def __init__(self):
        UserList.__init__(self)
        self.level = 0

    def setLevel(self, level):
        if self.level < level:
            self.level = level

    def toDict(self):
        # Converts the object to a dictionary
        l = []
        for item in self:
            l.append(removeNone(item))
        return {
            'level': self.level,
            'diff': l,
        }


# Replaces all occurences of None with the empty string
def removeNone(list):
    return [(x is not None and x) or '' for x in list]


# Assorted functions for various things

def move_package(filename, basedir, relpath, checksum_type, checksum, force=None):
    """
    Copies the information from the file descriptor to a file
    Checks the file's checksum, raising FileConflictErrror if it's different
    The force flag prevents the exception from being raised, and copies the
    file even if the checksum has changed
    """
    packagePath = basedir + "/" + relpath
    # Is the file there already?
    if os.path.isfile(packagePath):
        if force:
            os.unlink(packagePath)
        else:
            # Get its checksum
            localsum = getFileChecksum(checksum_type, packagePath)
            if checksum == localsum:
                # Same file, so get outa here
                return
            raise FileConflictError(os.path.basename(packagePath))

    dir = os.path.dirname(packagePath)
    # Create the directory where the file will reside
    if not os.path.exists(dir):
        createPath(dir)

    # Check if the RPM has been downloaded from a remote repository
    # If so, it is stored in CFG.MOUNT_POINT and we have to move it
    # If not, the repository is local to the server, so the rpm should be copied
    if filename.startswith(CFG.MOUNT_POINT):
        shutil.move(filename, packagePath)
    else:
        shutil.copy(filename, packagePath)

    # set the path perms readable by all users
    os.chmod(packagePath, int('0644', 8))


# Returns a list of containing nevra for the given RPM header
NEVRA_TAGS = ['name', 'epoch', 'version', 'release', 'arch']


def get_nevra(header):
    # Get nevra
    nevra = []
    for tag in NEVRA_TAGS:
        nevra.append(header[tag])
    return nevra


def get_nevra_dict(header):
    # Get nevra
    nevra = {}
    for tag in NEVRA_TAGS:
        nevra[tag] = header[tag]
    if nevra['epoch'] == '':
        nevra['epoch'] = None
    return nevra
  0707010000018C000081B40000000000000000000000015FBBE8EE00000BFE000000000000000000000000000000000000003600000000spacewalk-backend/server/importlib/kickstartImport.py #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Package import process
#

from .importLib import KickstartableTree, Import


class KickstartableTreeImport(Import):

    def __init__(self, batch, backend):
        Import.__init__(self, batch, backend)

        self.channels = {}

        self.kstree_types = {}
        self.ks_install_types = {}
        self.checksums = {}

    def preprocess(self):
        # Processes the batch to a form more suitable for database
        # operations
        for ent in self.batch:
            if not isinstance(ent, KickstartableTree):
                raise TypeError("Expected a KickstartableTree instance")

            channel_label = ent['channel']
            self.channels[channel_label] = None

            # If the ks type and install type are missing, populate them
            kstree_type_label = ent['kstree_type_label']
            kstree_type_name = ent['kstree_type_name']
            self.kstree_types[kstree_type_label] = kstree_type_name

            ks_install_label = ent['install_type_label']
            ks_install_name = ent['install_type_name']
            self.ks_install_types[ks_install_label] = ks_install_name
            for f in ent['files']:
                checksumTuple = (f['checksum_type'], f['checksum'])
                if checksumTuple not in self.checksums:
                    self.checksums[checksumTuple] = None

    def fix(self):
        self.backend.lookup_kstree_types(self.kstree_types)
        self.backend.lookup_ks_install_types(self.ks_install_types)
        self.backend.lookupChannels(self.channels)
        self.backend.lookupChecksums(self.checksums)

        for ent in self.batch:
            if ent.ignored:
                continue
            channel_label = ent['channel']
            channel = self.channels[channel_label]
            if channel is None:
                raise Exception("Channel %s not imported" % channel_label)
            ent['channel_id'] = channel['id']
            # Now fix the other ids
            kstree_type_label = ent['kstree_type_label']
            ks_install_label = ent['install_type_label']
            ent['kstree_type'] = self.kstree_types[kstree_type_label]
            ent['install_type'] = self.ks_install_types[ks_install_label]
            for f in ent['files']:
                f['checksum_id'] = self.checksums[(f['checksum_type'], f['checksum'])]

    def submit(self):
        self.backend.processKickstartTrees(self.batch)
        self.backend.commit()
  0707010000018D000081B40000000000000000000000015FBBE8EE000010BE000000000000000000000000000000000000003000000000spacewalk-backend/server/importlib/mpmSource.py   #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Converts headers to the intermediate format
#

from . import headerSource
from . import debPackage


class mpmBinaryPackage(headerSource.rpmBinaryPackage):

    tagMap = headerSource.rpmBinaryPackage.tagMap.copy()

    # Remove already-mapped tags
    _already_mapped = [
        'rpm_version', 'payload_size', 'payload_format',
        'package_group', 'build_time', 'build_host'
    ]
    for t in _already_mapped:
        if t in tagMap:
            del tagMap[t]

    def populate(self, header, size, checksum_type, checksum, path=None, org_id=None,
                 channels=[]):

        # call to base class method
        headerSource.rpmBinaryPackage.populate(self, header, size, checksum_type, checksum, path,
                                               org_id, channels)

        srpm = self.get('source_rpm', '')
        if srpm == '':
            self['source_rpm'] = None

        group = self.get('package_group', '')
        if group == '':
            self['package_group'] = 'NoGroup'

        return self

    def _populateFiles(self, header):
        files = []
        for f in header.get('files', []):
            fc = headerSource.rpmFile()
            fc.populate(f)
            files.append(fc)
        self['files'] = files

    def _populateDependencyInformation(self, header):
        mapping = {
            'provides': headerSource.rpmProvides,
            'requires': headerSource.rpmRequires,
            'conflicts': headerSource.rpmConflicts,
            'obsoletes': headerSource.rpmObsoletes,
            'recommends': headerSource.rpmRecommends,
            'supplements': headerSource.rpmSupplements,
            'enhances': headerSource.rpmEnhances,
            'suggests': headerSource.rpmSuggests,
        }

        for k, dclass in list(mapping.items()):
            unique_deps = []
            l = []
            for dinfo in header.get(k, []):
                hash = dinfo
                if not len(hash['name']):
                    continue
                dep_nv = (hash['name'], hash['version'], hash['flags'])
                if dep_nv not in unique_deps:
                    unique_deps.append(dep_nv)
                    finst = dclass()
                    finst.populate(dinfo)
                    l.append(finst)
                else:
                    continue
            self[k] = l

    def _populateChangeLog(self, header):
        l = []
        for cinfo in header.get('changelog', []):
            cinst = headerSource.rpmChangeLog()
            cinst.populate(cinfo)
            l.append(cinst)
        self['changelog'] = l

# top-level package object creation --------------------------------------


def create_package(header, size, checksum_type, checksum, relpath, org_id, header_start=None,
                   header_end=None, channels=[]):
    if header.packaging == 'rpm':
        return headerSource.createPackage(header, size=size,
                                          checksum_type=checksum_type, checksum=checksum,
                                          relpath=relpath, org_id=org_id, header_start=header_start,
                                          header_end=header_end, channels=channels)
    if header.packaging == 'deb':
        return debPackage.debBinaryPackage(header, size=size, checksum_type=checksum_type, checksum=checksum, path=relpath,
                                           org_id=org_id, channels=channels)
    if header.is_source:
        raise NotImplementedError()
    p = mpmBinaryPackage()
    p.populate(header, size=size, checksum_type=checksum_type, checksum=checksum, path=relpath,
               org_id=org_id, channels=channels)
    return p
  0707010000018E000081B40000000000000000000000015FBBE8EE000013C6000000000000000000000000000000000000003000000000spacewalk-backend/server/importlib/orgImport.py   #
# Copyright (c) 2013--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Org import process
#

from .importLib import Import

# Thanks for this class goes to Alex Martelli:
# http://stackoverflow.com/questions/1151658/python-hashable-dicts


class hashabledict(dict):

    def __key(self):
        return tuple((k, self[k]) for k in sorted(self))

    def __hash__(self):
        return hash(self.__key())

    def __eq__(self, other):
        return self.__key() == other.__key()


class OrgImport(Import):

    def __init__(self, batch, backend, master_label, create_orgs=False):
        Import.__init__(self, batch, backend)
        self.master_label = master_label
        self.create_orgs = create_orgs
        self._create_maps()

    def _create_maps(self):
        org_map = self.backend.lookupOrgMap(self.master_label)
        self.mn_to_mi = org_map['master-name-to-master-id']
        self.mi_to_li = org_map['master-id-to-local-id']

    def submit(self):
        try:
            # Always happens: if it does not exist, we create a master record
            if not self.backend.lookupMaster(self.master_label):
                self.backend.createMaster(self.master_label)

            # Always happens: if each org has not been synced before,
            # create master org record.
            missing_master_orgs = []
            for org in self.batch:
                if org['name'] not in list(self.mn_to_mi.keys()):
                    missing_master_orgs.append(org)
            if len(missing_master_orgs) > 0:
                self.backend.createMasterOrgs(self.master_label,
                                              missing_master_orgs)

            # Iff we are force-creating local orgs, create any orgs that are
            # not already mapped to local orgs. If a local org exists with
            # the same name as the master org, use that instead. Link local
            # orgs with master orgs.
            if self.create_orgs:
                orgs_to_create = []
                orgs_to_link = []
                update_master_orgs = []
                for org in self.batch:
                    if (org['id'] not in list(self.mi_to_li.keys())
                            or not self.mi_to_li[org['id']]):
                        local_id = self.backend.lookupOrg(org['name'])
                        if local_id:
                            orgs_to_link.append({
                                'master_id': org['id'],
                                'local_id': local_id})
                        else:
                            orgs_to_create.append(org['name'])
                if len(orgs_to_create) > 0:
                    new_org_map = self.backend.createOrgs(orgs_to_create)
                    for org in orgs_to_create:
                        update_master_orgs.append({
                            'master_id': self.mn_to_mi[org],
                            'local_id': new_org_map[org]})
                update_master_orgs += orgs_to_link
                if len(update_master_orgs) > 0:
                    self.backend.updateMasterOrgs(update_master_orgs)

            # refresh maps after we've just changed things
            self._create_maps()

            # Iff we have a master org mapped to local org, create org
            # trust records
            # we need to uniquify in case user has mapped multiple orgs
            # together
            trusts_to_create = set([])
            for org in self.batch:
                for trust in org['org_trust_ids']:
                    if (org['id'] in list(self.mi_to_li.keys())
                            and trust['org_id'] in list(self.mi_to_li.keys())):
                        my_org_id = self.mi_to_li[org['id']]
                        self.backend.clearOrgTrusts(my_org_id)
                        my_trust_id = self.mi_to_li[trust['org_id']]
                        trusts_to_create.add(hashabledict({
                            'org_id': my_org_id,
                            'trust': my_trust_id}))
                        # org trusts are always bi-directional
                        # (even if we are not syncing the other org)
                        trusts_to_create.add(hashabledict({
                            'org_id': my_trust_id,
                            'trust': my_org_id}))

            if len(trusts_to_create) > 0:
                self.backend.createOrgTrusts(trusts_to_create)
        except:
            self.backend.rollback()
            raise
        self.backend.commit()
  0707010000018F000081B40000000000000000000000015FBBE8EE00005ECE000000000000000000000000000000000000003400000000spacewalk-backend/server/importlib/packageImport.py   #
# Copyright (c) 2008--2018 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Package import process
#

import rpm
import sys
import os.path
from .importLib import GenericPackageImport, IncompletePackage, \
    Import, InvalidArchError, InvalidChannelError, \
    IncompatibleArchError
from .mpmSource import mpmBinaryPackage
from uyuni.common import rhn_pkg
from spacewalk.common.rhnConfig import CFG
from spacewalk.server import taskomatic
from spacewalk.server.rhnServer import server_packages


class ChannelPackageSubscription(GenericPackageImport):

    def __init__(self, batch, backend, caller=None, strict=0, repogen=True):
        # If strict, the set of packages that was passed in will be the only
        # one in the channels - everything else will be unlinked
        GenericPackageImport.__init__(self, batch, backend)
        self.affected_channels = []
        # A hash keyed on the channel id, and with tuples
        # (added_packages, removed_packages) as values (packages are package
        # ids)
        self.affected_channel_packages = {}
        if not caller:
            self.caller = "backend.(unknown)"
        else:
            self.caller = caller
        self._strict_subscription = strict
        self.repogen = repogen

    def preprocess(self):
        # Processes the package batch to a form more suitable for database
        # operations
        for package in self.batch:
            # if package object doesn't have multiple checksums (like satellite-sync objects)
            #   then let's fake it
            if 'checksums' not in package:
                package['checksums'] = {package['checksum_type']: package['checksum']}
            if not isinstance(package, IncompletePackage):
                raise TypeError("Expected an IncompletePackage instance, "
                                "got %s" % package.__class__.__name__)
            self._processPackage(package)

    def fix(self):
        # Look up arches and channels
        self.backend.lookupPackageArches(self.package_arches)
        self.backend.lookupChannels(self.channels)
        # Initialize self.channel_package_arch_compat
        self.channel_package_arch_compat = {}
        for channel, channel_row in list(self.channels.items()):
            if not channel_row:
                # Unsupported channel
                continue
            self.channel_package_arch_compat[channel_row['channel_arch_id']] = None
        self.backend.lookupChannelPackageArchCompat(self.channel_package_arch_compat)
        self.backend.lookupPackageNames(self.names)
        self.backend.lookupEVRs(self.evrs)
        self.backend.lookupChecksums(self.checksums)

        # Fix the package information up, and uniquify the packages too
        uniqdict = {}
        for package in self.batch:
            if package.ignored:
                continue
            self._postprocessPackageNEVRA(package)
            if not CFG.ENABLE_NVREA:
                # nvrea disabled, skip checksum
                nevrao = (
                    package['name_id'],
                    package['evr_id'],
                    package['package_arch_id'],
                    package['org_id'])
            else:
                # As nvrea is enabled uniquify based on checksum
                nevrao = (
                    package['name_id'],
                    package['evr_id'],
                    package['package_arch_id'],
                    package['org_id'],
                    package['checksum_id'])

            if nevrao not in uniqdict:
                # Uniquify the channel names
                package['channels'] = {}
                # Initialize the channels
                # This is a handy way of checking arch compatibility for this
                # package with its channels
                self.__copyChannels(package, package)
                uniqdict[nevrao] = package
            else:
                # Package is found twice in the same batch
                # Are the packages the same?
                self._comparePackages(package, uniqdict[nevrao])
                # Invalidate it
                package.ignored = 1
                firstpackage = uniqdict[nevrao]
                # Copy any new channels
                self.__copyChannels(package, firstpackage)
                # Knowing the id of the referenced package
                package.first_package = firstpackage

    def _comparePackages(self, package1, package2):
        # XXX This should probably do a deep compare of the two packages
        pass

    def submit(self):
        self.backend.lookupPackages(self.batch, self.checksums)
        try:
            affected_channels = self.backend.subscribeToChannels(self.batch,
                                                                 strict=self._strict_subscription)
        except:
            self.backend.rollback()
            raise
        self.compute_affected_channels(affected_channels)

        if len(self.batch) < 10:
            # update small batch per package
            name_ids = [pkg['name_id'] for pkg in self.batch]
        else:
            # update bigger batch at once
            name_ids = []
        self.backend.update_newest_package_cache(caller=self.caller,
                                                 affected_channels=self.affected_channel_packages, name_ids=name_ids)
        # Now that channel is updated, schedule the repo generation
        if self.repogen:
            taskomatic.add_to_repodata_queue_for_channel_package_subscription(
                self.affected_channels, self.batch, self.caller)
        self.backend.commit()

    def compute_affected_channels(self, affected_channels):
        # Fill the list of affected channels
        self.affected_channel_packages.clear()
        self.affected_channel_packages.update(affected_channels)
        for channel_label, channel_row in list(self.channels.items()):
            channel_id = channel_row['id']
            if channel_id in affected_channels:
                affected_channels[channel_id] = channel_label
        self.affected_channels = list(affected_channels.values())

    def _processPackage(self, package):
        GenericPackageImport._processPackage(self, package)

        # Process channels
        channels = []
        channelHash = {}
        for channel in package['channels']:
            channelName = channel['label']
            if channelName not in channelHash:
                channels.append(channelName)
                channelHash[channelName] = None
            self.channels[channelName] = None
        # Replace the channel list with the uniquified list
        package.channels = channels

    # Copies the channels from one package to the other
    def __copyChannels(self, sourcePackage, destPackage):
        dpHash = destPackage['channels']
        for schannelName in sourcePackage.channels:
            # Check if the package is compatible with the channel
            channel = self.channels[schannelName]
            if not channel:
                # Unknown channel
                sourcePackage.ignored = 1
                raise InvalidChannelError(channel,
                                          "Unsupported channel %s" % schannelName)
            # Check channel-package compatibility
            charch = channel['channel_arch_id']
            archCompat = self.channel_package_arch_compat[charch]
            if not archCompat:
                # Invalid architecture
                sourcePackage.ignored = 1
                raise InvalidArchError(charch,
                                       "Invalid channel architecture %s" % charch)

            # Now check if the source package's arch is compatible with the
            # current channel
            if sourcePackage['package_arch_id'] not in archCompat:
                sourcePackage.ignored = 1
                raise IncompatibleArchError(sourcePackage.arch, charch,
                                            "Package arch %s incompatible with channel %s" %
                                            (sourcePackage.arch, schannelName))

            dpHash[channel['id']] = schannelName

        destPackage.channels = list(dpHash.values())


class PackageImport(ChannelPackageSubscription):

    def __init__(self, batch, backend, caller=None, update_last_modified=0):
        ChannelPackageSubscription.__init__(self, batch, backend,
                                            caller=caller)
        self.ignoreUploaded = 1
        self._update_last_modified = update_last_modified
        self.capabilities = {}
        self.groups = {}
        self.sourceRPMs = {}
        self.changelog_data = {}
        self.suseProdfile_data = {}
        self.suseEula_data = {}
        self.extraTags = {}

    def _skip_tag(self, package, tag):
        # Allow all tags in case of DEB packages
        if package['arch'] and package['arch'].endswith('deb'):
            return False
        # See if the installed version of RPM understands a given tag
        # Assumed attr-format in RPM is 'RPMTAG_<UPPERCASETAG>'
        return not hasattr(rpm, 'RPMTAG_'+tag.upper())

    def _processPackage(self, package):
        ChannelPackageSubscription._processPackage(self, package)

        # Process package groups
        group = self._fix_encoding(package['package_group']).strip()
        if group not in self.groups:
            self.groups[group] = None
        sourceRPM = package['source_rpm']
        if (sourceRPM is not None) and (sourceRPM not in self.sourceRPMs):
            self.sourceRPMs[sourceRPM] = None
        # Change copyright to license
        # XXX
        package['copyright'] = self._fix_encoding(package['license'])

        for tag in ('recommends', 'suggests', 'supplements', 'enhances', 'breaks', 'predepends'):
            if self._skip_tag(package, tag) or tag not in package or type(package[tag]) != type([]):
                # older spacewalk server do not export weak deps.
                # and older RPM doesn't know about them either
                # lets create an empty list
                package[tag] = []

        # Creates all the data structures needed to insert capabilities
        for tag in ('provides', 'requires', 'conflicts', 'obsoletes', 'recommends', 'suggests', 'supplements', 'enhances', 'breaks', 'predepends'):
            depList = package[tag]
            if type(depList) != type([]):
                sys.stderr.write("!!! packageImport.PackageImport._processPackage: "
                                 "erronous depList for '%s', converting to []\n" % tag)
                depList = []

            for dep in depList:
                nv = []
                for f in ('name', 'version'):
                    nv.append(self._fix_encoding(dep[f]))
                    del dep[f]
                nv = tuple(nv)
                dep['capability'] = nv
                if nv not in self.capabilities:
                    self.capabilities[nv] = None
        # Process files too
        fileList = package['files']
        for f in fileList:
            filename = self._fix_encoding(f['name'])
            nv = (filename, '')
            del f['name']
            f['capability'] = nv
            if nv not in self.capabilities:
                self.capabilities[nv] = None
            f['checksum'] = self._fix_encoding(f['checksum'])
            fchecksumTuple = (f['checksum_type'], f['checksum'])
            if fchecksumTuple not in self.checksums:
                self.checksums[fchecksumTuple] = None

        # Uniquify changelog entries
        unique_package_changelog_hash = {}
        unique_package_changelog = []
        for changelog in package['changelog']:
            key = (self._fix_encoding(changelog['name']), self._fix_encoding(changelog['time']), self._fix_encoding(changelog['text'])[:3000])
            if key not in unique_package_changelog_hash:
                self.changelog_data[key] = None
                changelog['text'] = changelog['text'][:3000]
                unique_package_changelog.append(changelog)
                unique_package_changelog_hash[key] = 1
        package['changelog'] = unique_package_changelog

        # fix encoding issues in package summary and description
        package['description'] = self._fix_encoding(package['description'])
        package['summary'] = self._fix_encoding(package['summary']).rstrip()

        if package['product_files'] is not None:
            for prodFile in package['product_files']:
                evrtuple = (prodFile['epoch'], prodFile['version'], prodFile['release'])
                evr = {evrtuple : None}
                archhash = {prodFile['arch'] : None}
                self.backend.lookupEVRs(evr)
                self.backend.lookupPackageArches(archhash)
                prodFile['evr'] = evr[evrtuple]
                prodFile['package_arch_id'] = archhash[prodFile['arch']]
                key = (prodFile['name'], prodFile['evr'], prodFile['package_arch_id'], prodFile['vendor'], prodFile['summary'], prodFile['description'])
                self.suseProdfile_data[key] = None

        if package['eulas'] is not None:
            for eula in package['eulas']:
                key = (eula['text'], eula['checksum'])
                self.suseEula_data[key] = None

        if 'extra_tags' in package and package['extra_tags'] is not None:
            for tag in package['extra_tags']:
                self.extraTags[tag['name']] = None

    def fix(self):
        # If capabilities are available, process them
        if self.capabilities:
            try:
                self.backend.processCapabilities(self.capabilities)
            except:
                # Oops
                self.backend.rollback()
                raise
            # Since this is the bulk of the work, commit
            self.backend.commit()

        self.backend.processChangeLog(self.changelog_data)
        self.backend.processSuseProductFiles(self.suseProdfile_data)
        self.backend.processSuseEulas(self.suseEula_data)

        ChannelPackageSubscription.fix(self)

        self.backend.lookupSourceRPMs(self.sourceRPMs)
        self.backend.lookupPackageGroups(self.groups)
        self.backend.processExtraTags(self.extraTags)
        # Postprocess the gathered information
        self.__postprocess()

    def submit(self):
        upload_force = self.uploadForce
        if not upload_force and self._update_last_modified:
            # # Force it just a little bit - kind of hacky
            upload_force = 0.5
        try:
            self.backend.processPackages(self.batch,
                                         uploadForce=upload_force,
                                         forceVerify=self.forceVerify,
                                         ignoreUploaded=self.ignoreUploaded,
                                         transactional=self.transactional)
            self._import_signatures()
        except:
            # Oops
            self.backend.rollback()
            raise
        self.backend.commit()
        if not self._update_last_modified:
            # Go though the list of objects and clear out the ones that have a
            # force of 0.5
            for p in self.batch:
                if p.diff and p.diff.level == 0.5:
                    # Ignore this difference completely
                    p.diff = None
                    # Leave p.diff_result in place

    def subscribeToChannels(self):
        affected_channels = self.backend.subscribeToChannels(self.batch)
        # Fill the list of affected channels
        self.compute_affected_channels(affected_channels)

        name_ids = [pkg['name_id'] for pkg in self.batch]
        self.backend.update_newest_package_cache(caller=self.caller,
                                                 affected_channels=self.affected_channel_packages, name_ids=name_ids)
        taskomatic.add_to_repodata_queue_for_channel_package_subscription(
            self.affected_channels, self.batch, self.caller)
        self.backend.commit()

    def __postprocess(self):
        # Gather the IDs we've found

        for package in self.batch:
            if package.ignored:
                # Skip it
                continue
            # Only deal with packages
            self.__postprocessPackage(package)

    def __postprocessPackage(self, package):
        """ populate the columns foo_id with id numbers from appropriate hashes """
        package['package_group'] = self.groups[self._fix_encoding(package['package_group']).strip()]
        source_rpm = package['source_rpm']
        if source_rpm is not None:
            source_rpm = self.sourceRPMs[source_rpm]
        else:
            source_rpm = ''
        package['source_rpm_id'] = source_rpm
        package['checksum_id'] = self.checksums[(package['checksum_type'], package['checksum'])]

        # Postprocess the dependency information
        for tag in ('provides', 'requires', 'conflicts', 'obsoletes', 'files', 'recommends', 'suggests', 'supplements', 'enhances', 'breaks', 'predepends'):
            for entry in package[tag]:
                nv = entry['capability']
                entry['capability_id'] = self.capabilities[nv]
        for c in package['changelog']:
            c['changelog_data_id'] = self.changelog_data[(c['name'], c['time'], c['text'])]
        if package['product_files'] is not None:
            for p in package['product_files']:
                p['prodfile_id'] = self.suseProdfile_data[(p['name'], p['evr'], p['package_arch_id'], p['vendor'], p['summary'], p['description'])]
        if package['eulas'] is not None:
            for e in package['eulas']:
                e['eula_id'] = self.suseEula_data[(e['text'], e['checksum'])]
        fileList = package['files']
        for f in fileList:
            f['checksum_id'] = self.checksums[(f['checksum_type'], f['checksum'])]
        if 'extra_tags' in package and package['extra_tags'] is not None:
            for t in package['extra_tags']:
                t['key_id'] = self.extraTags[t['name']]

    def _comparePackages(self, package1, package2):
        if (package1['checksum_type'] == package2['checksum_type']
                and package1['checksum'] == package2['checksum']):
            return
        # XXX Handle this better
        raise Exception("Different packages in the same batch")

    def _cleanup_object(self, object):
        ChannelPackageSubscription._cleanup_object(self, object)
        if object.ignored:
            object.id = object.first_package.id

    def _import_signatures(self):
        for package in self.batch:
            # skip missing files and mpm packages
            if package['path'] and not isinstance(package, mpmBinaryPackage):
                full_path = os.path.join(CFG.MOUNT_POINT, package['path'])
                if os.path.exists(full_path):
                    header = rhn_pkg.get_package_header(filename=full_path)
                    server_packages.processPackageKeyAssociations(header,
                                                                  package['checksum_type'], package['checksum'])


class SourcePackageImport(Import):

    def __init__(self, batch, backend, caller=None, update_last_modified=0):
        Import.__init__(self, batch, backend)
        self._update_last_modified = update_last_modified
        self.ignoreUploaded = 1
        self.sourceRPMs = {}
        self.groups = {}
        self.checksums = {}

    def preprocess(self):
        for package in self.batch:
            self._processPackage(package)

    def fix(self):
        self.backend.lookupSourceRPMs(self.sourceRPMs)
        self.backend.lookupPackageGroups(self.groups)
        self.backend.lookupChecksums(self.checksums)
        self.__postprocess()
        # Uniquify the packages
        uniqdict = {}
        for package in self.batch:
            # Unique key
            key = (package['org_id'], package['source_rpm_id'])
            if key not in uniqdict:
                uniqdict[key] = package
                continue
            else:
                self._comparePackages(package, uniqdict[key])
                # And invalidate it
                package.ignored = 1
                package.first_package = uniqdict[key]

    def submit(self):
        upload_force = self.uploadForce
        if not upload_force and self._update_last_modified:
            # # Force it just a little bit - kind of hacky
            upload_force = 0.5
        try:
            self.backend.processSourcePackages(self.batch,
                                               uploadForce=upload_force,
                                               forceVerify=self.forceVerify,
                                               ignoreUploaded=self.ignoreUploaded,
                                               transactional=self.transactional)
        except:
            # Oops
            self.backend.rollback()
            raise
        self.backend.commit()
        if not self._update_last_modified:
            # Go though the list of objects and clear out the ones that have a
            # force of 0.5
            for p in self.batch:
                if p.diff and p.diff.level == 0.5:
                    # Ignore this difference completely
                    p.diff = None
                    # Leave p.diff_result in place

    def _comparePackages(self, package1, package2):
        if (package1['checksum_type'] == package2['checksum_type']
                and package1['checksum'] == package2['checksum']):
            return
        # XXX Handle this better
        raise Exception("Different packages in the same batch")

    def _processPackage(self, package):
        Import._processPackage(self, package)
        # Fix the arch
        package.arch = 'src'
        package.source_rpm = package['source_rpm']
        group = self._fix_encoding(package['package_group']).strip()
        if group not in self.groups:
            self.groups[group] = None
        sourceRPM = package['source_rpm']
        if not sourceRPM:
            # Should not happen
            raise Exception("Source RPM %s does not exist")
        self.sourceRPMs[sourceRPM] = None

        checksumTuple = (package['checksum_type'], package['checksum'])
        if checksumTuple not in self.checksums:
            self.checksums[checksumTuple] = None

        sigchecksumTuple = (package['sigchecksum_type'], package['sigchecksum'])
        if sigchecksumTuple not in self.checksums:
            self.checksums[sigchecksumTuple] = None

    def __postprocess(self):
        # Gather the IDs we've found

        for package in self.batch:
            if package.ignored:
                # Skip it
                continue
            # Only deal with packages
            self.__postprocessPackage(package)

    def __postprocessPackage(self, package):
        # Set the ids
        package['package_group'] = self.groups[self._fix_encoding(package['package_group']).strip()]
        package['source_rpm_id'] = self.sourceRPMs[package['source_rpm']]
        package['checksum_id'] = self.checksums[(package['checksum_type'],
                                                 package['checksum'])]
        package['sigchecksum_id'] = self.checksums[(package['sigchecksum_type'],
                                                    package['sigchecksum'])]

    def _cleanup_object(self, object):
        Import._cleanup_object(self, object)
        if object.ignored:
            object.id = object.first_package.id


def packageImporter(batch, backend, source=0, caller=None):
    if source:
        return SourcePackageImport(batch, backend, caller=caller)
    return PackageImport(batch, backend, caller=caller)
  07070100000190000081B40000000000000000000000015FBBE8EE0000197E000000000000000000000000000000000000003400000000spacewalk-backend/server/importlib/packageUpload.py   #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Package import code on the app side
#

from uyuni.common import rhn_rpm
from spacewalk.common.rhnLog import log_debug
from spacewalk.common.rhnException import rhnFault

from spacewalk.server import rhnChannel, taskomatic, rhnSQL
from spacewalk.server.importlib.backendOracle import SQLBackend
from spacewalk.server.importlib.headerSource import createPackage
from spacewalk.server.importlib.importLib import Collection
from spacewalk.server.importlib.packageImport import packageImporter
from spacewalk.server.importlib.errataCache import schedule_errata_cache_update


def uploadPackages(info, source=0, force=0, caller=None):
    log_debug(4, source, force, caller)
    batch = Collection()
    packageList = info.get("packages") or []
    if not packageList:
        raise Exception("Nothing to do")

    org_id = info.get('orgId')
    if org_id == '':
        org_id = None

    if source:
        channelList = []
    else:
        channelList = info.get("channels") or []

    for package in packageList:
        p = __processPackage(package, org_id, channelList, source)
        batch.append(p)

    backend = SQLBackend()
    importer = packageImporter(batch, backend, source, caller=caller)

    importer.setUploadForce(force)

    importer.run()
    if not source:
        importer.subscribeToChannels()

    # Split the result in two lists - already uploaded and new packages
    newpkgs = []
    uploaded = []
    for pkg in importer.status():
        if pkg.ignored or pkg.diff:
            uploaded.append(pkg)
        else:
            newpkgs.append(pkg)

    # Schedule an errata cache update only if we touched the channels
    if not source:
        # makes sense only for binary packages
        schedule_errata_cache_update(importer.affected_channels)
        taskomatic.add_to_repodata_queue_for_channel_package_subscription(
            importer.affected_channels, batch, caller)
        rhnSQL.commit()

    return _formatStatus(uploaded), _formatStatus(newpkgs)


def __processPackage(package, org_id, channels, source):
    log_debug(4, org_id, channels, source)
    if 'md5sum' in package:  # for old rhnpush compatibility
        package['checksum_type'] = 'md5'
        package['checksum'] = package['md5sum']
        del(package['md5sum'])

    if 'checksum' not in package:
        raise rhnFault(50, "The package's checksum digest has not been specified")
    if 'packageSize' not in package:
        raise rhnFault(50, "The package size has not been specified")

    header = rhn_rpm.headerLoad(package['header'].data)
    if not header:
        raise rhnFault(50)
    packageSize = package['packageSize']
    relpath = package.get('relativePath')

    if 'header_start' in package:
        header_start = package['header_start']
    else:
        header_start = 0
    if 'header_end' in package:
        header_end = package['header_end']
    else:
        # Just say the whole package
        header_end = packageSize

    checksum_type = package['checksum_type']
    checksum = package['checksum']
    p = createPackage(header, packageSize, checksum_type, checksum, relpath, org_id,
                      header_start, header_end, channels)
    return p


def _formatStatus(status):
    objlist = []
    for pkg in status:
        name = pkg.name
        epoch = pkg.evr[0]
        if epoch is None:
            epoch = ""
        else:
            epoch = str(epoch)
        version = pkg.evr[1]
        release = pkg.evr[2]
        arch = pkg.arch
        hash = {}
        ignored = pkg.ignored
        if ignored is None:
            ignored = 0
        hash['ignored'] = ignored
        hash['diff'] = _dump(pkg.diff)
        objlist.append([name, version, release, epoch, arch, hash])
    return objlist


def _dump(object):
    if object is None:
        return ''
    from uyuni.common.usix import IntType, StringType, FloatType
    if type(object) in (IntType, StringType, FloatType):
        return object
    from uyuni.common.usix import ListType
    if isinstance(object, ListType):
        return list(map(_dump, object))
    from uyuni.common.usix import TupleType
    if isinstance(object, TupleType):
        return tuple(map(_dump, object))
    from uyuni.common.usix import DictType
    if isinstance(object, DictType):
        dict = {}
        for h, v in list(object.items()):
            dict[_dump(h)] = _dump(v)
        return dict
    return str(object)


def listChannelsSource(channelList):
    return _listChannels(channelList, True, False)


def listChannels(channelList):
    return _listChannels(channelList, False, False)


def listChannelsChecksum(channelList):
    return _listChannels(channelList, False, True)


def _listChannels(channelList, is_source, include_checksums):
    # Lists the packages from these channels
    # Uniquify the channels
    channels = set(channelList)
    rez = []
    for channel in channels:
        c_info = rhnChannel.channel_info(channel)
        if not c_info:
            # No packages in this channel
            continue

        if is_source:
            packageList = rhnChannel.list_packages_source(c_info['id'])
        else:
            if include_checksums:
                packageList = rhnChannel.list_packages_checksum_sql(
                    c_info['id'])
            else:
                packageList = rhnChannel.list_packages_sql(c_info['id'])
        for p in packageList:
            if is_source:
                for pkg in range(len(p)):
                    if p[pkg] is None:
                        p[pkg] = ""
                print(p)
                rez.append([p[0], p[1], p[2], p[3], channel])
            else:
                if include_checksums:
                    rez.append([p[0], p[1], p[2], p[3], p[4], p[6], p[7],
                                channel])
                else:
                    rez.append([p[0], p[1], p[2], p[3], p[4], channel])
    return rez
  07070100000191000081B40000000000000000000000015FBBE8EE00000422000000000000000000000000000000000000003900000000spacewalk-backend/server/importlib/productNamesImport.py  #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Product Names Import

from .importLib import Import


class ProductNamesImport(Import):

    def __init__(self, batch, backend):
        Import.__init__(self, batch, backend)

    def preprocess(self):
        pass

    def fix(self):
        pass

    def submit(self):
        try:
            self.backend.processProductNames(self.batch)
        except:
            self.backend.rollback()
            raise
        self.backend.commit()
  07070100000192000081B40000000000000000000000015FBBE8EE000007A6000000000000000000000000000000000000003F00000000spacewalk-backend/server/importlib/supportInformationImport.py    #
# Copyright (c) 2012 SUSE LLC
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Support Information Import

from .importLib import GenericPackageImport
from spacewalk.satellite_tools import syncCache

class SupportInformationImport(GenericPackageImport):
    def __init__(self, batch, backend):
        GenericPackageImport.__init__(self, batch, backend)
        self._cache = syncCache.ShortPackageCache()
        self._data = []

    def preprocess(self):
        channelLabels = {}
        keywords = {}
        for item in self.batch:
            if item['channel'] not in channelLabels:
                channelLabels[item['channel']] = None
                self.backend.lookupChannels(channelLabels)
            if item['keyword'] not in keywords:
                keywords[item['keyword']] = self.backend.lookupKeyword(item['keyword'])
            pkg = self._cache.cache_get(item['pkgid'])
            if not pkg:
                continue
            if not (channelLabels[item['channel']] and channelLabels[item['channel']]['id']):
                continue
            self.backend.lookupPackageIdFromPackage(pkg)
            if pkg.id is None:
                continue

            item['package_id'] = pkg.id
            item['channel_id'] = channelLabels[item['channel']]['id']
            item['keyword_id'] = keywords[item['keyword']]
            self._data.append(item)

    def fix(self):
        pass

    def submit(self):
        try:
            self.backend.processSupportInformation(self._data)
        except:
            self.backend.rollback()
            raise
        self.backend.commit()

  07070100000193000081B40000000000000000000000015FBBE8EE000023CB000000000000000000000000000000000000003900000000spacewalk-backend/server/importlib/suseProductsImport.py  #
# Copyright (c) 2014 SUSE LLC
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# SUSE Products Import

from .importLib import GenericPackageImport
from spacewalk.satellite_tools import syncCache

class SuseProductsImport(GenericPackageImport):
    def __init__(self, batch, backend):
        GenericPackageImport.__init__(self, batch, backend)
        self._cache = syncCache.ShortPackageCache()
        self._data = []

    def preprocess(self):
        archs = {}
        families = {}
        for item in self.batch:
            if item['arch'] not in archs:
                archs[item['arch']] = None
                self.backend.lookupPackageArches(archs)
            item['arch_type_id'] = archs[item['arch']]
            if item['release'] == 'None':
                item['release'] = None
            if item['version'] == 'None':
                item['version'] = None
            if item['channel_family_label'] not in families:
                fam = {}
                fam[item['channel_family_label']] = None
                self.backend.lookupChannelFamilies(fam)
                families[item['channel_family_label']] = fam[item['channel_family_label']]
            item['channel_family_id'] = families[item['channel_family_label']]
            self._data.append(item)

    def fix(self):
        pass

    def submit(self):
        try:
            self.backend.processSuseProducts(self._data)
        except:
            self.backend.rollback()
            raise
        self.backend.commit()

class SuseProductChannelsImport(GenericPackageImport):
    def __init__(self, batch, backend):
        GenericPackageImport.__init__(self, batch, backend)
        self._cache = syncCache.ShortPackageCache()
        self._data = []

    def preprocess(self):
        pid_trans = {}
        for item in self.batch:
            channel = {}
            intpid = item['product_id']
            if intpid not in pid_trans:
                pid_trans[intpid] = self.backend.lookupSuseProductIdByProductId(intpid)
            item['product_id'] = pid_trans[intpid]
            channel[item['channel_label']] = None
            self.backend.lookupChannels(channel)
            if channel[item['channel_label']]:
                item['channel_id'] = channel[item['channel_label']]['id']
            else:
                continue
            if item['parent_channel_label'] == 'None':
                item['parent_channel_label'] = None
            self._data.append(item)

    def fix(self):
        pass

    def submit(self):
        try:
            self.backend.processSuseProductChannels(self._data)
        except:
            self.backend.rollback()
            raise
        self.backend.commit()

class SuseUpgradePathsImport(GenericPackageImport):
    def __init__(self, batch, backend):
        GenericPackageImport.__init__(self, batch, backend)
        self._cache = syncCache.ShortPackageCache()
        self._data = []

    def preprocess(self):
        pid_trans = {}
        for item in self.batch:
            if item['from_product_id'] not in pid_trans:
                pid_trans[item['from_product_id']] = self.backend.lookupSuseProductIdByProductId(item['from_product_id'])
            item['from_pdid'] = pid_trans[item['from_product_id']]
            if item['to_product_id'] not in pid_trans:
                pid_trans[item['to_product_id']] = self.backend.lookupSuseProductIdByProductId(item['to_product_id'])
            item['to_pdid'] = pid_trans[item['to_product_id']]
            self._data.append(item)

    def fix(self):
        pass

    def submit(self):
        try:
            self.backend.processSuseUpgradePaths(self._data)
        except:
            self.backend.rollback()
            raise
        self.backend.commit()

class SuseProductExtensionsImport(GenericPackageImport):
    def __init__(self, batch, backend):
        GenericPackageImport.__init__(self, batch, backend)
        self._cache = syncCache.ShortPackageCache()
        self._data = []

    def preprocess(self):
        pid_trans = {}
        for item in self.batch:
            if item['product_id'] not in pid_trans:
                pid_trans[item['product_id']] = self.backend.lookupSuseProductIdByProductId(item['product_id'])
            item['product_pdid'] = pid_trans[item['product_id']]
            if item['root_id'] not in pid_trans:
                pid_trans[item['root_id']] = self.backend.lookupSuseProductIdByProductId(item['root_id'])
            item['root_pdid'] = pid_trans[item['root_id']]
            if item['ext_id'] not in pid_trans:
                pid_trans[item['ext_id']] = self.backend.lookupSuseProductIdByProductId(item['ext_id'])
            item['ext_pdid'] = pid_trans[item['ext_id']]
            self._data.append(item)

    def fix(self):
        pass

    def submit(self):
        try:
            self.backend.processSuseProductExtensions(self._data)
        except:
            self.backend.rollback()
            raise
        self.backend.commit()

class SuseProductRepositoriesImport(GenericPackageImport):
    def __init__(self, batch, backend):
        GenericPackageImport.__init__(self, batch, backend)
        self._cache = syncCache.ShortPackageCache()
        self._data = []

    def preprocess(self):
        pid_trans = {}
        rid_trans = {}
        for item in self.batch:
            if item['product_id'] not in pid_trans:
                pid_trans[item['product_id']] = self.backend.lookupSuseProductIdByProductId(item['product_id'])
            item['product_pdid'] = pid_trans[item['product_id']]
            if item['rootid'] not in pid_trans:
                pid_trans[item['rootid']] = self.backend.lookupSuseProductIdByProductId(item['rootid'])
            item['root_pdid'] = pid_trans[item['rootid']]
            if item['repo_id'] not in rid_trans:
                rid_trans[item['repo_id']] = self.backend.lookupRepoIdBySCCRepoId(item['repo_id'])
            item['repo_pdid'] = rid_trans[item['repo_id']]
            self._data.append(item)

    def fix(self):
        pass

    def submit(self):
        try:
            self.backend.processSuseProductRepositories(self._data)
        except:
            self.backend.rollback()
            raise
        self.backend.commit()

class SCCRepositoriesImport(GenericPackageImport):
    def __init__(self, batch, backend):
        GenericPackageImport.__init__(self, batch, backend)
        self._cache = syncCache.ShortPackageCache()
        self._data = []

    def preprocess(self):
        for item in self.batch:
            self._data.append(item)

    def fix(self):
        pass

    def submit(self):
        try:
            self.backend.processSCCRepositories(self._data)
        except:
            self.backend.rollback()
            raise
        self.backend.commit()

class SuseSubscriptionsImport(GenericPackageImport):
    def __init__(self, batch, backend):
        GenericPackageImport.__init__(self, batch, backend)
        self._cache = syncCache.ShortPackageCache()
        self._sub_data = []

    def preprocess(self):
        for item in self.batch:
            item['org_id'] = 1
            if item['system_entitlement'] == "0":
                families = {}
                families[item['label']] = None
                self.backend.lookupChannelFamilies(families)
                item['channel_family_id'] = families[item['label']]
                self._sub_data.append(item)

    def submit(self):
        try:
            self.backend.processSuseSubscriptions(self._sub_data)
        except:
            self.backend.rollback()
            raise
        self.backend.commit()

class ClonedChannelsImport(GenericPackageImport):
    def __init__(self, batch, backend):
        GenericPackageImport.__init__(self, batch, backend)
        self._cache = syncCache.ShortPackageCache()
        self._data = []

    def preprocess(self):
        pid_trans = {}
        for item in self.batch:
            channel = {}
            channel[item['orig']] = None
            self.backend.lookupChannels(channel)
            if channel[item['orig']]:
                item['orig_id'] = channel[item['orig']]['id']
            else:
                # orig channel not synced - skip
                continue
            channel = {}
            channel[item['clone']] = None
            self.backend.lookupChannels(channel)
            if channel[item['clone']]:
                item['id'] = channel[item['clone']]['id']
            else:
                # channel not synced - skip
                continue
            self._data.append(item)

    def fix(self):
        pass

    def submit(self):
        try:
            self.backend.processClonedChannels(self._data)
        except:
            self.backend.rollback()
            raise
        self.backend.commit()
 07070100000194000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002800000000spacewalk-backend/server/importlib/test   07070100000195000081B40000000000000000000000015FBBE8EE00000657000000000000000000000000000000000000003E00000000spacewalk-backend/server/importlib/test/test_backendOracle.py #!/usr/bin/python

from spacewalk.server import rhnSQL


from spacewalk.server.importlib.backendOracle import OracleBackend
from spacewalk.server.importlib.backendLib import DBint, DBstring, DBdateTime, DBblob

tabs = OracleBackend.tables
utabs = {}

# convert table names to uppercase
for k, v in list(tabs.items()):
    utabs[k.upper()] = v


rhnSQL.initDB()
h = rhnSQL.prepare("""select table_name, column_name, data_type, data_length
        from user_tab_columns""")
h.execute()
rows = h.fetchall_dict()

# 'translate' oracle type to DBtypes
ora2py = {
    'NUMBER':       'DBint',
    'DATE':         'DBdateTime',
    'VARCHAR2':     'DBstring',
    'CHAR':         'DBstring',
    'BLOB':         'DBblob',
}

for i in rows:
    if i['table_name'] in utabs:
        # table exists in backendOracle
        cols = utabs[i['table_name']]
        if i['column_name'].lower() in cols.fields:
            # column defined in backendOracle
            t = cols.fields[i['column_name'].lower()]

            # check column type
            if not isinstance(t, eval(ora2py[i['data_type']])):
                print(("%s.%s:  %s vs. %s" % (i['table_name'],
                                             i['column_name'], i['data_type'], t.__class__)))
            elif isinstance(t, DBstring) and t.limit != i['data_length']:
                # for VARCHAR2/DBstring check also size
                print(("%s.%s: DBstring(%d) vs. VARCHAR2(%s)" % (
                    i['table_name'], i['column_name'], t.limit, i['data_length'])))
            else:
                print(("%s.%s: OK" % (i['table_name'], i['column_name'])))
 07070100000196000081B40000000000000000000000015FBBE8EE00001265000000000000000000000000000000000000003C00000000spacewalk-backend/server/importlib/test/test_blob_update.py   #!/usr/bin/python
#
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Test for blob updates
#

"""
Test module for blob updates.
To create the table for this test run:

drop table test_blob_update;

create table test_blob_update
    (id1 int not null, id2 int, val1 blob, val2 blob, nval int not null);
"""

import sys
from spacewalk.server import rhnSQL
from spacewalk.server.importlib.backendLib import Table, DBblob, DBint, TableUpdate, \
    TableInsert


def main():
    rhnSQL.initDB()

    blob_values1 = [
        # Regular update
        [1, 1,     'value 11', 'value 12', 1],
        [2, 1,     'value 21', 'value 22', 2],
        # Update with one of the primary keys being None
        [3, None,  'value 31', 'value 32', 3],
        [4, None,  'value 41', 'value 42', 4],
        # Test for writing an empty string into the blob
        [5, 5,     '',         'value 52', 5],
        # Test for writing a shorter string into the blob
        [6, 6,     'value 61', 'value 62', 6],
    ]
    newval1_1 = 'new value 11'
    newval1_2 = 'new value 12'
    newval3_1 = 'new value 31 ' * 1024
    newval3_2 = 'new value 32' * 2048
    newval5_1 = 'new value 51'
    newval5_2 = ''
    newval6_1 = 'v61'
    newval6_2 = 'v61'
    blob_values2 = blob_values1[:]
    for r in [0, 2, 4, 5]:
        # Copy the old values
        blob_values2[r] = blob_values1[r][:]
    blob_values2[0][2:5] = [newval1_1, newval1_2, 11]
    blob_values2[2][2:5] = [newval3_1, newval3_2, 2]
    blob_values2[4][2:5] = [newval5_1, newval5_2, 33]
    blob_values2[5][2:5] = [newval6_1, newval6_2, 4]

    test_blob_update = Table("test_blob_update",
                             fields={
                                 'id1': DBint(),
                                 'id2': DBint(),
                                 'val1': DBblob(),
                                 'val2': DBblob(),
                                 'nval': DBint(),
                             },
                             # Setting the nullable column to be the first one, to force a specific codepath
                             pk=['id2', 'id1'],
                             nullable=['id2'],
                             )

    fields = ['id1', 'id2', 'val1', 'val2', 'nval']
    setup(test_blob_update, blob_values1, fields)
    print("Insert test")
    verify(blob_values1)

    t = TableUpdate(test_blob_update, rhnSQL)

    rows = [0, 2, 4, 5]
    values = _build_update_hash(fields, blob_values2, rows)

    t.query(values)
    rhnSQL.commit()

    print("Updates test")
    verify(blob_values2)


def _build_update_hash(fields, blob_values, rows):
    values = {}
    for f in fields:
        values[f] = []
    for i in range(len(rows)):
        row = blob_values[rows[i]]
        for j in range(len(fields)):
            f = fields[j]
            values[f].append(row[j])

    return values


def setup(table, blob_values, fields):
    h = rhnSQL.prepare("delete from test_blob_update")
    h.execute()

    hash_values = {}
    for f in fields:
        hash_values[f] = []
    for i in range(len(blob_values)):
        for j in range(len(fields)):
            f = fields[j]
            h = hash_values[f]
            h.append(blob_values[i][j])
    t = TableInsert(table, rhnSQL)
    t.query(hash_values)
    rhnSQL.commit()


def verify(blob_values):
    q = """
        select val1, val2 from test_blob_update where id1 = :id1 and %s
    """
    for v in blob_values:
        i1 = v[0]
        i2 = v[1]
        v1 = v[2]
        v2 = v[3]
        hval = {'id1': i1}
        if i2 is None:
            s = "id2 is null"
        else:
            s = "id2 = :id2"
            hval['id2'] = i2
        h = rhnSQL.prepare(q % s)
        h.execute(**hval)
        row = h.fetchone_dict()
        val1 = row['val1']
        val2 = row['val2']

        val1_val = rhnSQL.read_lob(val1)
        val2_val = rhnSQL.read_lob(val2)
        assert v1 == val1_val, "Not equal: %s, %s" % (repr(v1), repr(val1_val))
        assert v2 == val2_val, "Not equal: %s, %s" % (repr(v2), repr(val2_val))
    print("Verification passes")

if __name__ == '__main__':
    sys.exit(main() or 0)
   07070100000197000081B40000000000000000000000015FBBE8EE00000802000000000000000000000000000000000000003800000000spacewalk-backend/server/importlib/test/test_ks_tree.py   #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

from spacewalk.server import rhnSQL
from spacewalk.server.importlib.importLib import KickstartableTree, KickstartFile
from spacewalk.server.importlib.kickstartImport import KickstartableTreeImport
from spacewalk.server.importlib.backendOracle import OracleBackend

ks_trees = [
    KickstartableTree().populate({
        'channel': 'redhat-linux-i386-8.0',
        'base_path': 'foo/bar/baz',
        'label': 'redhat-linux-i386-8.0',
        'boot_image': 'ks-rh',
        'files': [
            KickstartFile().populate({
                'relative_path': 'foo/foo1',
                'checksum_type': 'md5',
                'checksum': 'axbycz',
                'last_modified': '2003-10-11 12:13:14',
                'file_size': 12345,
            }),
            KickstartFile().populate({
                'relative_path': 'foo/foo4',
                'checksum_type': 'md5',
                'checksum': 'axbycz',
                'last_modified': '2003-10-11 12:13:14',
                'file_size': 123456,
            }),
            KickstartFile().populate({
                'relative_path': 'foo/foo3',
                'checksum_type': 'md5',
                'checksum': 'axbycz',
                'last_modified': '2003-10-11 12:13:14',
                'file_size': 1234567,
            }),
        ],
    }),
]

rhnSQL.initDB()

backend = OracleBackend()
backend.init()

ki = KickstartableTreeImport(ks_trees, backend)
ki.run()
  07070100000198000081B40000000000000000000000015FBBE8EE000008CA000000000000000000000000000000000000005400000000spacewalk-backend/server/importlib/test/test_strict_channel_package_subscription.py   #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

# Script to test channel package snapshot invalidation
# Related to the testing of bug #162996

# To set things up:
# - create custom channel mibanescu-test2 (need to be logged in as mibanescu,
# otherwise change the org_id
# - subscribe a system to it
# - use rhnpush to upload a bunch of packages, including useless-1.0.0-2 and 3
# - snapshot the system
#     exec rhn_server.snapshot_server(1004505404, 'some_reason')
# - select snapshot_id from rhnSnapshotChannel where channel_id = XXX
# - select server_id, reason, invalid from rhnsnapshot where id = 236527
#   invalid should be null
# run this script
#   invalid should become non-null (2 in my tests)

import sys

from spacewalk.server import rhnSQL
from spacewalk.server.importlib import importLib, packageImport, backendOracle


def main():
    rhnSQL.initDB()

    channel = {'label': 'mibanescu-test2'}

    orgid = 1198839
    package_template = {
        'name': 'useless',
        'version': '1.0.0',
        'arch': 'noarch',
        'org_id': orgid,
    }

    batch = []
    p = importLib.IncompletePackage()
    p.populate(package_template)
    p['release'] = '2'
    p['channels'] = [channel]
    batch.append(p)

    p = importLib.IncompletePackage()
    p.populate(package_template)
    p['release'] = '3'
    p['channels'] = [channel]
    batch.append(p)

    backend = backendOracle.OracleBackend()
    cps = packageImport.ChannelPackageSubscription(batch, backend,
                                                   caller="misa.testing", strict=1)
    cps.run()
    print((cps.affected_channel_packages))

if __name__ == '__main__':
    sys.exit(main() or 0)
  07070100000199000081B40000000000000000000000015FBBE8EE00001CA0000000000000000000000000000000000000002F00000000spacewalk-backend/server/importlib/userAuth.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Authentication
#

import time
import sys
from spacewalk.common.rhnLog import log_debug
from spacewalk.common.rhnException import rhnFault
from spacewalk.common.rhnTranslate import _
from spacewalk.common.rhnTB import add_to_seclist

from spacewalk.server import rhnSQL, rhnUser


class UserAuth:

    def __init__(self):
        self.org_id = None
        self.user_id = None
        self.groups = []

    def auth(self, login, password):
        add_to_seclist(password)
        try:
            self.groups, self.org_id, self.user_id = getUserGroups(login, password)
        except rhnFault:
            e = sys.exc_info()[1]
            if e.code == 2:
                # invalid login/password; set timeout to baffle
                # brute force password guessing attacks (BZ 672163)
                time.sleep(2)
            raise

        log_debug(4, "Groups: %s; org_id: %s; user_id: %s" % (
            self.groups, self.org_id, self.user_id))

    def auth_session(self, session_string):
        user_instance = rhnUser.session_reload(session_string)
        try:
            self.groups, self.org_id, self.user_id = getUserGroupsFromUserInstance(user_instance)
        except rhnFault:
            e = sys.exc_info()[1]
            if e.code == 2:
                # invalid login/password; set timeout to baffle
                # brute force password guessing attacks (BZ 672163)
                time.sleep(2)
            raise

        log_debug(4, "Groups: %s; org_id: %s; user_id: %s" % (
            self.groups, self.org_id, self.user_id))

    def isOrgAdmin(self):
        if 'org_admin' in self.groups:
            log_debug(4, "Is org admin")
            return 1
        log_debug(4, "Is NOT org admin")
        return 0

    def isChannelAdmin(self):
        if 'org_admin' in self.groups:
            log_debug(4, "Is channel admin because isa org admin")
            return 1
        if 'channel_admin' in self.groups:
            log_debug(4, "Is channel admin")
            return 1
        log_debug(4, "Is NOT channel admin")
        return 0

    def authzOrg(self, info):
        # This function is a lot more complicated than it should be; the
        # corner case is pushes without a channel; we have to deny regular
        # users the ability to push to their org.

        # If the org id is not specified, default to the user's org id
        if 'orgId' not in info:
            info['orgId'] = self.org_id
        log_debug(4, "info[orgId]", info['orgId'], "org id", self.org_id)

        org_id = info['orgId']

        if org_id == '':
            # Satellites are not allowwd to push in the null org
            raise rhnFault(4,
                           _("You are not authorized to manage packages in the null org"))

        if org_id and self.org_id != org_id:
            # Not so fast...
            raise rhnFault(32,
                           _("You are not allowed to manage packages in the %s org") %
                           org_id)

        # Org admins and channel admins have full privileges; we could use
        # user_manages_channes, except for the case where there are no chanels

        if self.isOrgAdmin() or self.isChannelAdmin():
            log_debug(4, "Org authorized (org_admin or channel_admin)")
            return

        # regular user at this point... check if the user manages any channels
        if user_manages_channels(self.user_id):
            log_debug(4, "Org authorized (user manages a channel)")
            return

        # ok, you're a regular user who doesn't manage any channels.
        # take a hike.
        raise rhnFault(32,
                       _("You are not allowed to perform administrative tasks"))

    def authzChannels(self, channels):
        log_debug(4, channels)
        if not channels:
            return

        # rhn_channel.user_role_check checks for the ownership of the channel
        # by this user's org

        h = rhnSQL.prepare("""
            select rhn_channel.user_role_check(id, :user_id, 'manage') manage
              from rhnChannel
             where label = :channel
        """)

        for channel in channels:
            h.execute(channel=channel, user_id=self.user_id)

            row = h.fetchone_dict()
            # Either the channel doesn't exist, or not allowed to manage it
            if not row or not row['manage']:
                raise rhnFault(32,
                               _("You are not allowed to manage channel %s, or that "
                                 "channel does not exist") % channel)

            log_debug(4, "User %s allowed to manage channel %s" %
                      (self.user_id, channel))

        return None


# wregglej 12/21/05 This should only be used when the user instance has already been reloaded from
# a session.
def getUserGroupsFromUserInstance(user_instance):
    log_debug(4, user_instance.getid())
    user = user_instance

    if not user:
        log_debug("null user")
        raise rhnFault(2)

    # Don't need to check the password, the session should have already been checked.

    # Get the org id
    org_id = user.contact['org_id']
    user_id = user.getid()
    h = rhnSQL.prepare("""
        select ugt.label
          from rhnUserGroupType ugt,
               rhnUserGroup ug,
               rhnUserGroupMembers ugm
         where ugm.user_id = :user_id
               and ugm.user_group_id = ug.id
               and ug.group_type = ugt.id
    """)
    h.execute(user_id=user_id)
    groups = []
    while 1:
        row = h.fetchone_dict()
        if not row:
            break
        groups.append(row['label'])
    return groups, org_id, user_id


def getUserGroups(login, password):
    # Authenticates a user and returns the list of groups it belongs
    # to, and the org id
    add_to_seclist(password)
    log_debug(4, login)
    user = rhnUser.search(login)

    if not user:
        log_debug("rhnUser.search failed")
        raise rhnFault(2)

    # Check the user's password
    if not user.check_password(password):
        log_debug("user.check_password failed")
        raise rhnFault(2)

    if rhnUser.is_user_disabled(username):
        msg = _("""
               %s Account has been deactivated on this server.
               Please contact your Org administrator for more help.""")
        raise rhnFault(1, msg % username, explain=0)

    return getUserGroupsFromUserInstance(user)


def user_manages_channels(user_id):
    h = rhnSQL.prepare("""
        select distinct 1
          from rhnChannel
         where rhn_channel.user_role_check(id, :user_id, 'manage') = 1
    """)

    h.execute(user_id=user_id)
    row = h.fetchone_dict()

    return (row is not None)
0707010000019A000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002000000000spacewalk-backend/server/repomd   0707010000019B000081B40000000000000000000000015FBBE8EE0000009E000000000000000000000000000000000000002900000000spacewalk-backend/server/repomd/Makefile  # Makefile for the import code
#

TOP	= ../..

SUBDIR	= server/repomd

SPACEWALK_FILES	= __init__ mapper domain repository view

include $(TOP)/Makefile.defs
  0707010000019C000081B40000000000000000000000015FBBE8EE00000267000000000000000000000000000000000000002C00000000spacewalk-backend/server/repomd/__init__.py   #
# Copyright (c) 2008--2013 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
 0707010000019D000081B40000000000000000000000015FBBE8EE00000BE0000000000000000000000000000000000000002A00000000spacewalk-backend/server/repomd/domain.py #
# Copyright (c) 2008--2018 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
#   Domain Classes for generating repository metadata from RHN info.
#


class Channel:

    """ A pure data object representing an RHN Channel. """

    def __init__(self, channel_id):
        self.id = channel_id

        self.label = None
        self.name = None
        self.checksum_type = None

        self.num_packages = 0
        self.packages = []
        self.errata = []
        self.updateinfo = None
        self.comps = None
        self.modules = None


class Package:

    """ A pure data object representing an RHN Package. """

    def __init__(self, package_id):
        self.id = package_id

        self.name = None
        self.version = None
        self.release = None
        self.epoch = 0
        self.arch = None

        self.checksum = None
        self.checksum_type = None
        self.summary = None
        self.description = None
        self.vendor = None
        self.build_time = None
        self.package_size = None
        self.payload_size = None
        self.installed_size = None
        self.header_start = None
        self.header_end = None
        self.package_group = None
        self.build_host = None
        self.copyright = None
        self.filename = None
        self.source_rpm = None

        self.files = []

        self.provides = []
        self.requires = []
        self.conflicts = []
        self.obsoletes = []
        self.supplements = []
        self.enhances = []
        self.suggests = []
        self.recommends = []

        self.changelog = []


class Erratum:

    """ An object representing a single update to a channel. """

    def __init__(self, erratum_id):
        self.id = erratum_id
        self.readable_id = None
        self.title = None
        self.advisory_type = None
        self.version = None

        self.issued = None
        self.updated = None

        self.synopsis = None
        self.description = None

        self.bz_references = []
        self.cve_references = []

        # We don't want to pickle a single package multiple times,
        # So here's a list to store the ids and we can swap out the
        # Actual objects when its time to pickle. This should be replaced
        # With something that keeps the concepts seperate.
        self.package_ids = []
        self.packages = []


class RepoMD:

    def __init__(self, repomd_id, filename):
        self.id = repomd_id
        self.filename = filename
0707010000019E000081B40000000000000000000000015FBBE8EE00005C34000000000000000000000000000000000000002A00000000spacewalk-backend/server/repomd/mapper.py #
# Copyright (c) 2008--2018 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
#   Classes for mapping domain objects to the rhn db.
#

import os.path
import re
import time

from spacewalk.common import rhnCache
from spacewalk.common.rhnConfig import CFG
from uyuni.common.usix import UnicodeType
from spacewalk.server import rhnSQL

from . import domain


CACHE_PREFIX = "/var/cache/rhn/"


class ChannelMapper:

    """ Data Mapper for Channels to the RHN db. """

    def __init__(self, pkg_mapper, erratum_mapper, repomd_mapper):
        self.pkg_mapper = pkg_mapper
        self.erratum_mapper = erratum_mapper
        self.repomd_mapper = repomd_mapper

        self.channel_details_sql = rhnSQL.prepare("""
        select
            c.label,
            c.name,
            ct.label checksum_type
        from
            rhnChannel c,
            rhnChecksumType ct
        where c.id = :channel_id
          and c.checksum_type_id = ct.id
        """)

        self.channel_sql = rhnSQL.prepare("""
        select
            package_id
        from
            rhnChannelPackage
        where
            channel_id = :channel_id
        """)

        self.last_modified_sql = rhnSQL.prepare("""
        select
            to_char(last_modified, 'YYYYMMDDHH24MISS') as last_modified
        from
            rhnChannel
        where id = :channel_id
        """)

        self.errata_id_sql = rhnSQL.prepare("""
        select
            e.id
        from
            rhnChannelErrata ce,
            rhnErrata e
        where
            ce.channel_id = :channel_id
        and e.id = ce.errata_id
        """)

        self.comps_id_sql = rhnSQL.prepare("""
        select
            id
        from
            rhnChannelComps
        where
            channel_id = :channel_id
            and comps_type_id = 1
        order by id desc
        """)

        self.modules_id_sql = rhnSQL.prepare("""
        select
            id
        from
            rhnChannelComps
        where
            channel_id = :channel_id
            and comps_type_id = 2
        order by id desc
        """)

        self.cloned_from_id_sql = rhnSQL.prepare("""
        select
            original_id id
        from
            rhnChannelCloned
        where
            id = :channel_id
        """)

    def last_modified(self, channel_id):
        """ Get the last_modified field for the provided channel_id. """
        self.last_modified_sql.execute(channel_id=channel_id)
        return self.last_modified_sql.fetchone()[0]

    def get_channel(self, channel_id):
        """ Load the channel with id channel_id and its packages. """

        self.channel_details_sql.execute(channel_id=channel_id)
        details = self.channel_details_sql.fetchone()

        channel = domain.Channel(channel_id)

        channel.label = details[0]
        channel.name = details[1]
        channel.checksum_type = details[2]

        self.channel_sql.execute(channel_id=channel_id)
        package_ids = self.channel_sql.fetchall()

        channel.num_packages = len(package_ids)
        channel.packages = self._package_generator(package_ids)

        channel.errata = self._erratum_generator(channel_id)

        self.comps_id_sql.execute(channel_id=channel_id)
        comps_id = self.comps_id_sql.fetchone()
        self.modules_id_sql.execute(channel_id=channel_id)
        modules_id = self.modules_id_sql.fetchone()

        if comps_id:
            channel.comps = self.repomd_mapper.get_repomd(comps_id[0])
        if modules_id:
            channel.modules = self.repomd_mapper.get_repomd(modules_id[0])

        self.cloned_from_id_sql.execute(channel_id=channel_id)
        cloned_row = self.cloned_from_id_sql.fetchone()
        if cloned_row is not None:
            channel.cloned_from_id = cloned_row[0]
        else:
            channel.cloned_from_id = None

        return channel

    def _package_generator(self, package_ids):
        for package_id in package_ids:
            pkg = self.pkg_mapper.get_package(package_id[0])
            yield pkg

    def _erratum_generator(self, channel_id):
        self.errata_id_sql.execute(channel_id=channel_id)
        erratum_ids = self.errata_id_sql.fetchall()

        for erratum_id in erratum_ids:
            erratum = self.erratum_mapper.get_erratum(erratum_id[0])
            yield erratum


class CachedPackageMapper:

    """ Data Mapper for Packages to an on-disc cache. """

    def __init__(self, mapper):
        cache = rhnCache.Cache()

        # For more speed, we won't compress.
        # cache = rhnCache.CompressedCache(cache)

        cache = rhnCache.ObjectCache(cache)
        self.cache = rhnCache.NullCache(cache)
        self.mapper = mapper

    def get_package(self, package_id):
        """
        Load the package with id package_id.

        Load from the cache, if it is new enough. If not, fall back to the
        provided mapper.
        """
        package_id = str(package_id)

        last_modified = str(self.mapper.last_modified(package_id))
        last_modified = last_modified.replace(" ", "")
        last_modified = last_modified.replace(":", "")
        last_modified = last_modified.replace("-", "")

        cache_key = "repomd-packages/" + package_id
        if self.cache.has_key(cache_key, last_modified):
            package = self.cache.get(cache_key)
        else:
            package = self.mapper.get_package(package_id)
            self.cache.set(cache_key, package, last_modified)

        return package


class SqlPackageMapper:

    """ Data Mapper for Packages to the RHN db. """

    def __init__(self):
        self.details_sql = rhnSQL.prepare("""
        select
            pn.name,
            pevr.version,
            pevr.release,
            pevr.epoch,
            pa.label arch,
            c.checksum checksum,
            p.summary,
            p.description,
            p.vendor,
            p.build_time,
            p.package_size,
            p.payload_size,
            p.installed_size,
            p.header_start,
            p.header_end,
            pg.name package_group,
            p.build_host,
            p.copyright,
            p.path,
            sr.name source_rpm,
            p.last_modified,
            c.checksum_type
        from
            rhnPackage p,
            rhnPackageName pn,
            rhnPackageEVR pevr,
            rhnPackageArch pa,
            rhnPackageGroup pg,
            rhnSourceRPM sr,
            rhnChecksumView c
        where
            p.id = :package_id
        and p.name_id = pn.id
        and p.evr_id = pevr.id
        and p.package_arch_id = pa.id
        and p.package_group = pg.id
        and p.source_rpm_id = sr.id
        and p.checksum_id = c.id
        """)

        self.filelist_sql = rhnSQL.prepare("""
        select
            pc.name
        from
            rhnPackageCapability pc,
            rhnPackageFile pf
        where
            pf.package_id = :package_id
        and pf.capability_id = pc.id
        """)

        self.prco_sql = rhnSQL.prepare("""
        select
           'provides',
           pp.sense,
           pc.name,
           pc.version
        from
           rhnPackageCapability pc,
           rhnPackageProvides pp
        where
           pp.package_id = :package_id
           and pp.capability_id = pc.id
        union all
        select
           'requires',
           pr.sense,
           pc.name,
           pc.version
        from
           rhnPackageCapability pc,
           rhnPackageRequires pr
        where
           pr.package_id = :package_id
           and pr.capability_id = pc.id
        union all
        select
           'recommends',
           prec.sense,
           pc.name,
           pc.version
        from
           rhnPackageCapability pc,
           rhnPackageRecommends prec
        where
           prec.package_id = :package_id
           and prec.capability_id = pc.id
        union all
        select
           'supplements',
           supp.sense,
           pc.name,
           pc.version
        from
           rhnPackageCapability pc,
           rhnPackageSupplements supp
        where
           supp.package_id = :package_id
           and supp.capability_id = pc.id
        union all
        select
           'enhances',
           enh.sense,
           pc.name,
           pc.version
        from
           rhnPackageCapability pc,
           rhnPackageEnhances enh
        where
           enh.package_id = :package_id
           and enh.capability_id = pc.id
        union all
        select
           'suggests',
           sugg.sense,
           pc.name,
           pc.version
        from
           rhnPackageCapability pc,
           rhnPackageSuggests sugg
        where
           sugg.package_id = :package_id
           and sugg.capability_id = pc.id
        union all
        select
           'conflicts',
           pcon.sense,
           pc.name,
           pc.version
        from
           rhnPackageCapability pc,
           rhnPackageConflicts pcon
        where
           pcon.package_id = :package_id
           and pcon.capability_id = pc.id
        union all
        select
           'obsoletes',
           po.sense,
           pc.name,
           pc.version
        from
           rhnPackageCapability pc,
           rhnPackageObsoletes po
        where
           po.package_id = :package_id
           and po.capability_id = pc.id
        union all
        select
           'breaks',
           brks.sense,
           pc.name,
           pc.version
        from
           rhnPackageCapability pc,
           rhnPackageBreaks brks
        where
           brks.package_id = :package_id
           and brks.capability_id = pc.id
        union all
        select
           'predepends',
           pdep.sense,
           pc.name,
           pc.version
        from
           rhnPackageCapability pc,
           rhnPackagePredepends pdep
        where
           pdep.package_id = :package_id
           and pdep.capability_id = pc.id
        """)

        self.last_modified_sql = rhnSQL.prepare("""
        select
            to_char(last_modified, 'YYYYMMDDHH24MISS') as last_modified
        from
            rhnPackage
        where id = :package_id
        """)

        self.other_sql = rhnSQL.prepare("""
        select
            name,
            text,
            time
        from
            rhnPackageChangelog
        where package_id = :package_id
        """)

    def last_modified(self, package_id):
        """ Get the last_modified date on the package with id package_id. """
        self.last_modified_sql.execute(package_id=package_id)
        return self.last_modified_sql.fetchone()[0]

    def get_package(self, package_id):
        """ Get the package with id package_id from the RHN db. """
        package = domain.Package(package_id)
        self._fill_package_details(package)
        self._fill_package_prco(package)
        self._fill_package_filelist(package)
        self._fill_package_other(package)
        return package

    def _get_package_filename(self, pkg):
        if pkg[18]:
            path = pkg[18]
            return os.path.basename(path)
        else:
            name = pkg[0]
            version = pkg[1]
            release = pkg[2]
            arch = pkg[4]

            return "%s-%s-%s.%s.rpm" % (name, version, release, arch)

    def _fill_package_details(self, package):
        """ Load the packages basic details (summary, description, etc). """
        self.details_sql.execute(package_id=package.id)
        pkg = self.details_sql.fetchone()

        package.name = pkg[0]
        package.version = pkg[1]
        package.release = pkg[2]
        if pkg[3] is not None:
            package.epoch = pkg[3]
        package.arch = pkg[4]

        package.checksum_type = pkg[21]
        package.checksum = pkg[5]
        package.summary = string_to_unicode(pkg[6])
        package.description = string_to_unicode(pkg[7])
        package.vendor = string_to_unicode(pkg[8])

        package.build_time = oratimestamp_to_sinceepoch(pkg[9])

        package.package_size = pkg[10]
        package.payload_size = pkg[11]
        package.installed_size = pkg[12]
        package.header_start = pkg[13]
        package.header_end = pkg[14]
        package.package_group = pkg[15]
        package.build_host = pkg[16]
        package.copyright = string_to_unicode(pkg[17])
        package.filename = self._get_package_filename(pkg)
        package.source_rpm = pkg[19]

    def _fill_package_prco(self, package):
        """ Load the package's provides, requires, conflicts, obsoletes. """
        self.prco_sql.execute(package_id=package.id)
        deps = self.prco_sql.fetchall() or []

        for item in deps:
            version = item[3] or ""
            relation = ""
            release = None
            epoch = 0
            if version:
                sense = item[1] or 0
                relation = SqlPackageMapper.__get_relation(sense)

                vertup = version.split('-')
                if len(vertup) > 1:
                    version = vertup[0]
                    release = vertup[1]

                vertup = version.split(':')
                if len(vertup) > 1:
                    epoch = vertup[0]
                    version = vertup[1]

            dep = {'name': string_to_unicode(item[2]), 'flag': relation,
                   'version': version, 'release': release, 'epoch': epoch}

            if item[0] == "provides":
                package.provides.append(dep)
            elif item[0] == "requires":
                package.requires.append(dep)
            elif item[0] == "conflicts":
                package.conflicts.append(dep)
            elif item[0] == "obsoletes":
                package.obsoletes.append(dep)
            elif item[0] == "recommends":
                package.recommends.append(dep)
            elif item[0] == "supplements":
                package.supplements.append(dep)
            elif item[0] == "enhances":
                package.enhances.append(dep)
            elif item[0] == "suggests":
                package.suggests.append(dep)
            elif item[0] == "breaks":
                package.breaks.append(dep)
            elif item[0] == "predepends":
                package.predepends.append(dep)
            else:
                assert False, "Unknown PRCO type: %s" % item[0]

#    @staticmethod
    def __get_relation(sense):
        """ Convert the binary sense into a string. """

        # Flip the bits for easy comparison
        sense = sense & 0xf

        if sense == 2:
            relation = "LT"
        elif sense == 4:
            relation = "GT"
        elif sense == 8:
            relation = "EQ"
        elif sense == 10:
            relation = "LE"
        elif sense == 12:
            relation = "GE"
        else:
            assert False, "Unknown relation sense: %s" % sense

        return relation

    __get_relation = staticmethod(__get_relation)

    def _fill_package_filelist(self, package):
        """ Load the package's list of files. """
        self.filelist_sql.execute(package_id=package.id)
        files = self.filelist_sql.fetchall() or []

        for file_dict in files:
            package.files.append(string_to_unicode(file_dict[0]))

    def _fill_package_other(self, package):
        """ Load the package's changelog info. """

        self.other_sql.execute(package_id=package.id)
        log_data = self.other_sql.fetchall() or []

        for data in log_data:

            date = oratimestamp_to_sinceepoch(data[2])

            chglog = {'author': string_to_unicode(data[0]), 'date': date,
                      'text': string_to_unicode(data[1])}
            package.changelog.append(chglog)


class CachedErratumMapper:

    """ Data Mapper for Errata to an on-disc cache. """

    def __init__(self, mapper, package_mapper):
        self.package_mapper = package_mapper

        cache = rhnCache.Cache()
        cache = rhnCache.ObjectCache(cache)
        self.cache = rhnCache.NullCache(cache)
        self.mapper = mapper

    def get_erratum(self, erratum_id):
        """
        Load the erratum with id erratum_id.

        Load from the cache, if it is new enough. If not, fall back to the
        provided mapper.
        """
        erratum_id = str(erratum_id)

        last_modified = str(self.mapper.last_modified(erratum_id))
        last_modified = re.sub(" ", "", last_modified)
        last_modified = re.sub(":", "", last_modified)
        last_modified = re.sub("-", "", last_modified)

        cache_key = "repomd-errata/" + erratum_id
        if self.cache.has_key(cache_key, last_modified):
            erratum = self.cache.get(cache_key)
            for package_id in erratum.package_ids:
                package = self.package_mapper.get_package(package_id)
                erratum.packages.append(package)
        else:
            erratum = self.mapper.get_erratum(erratum_id)

            tmp_packages = erratum.packages
            erratum.packages = []
            self.cache.set(cache_key, erratum, last_modified)
            erratum.packages = tmp_packages

        return erratum


class SqlErratumMapper:

    def __init__(self, package_mapper):
        self.package_mapper = package_mapper

        self.last_modified_sql = rhnSQL.prepare("""
        select
            to_char(last_modified, 'YYYYMMDDHH24MISS') as last_modified
        from
            rhnErrata
        where id = :erratum_id
        """)

        self.erratum_details_sql = rhnSQL.prepare("""
        select
            advisory,
            advisory_name,
            advisory_type,
            advisory_rel,
            description,
            synopsis,
            TO_CHAR(issue_date, 'YYYY-MM-DD HH24:MI:SS') AS issue_date,
            TO_CHAR(update_date, 'YYYY-MM-DD HH24:MI:SS') AS update_date
        from
            rhnErrata
        where
            id = :erratum_id
       """)

        self.erratum_cves_sql = rhnSQL.prepare("""
        select
            cve.name as cve_name
        from
            rhnCVE cve,
            rhnErrataCVE ec
        where
            ec.errata_id = :erratum_id
        and ec.cve_id = cve.id
        """)

        self.erratum_bzs_sql = rhnSQL.prepare("""
        select
            bug_id,
            summary,
            href
        from
            rhnErrataBuglist
        where
            errata_id = :erratum_id
        """)

        self.erratum_packages_sql = rhnSQL.prepare("""
        select
            package_id
        from
            rhnErrataPackage
        where
            errata_id = :erratum_id
        """)

    def last_modified(self, erratum_id):
        """ Get the last_modified field for the provided erratum_id. """
        self.last_modified_sql.execute(erratum_id=erratum_id)
        return self.last_modified_sql.fetchone()[0]

    def get_erratum(self, erratum_id):
        """ Get the package with id package_id from the RHN db. """
        erratum = domain.Erratum(erratum_id)
        self._fill_erratum_details(erratum)

        # TODO: These two don't work on satellites.
        # We must not install the tables there
        self._fill_erratum_bz_references(erratum)
        self._fill_erratum_cve_references(erratum)

        self._fill_erratum_packages(erratum)
        return erratum

    def _fill_erratum_details(self, erratum):
        self.erratum_details_sql.execute(erratum_id=erratum.id)
        ertm = self.erratum_details_sql.fetchone()

        erratum.readable_id = ertm[0]
        erratum.title = ertm[1]

        if ertm[2] == 'Security Advisory':
            erratum.advisory_type = 'security'
        elif ertm[2] == 'Bug Fix Advisory':
            erratum.advisory_type = 'bugfix'
        elif ertm[2] == 'Product Enhancement Advisory':
            erratum.advisory_type = 'enhancement'
        else:
            erratum.advisory_type = 'errata'

        erratum.version = ertm[3]
        erratum.description = ertm[4]
        erratum.synopsis = ertm[5]
        erratum.issued = ertm[6]
        erratum.updated = ertm[7]

    def _fill_erratum_bz_references(self, erratum):
        self.erratum_bzs_sql.execute(erratum_id=erratum.id)
        bz_refs = self.erratum_bzs_sql.fetchall_dict()

        if bz_refs:
            erratum.bz_references = bz_refs

    def _fill_erratum_cve_references(self, erratum):
        self.erratum_cves_sql.execute(erratum_id=erratum.id)
        cve_refs = self.erratum_cves_sql.fetchall()

        for cve_ref in cve_refs:
            erratum.cve_references.append(cve_ref[0])

    def _fill_erratum_packages(self, erratum):
        self.erratum_packages_sql.execute(erratum_id=erratum.id)
        pkgs = self.erratum_packages_sql.fetchall()

        for pkg in pkgs:
            package = self.package_mapper.get_package(pkg[0])
            erratum.packages.append(package)
            erratum.package_ids.append(pkg[0])


class SqlRepoMDMapper:

    def __init__(self):
        self.repomd_sql = rhnSQL.prepare("""
        select
            relative_filename
        from
            rhnChannelComps
        where
            id = :repomd_id
        """)

    def get_repomd(self, repomd_id):
        self.repomd_sql.execute(repomd_id=repomd_id)
        repomd_row = self.repomd_sql.fetchone()
        filename = os.path.join(CFG.mount_point, repomd_row[0])
        return domain.RepoMD(repomd_id, filename)


def get_channel_mapper():
    """ Factory Method-ish function to load a Channel Mapper. """
    package_mapper = get_package_mapper()
    erratum_mapper = get_erratum_mapper(package_mapper)
    repomd_mapper = SqlRepoMDMapper()
    channel_mapper = ChannelMapper(package_mapper, erratum_mapper, repomd_mapper)

    return channel_mapper


def get_package_mapper():
    """ Factory Method-ish function to load a Package Mapper. """
    package_mapper = SqlPackageMapper()
    package_mapper = CachedPackageMapper(package_mapper)

    return package_mapper


def get_erratum_mapper(package_mapper):
    """ Factory Method-ish function to load an Erratum Mapper. """
    erratum_mapper = SqlErratumMapper(package_mapper)
    erratum_mapper = CachedErratumMapper(erratum_mapper, package_mapper)

    return erratum_mapper


def oratimestamp_to_sinceepoch(ts):
    return time.mktime((ts.year, ts.month, ts.day, ts.hour, ts.minute,
                        ts.second, 0, 0, -1))


def string_to_unicode(text):
    if text is None:
        return ''
    if isinstance(text, UnicodeType):
        return text

    # First try a bunch of encodings in strict mode
    encodings = ['ascii', 'iso-8859-1', 'iso-8859-15', 'iso-8859-2']
    for encoding in encodings:
        try:
            dec = text.decode(encoding)
            enc = dec.encode('utf-8')
            return enc
        except UnicodeError:
            continue

    # None of those worked, just do ascii with replace
    dec = text.decode(encoding, 'replace')
    enc = dec.encode('utf-8', 'replace')
    return enc
0707010000019F000081B40000000000000000000000015FBBE8EE00003EA6000000000000000000000000000000000000002E00000000spacewalk-backend/server/repomd/repository.py #
# Copyright (c) 2008--2018 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
#   Classes for generating repository metadata from RHN info.
#

import time
try:
    #  python 2
    import StringIO
except ImportError:
    #  python3
    import io as StringIO
import shutil
import os.path

from gzip import GzipFile
from gzip import write32u

from uyuni.common.usix import LongType
from uyuni.common import checksum
from spacewalk.common import rhnCache
from spacewalk.common.rhnLog import log_debug
from spacewalk.common.rhnConfig import CFG

from . import mapper
from . import view
from .domain import RepoMD
from spacewalk.server import rhnChannel

# One meg
CHUNK_SIZE = 1048576

comps_mapping = {
    'rhel-x86_64-client-5': 'rhn/kickstart/ks-rhel-x86_64-client-5/Client/repodata/comps-rhel5-client-core.xml',
    'rhel-x86_64-client-vt-5': 'rhn/kickstart/ks-rhel-x86_64-client-5/VT/repodata/comps-rhel5-vt.xml',
    'rhel-x86_64-client-workstation-5': 'rhn/kickstart/ks-rhel-x86_64-client-5/Workstation/repodata/comps-rhel5-client-workstation.xml',
    'rhel-x86_64-server-5': 'rhn/kickstart/ks-rhel-x86_64-server-5/Server/repodata/comps-rhel5-server-core.xml',
    'rhel-x86_64-server-vt-5': 'rhn/kickstart/ks-rhel-x86_64-server-5/VT/repodata/comps-rhel5-vt.xml',
    'rhel-x86_64-server-cluster-5': 'rhn/kickstart/ks-rhel-x86_64-server-5/Cluster/repodata/comps-rhel5-cluster.xml',
    'rhel-x86_64-server-cluster-storage-5': 'rhn/kickstart/ks-rhel-x86_64-server-5/ClusterStorage/repodata/comps-rhel5-cluster-st.xml',
}
for k in list(comps_mapping.keys()):
    for arch in ('i386', 'ia64', 's390x', 'ppc'):
        comps_mapping[k.replace('x86_64', arch)] = comps_mapping[k].replace('x86_64', arch)


class Repository(object):

    """
    Representation of RHN channels as repository metadata.

    This class can generate primary.xml, filelists.xml, and other.xml
    """

    def __init__(self, channel):
        self.channel_id = channel['id']
        self.last_modified = channel['last_modified']

        self.primary_prefix = "repomd_primary.xml"
        self.other_prefix = "repomd_other.xml"
        self.filelists_prefix = "repomd_filelists.xml"
        self.updateinfo_prefix = "repomd_updateinfo.xml"

        self._channel = None

        cache = rhnCache.Cache()
        self.cache = rhnCache.NullCache(cache)

    def get_primary_xml_file(self):
        """ Return a file-like object of the primarl.xml for this channel. """
        ret = self.get_primary_cache()

        if not ret:
            viewobj = self.get_primary_view()

            self.generate_files([viewobj])
            ret = self.get_primary_cache()

        return ret

    def get_other_xml_file(self):
        """ Return a file-like object of the other.xml for this channel. """
        ret = self.get_other_cache()

        if not ret:
            viewobj = self.get_other_view()

            self.generate_files([viewobj])
            ret = self.get_other_cache()

        return ret

    def get_filelists_xml_file(self):
        """ Return a file-like object of the filelists.xml for this channel. """
        ret = self.get_filelists_cache()

        if not ret:
            viewobj = self.get_filelists_view()

            self.generate_files([viewobj])
            ret = self.get_filelists_cache()

        return ret

    def get_updateinfo_xml_file(self):
        """ Return a file-like object of the updateinfo.xml for the channel. """
        ret = self.get_cache_file(self.updateinfo_prefix)

        if not ret:
            viewobj = self.get_cache_view(self.updateinfo_prefix,
                                          view.UpdateinfoView)

            viewobj.write_updateinfo()
            viewobj.fileobj.close()
            ret = self.get_cache_file(self.updateinfo_prefix)

        return ret

    def get_cache_entry_name(self, cache_prefix):
        return "%s-%s" % (cache_prefix, self.channel_id)

    def get_cache_file(self, cache_prefix):
        cache_entry = self.get_cache_entry_name(cache_prefix)
        ret = self.cache.get_file(cache_entry, self.last_modified)
        return ret

    def get_cache_view(self, cache_prefix, view_class):
        cache_entry = self.get_cache_entry_name(cache_prefix)
        ret = self.cache.set_file(cache_entry, self.last_modified)
        viewobj = view_class(self.channel, ret)
        return viewobj

    def get_primary_cache(self):
        return self.get_cache_file(self.primary_prefix)

    def get_other_cache(self):
        return self.get_cache_file(self.other_prefix)

    def get_filelists_cache(self):
        return self.get_cache_file(self.filelists_prefix)

    def get_primary_view(self):
        return self.get_cache_view(self.primary_prefix, view.PrimaryView)

    def get_other_view(self):
        return self.get_cache_view(self.other_prefix, view.OtherView)

    def get_filelists_view(self):
        return self.get_cache_view(self.filelists_prefix, view.FilelistsView)

    def get_repomd_file(self, repomd_obj, func_name):
        """ Return a file-like object of the comps.xml/modules.yaml for the channel. """
        if repomd_obj:
            repomd_view = view.RepoMDView(repomd_obj)
            return repomd_view.get_file()
        elif func_name == 'get_comps_file' and self.channel.label in comps_mapping:
            comps_view = view.RepoMDView(RepoMD(None,
                                              os.path.join(CFG.mount_point, comps_mapping[self.channel.label])))
            return comps_view.get_file()
        else:
            if self.channel.cloned_from_id is not None:
                log_debug(1, "No comps/modules and no comps_mapping for [%s] cloned from [%s] trying to get comps from the original one."
                          % (self.channel.id, self.channel.cloned_from_id))
                cloned_from_channel = rhnChannel.Channel().load_by_id(self.channel.cloned_from_id)
                cloned_from_channel_label = cloned_from_channel._row['label']
                func = getattr(Repository(rhnChannel.channel_info(cloned_from_channel_label)), func_name)
                return func()
        return None

    def get_comps_file(self):
        return self.get_repomd_file(self.channel.comps, 'get_comps_file')

    def get_modules_file(self):
        return self.get_repomd_file(self.channel.modules, 'get_modules_file')

    def generate_files(self, views):
        for view in views:
            view.write_start()

        for package in self.channel.packages:
            for view in views:
                view.write_package(package)

        for view in views:
            view.write_end()
            view.fileobj.close()

    def __get_channel(self):
        """ Late binding for the channel. """
        if self._channel is None:
            channel_mapper = mapper.get_channel_mapper()
            self._channel = channel_mapper.get_channel(self.channel_id)
        return self._channel

    channel = property(__get_channel)


class CompressedRepository:

    """ Decorator for Repositories adding gzip compression of the output. """

    def __init__(self, repository):
        self.repository = repository

        self.primary_prefix = self.repository.primary_prefix + ".gz"
        self.other_prefix = self.repository.other_prefix + ".gz"
        self.filelists_prefix = self.repository.filelists_prefix + ".gz"
        self.updateinfo_prefix = self.repository.updateinfo_prefix + ".gz"

    def get_primary_xml_file(self):
        xml_file = self.repository.get_primary_xml_file()
        return self.__get_compressed_file(xml_file)

    def get_other_xml_file(self):
        """ Return gzipped other.xml file """
        xml_file = self.repository.get_other_xml_file()
        return self.__get_compressed_file(xml_file)

    def get_filelists_xml_file(self):
        """ Return gzipped filelists.xml file """
        xml_file = self.repository.get_filelists_xml_file()
        return self.__get_compressed_file(xml_file)

    def get_updateinfo_xml_file(self):
        """ Return gzipped updateinfo.xml file """
        xml_file = self.repository.get_updateinfo_xml_file()
        return self.__get_compressed_file(xml_file)

    def __getattr__(self, x):
        return getattr(self.repository, x)

    def __get_compressed_file(self, uncompressed_file):
        string_file = StringIO.StringIO()
        gzip_file = NoTimeStampGzipFile(mode="wb", fileobj=string_file)

        shutil.copyfileobj(uncompressed_file, gzip_file)

        gzip_file.close()

        string_file.seek(0, 0)

        return string_file


class CachedRepository:

    """ Decorator for Repositories adding caching. """

    def __init__(self, repository):
        self.repository = repository

        cache = rhnCache.Cache()
        self.cache = rhnCache.NullCache(cache)

    def get_primary_xml_file(self):
        """ Return the cached primary metadata file, if it exists. """
        return self._cached(self.primary_prefix,
                            self.repository.get_primary_xml_file)

    def get_other_xml_file(self):
        return self._cached(self.other_prefix,
                            self.repository.get_other_xml_file)

    def get_filelists_xml_file(self):
        return self._cached(self.filelists_prefix,
                            self.repository.get_filelists_xml_file)

    def get_updateinfo_xml_file(self):
        return self._cached(self.updateinfo_prefix,
                            self.repository.get_updateinfo_xml_file)

    def _cached(self, cache_prefix, fallback_method):
        """
        Return the cached results if they are new enough, else get new results.

        cache_prefix is a unique string that will identify the cached data.
        fallback_method is the method to call if the cached data doesn't exist
        or isn't new enough.
        """
        cache_entry = "%s-%s" % (cache_prefix, self.channel_id)
        ret = self.cache.get_file(cache_entry, self.last_modified)
        if ret:
            log_debug(4, "Scored cache hit", self.channel_id)
        else:
            ret = fallback_method()
            cache_file = self.cache.set_file(cache_entry, self.last_modified)

            shutil.copyfileobj(ret, cache_file)

            ret.close
            cache_file.close()
            ret = self.cache.get_file(cache_entry, self.last_modified)
        return ret

    def __getattr__(self, x):
        return getattr(self.repository, x)


class MetadataRepository:

    """
    A repository that can provide repomd data.

    A Metadata Repository is composed of a repository and a
    CompressedRepository, as both are required to generate the repomd file.
    """

    def __init__(self, repository, compressed_repository):
        self.repository = repository
        self.compressed_repository = compressed_repository

        self.repomd_prefix = "repomd.xml"

    def get_repomd_file(self):
        """ Return uncompressed repomd.xml file """

        cache_entry = "%s-%s" % (self.repomd_prefix, self.channel_id)
        ret = self.cache.get_file(cache_entry, self.last_modified)

        if not ret:
            # We need the time in seconds since the epoch for the xml file.
            timestamp = int(time.mktime(time.strptime(self.last_modified,
                                                      "%Y%m%d%H%M%S")))

            to_generate = []

            if not self.repository.get_primary_cache():
                to_generate.append(self.repository.get_primary_view())
            if not self.repository.get_other_cache():
                to_generate.append(self.repository.get_other_view())
            if not self.repository.get_filelists_cache():
                to_generate.append(self.repository.get_filelists_view())

            self.repository.generate_files(to_generate)

            primary = self.__compute_checksums(timestamp,
                                               self.repository.get_primary_xml_file(),
                                               self.compressed_repository.get_primary_xml_file())

            filelists = self.__compute_checksums(timestamp,
                                                 self.repository.get_filelists_xml_file(),
                                                 self.compressed_repository.get_filelists_xml_file())

            other = self.__compute_checksums(timestamp,
                                             self.repository.get_other_xml_file(),
                                             self.compressed_repository.get_other_xml_file())

            updateinfo = self.__compute_checksums(timestamp,
                                                  self.repository.get_updateinfo_xml_file(),
                                                  self.compressed_repository.get_updateinfo_xml_file())

            # Comps and modules might not exist on disc
            comps = None
            comps_file = None
            modules = None
            modules_file = None
            try:
                comps_file = self.repository.get_comps_file()
            except IOError:
                pass
            try:
                modules_file = self.repository.get_modules_file()
            except IOError:
                pass
            if comps_file:
                comps = self.__compute_open_checksum(timestamp, comps_file)
            if modules_file:
                modules = self.__compute_checksums(timestamp, modules_file)

            ret = self.cache.set_file(cache_entry, self.last_modified)
            repomd_view = view.RepoView(primary, filelists, other, updateinfo,
                                        comps, modules, ret, self.__get_checksumtype())

            repomd_view.write_repomd()
            ret.close()
            ret = self.cache.get_file(cache_entry, self.last_modified)

        return ret

    def __get_file_checksum(self, xml_file):
        hash_computer = checksum.getHashlibInstance(self.__get_checksumtype(), False)

        chunk = xml_file.read(CHUNK_SIZE)
        while chunk:
            hash_computer.update(chunk)
            chunk = xml_file.read(CHUNK_SIZE)

        return hash_computer.hexdigest()

    def __compute_open_checksum(self, timestamp, xml_file):
        template_hash = {}

        template_hash['open_checksum'] = self.__get_file_checksum(xml_file)
        template_hash['timestamp'] = timestamp

        return template_hash

    def __compute_checksums(self, timestamp, xml_file, xml_gz_file):
        template_hash = self.__compute_open_checksum(timestamp, xml_file)

        template_hash['gzip_checksum'] = self.__get_file_checksum(xml_gz_file)

        return template_hash

    def __get_checksumtype(self):
        return self.repository.channel.checksum_type

    def __getattr__(self, x):
        return getattr(self.compressed_repository, x)


def get_repository(channel):
    """ Factory Method-ish function to create a repository from a channel. """
    repository = Repository(channel)

    compressed_repository = CompressedRepository(repository)
    compressed_repository = CachedRepository(compressed_repository)

    meta_repository = MetadataRepository(repository, compressed_repository)

    return meta_repository


class NoTimeStampGzipFile(GzipFile):

    def _write_gzip_header(self):
        self.fileobj.write('\037\213')
        self.fileobj.write('\010')
        # no flags
        self.fileobj.write('\x00')
        write32u(self.fileobj, LongType(0))
        self.fileobj.write('\002')
        self.fileobj.write('\377')
  070701000001A0000081B40000000000000000000000015FBBE8EE00003950000000000000000000000000000000000000002800000000spacewalk-backend/server/repomd/view.py   #
# Copyright (c) 2008--2018 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
import re

XML_ENCODING = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"


class RepoView:

    def __init__(self, primary, filelists, other, updateinfo, groups, modules, fileobj,
                 checksum_type):
        self.primary = primary
        self.filelists = filelists
        self.other = other
        self.updateinfo = updateinfo
        self.groups = groups
        self.modules = modules

        self.fileobj = fileobj
        if checksum_type == 'sha1':
            self.checksum_type = 'sha'
        else:
            self.checksum_type = checksum_type

    def _get_data(self, data_type, data_obj):
        output = []
        output.append("  <data type=\"%s\">" % (data_type))
        output.append("    <location href=\"repodata/%s.xml.gz\"/>"
                      % (data_type))
        output.append("    <checksum type=\"%s\">%s</checksum>"
                      % (self.checksum_type, data_obj['gzip_checksum']))
        output.append("    <timestamp>%d</timestamp>" % (data_obj['timestamp']))
        output.append("    <open-checksum type=\"%s\">%s</open-checksum>"
                      % (self.checksum_type, data_obj['open_checksum']))
        output.append("  </data>")
        return output

    def _get_comps_data(self):
        output = []
        if self.groups:
            output.append("  <data type=\"group\">")
            output.append("    <location href=\"repodata/comps.xml\"/>")
            output.append("    <checksum type=\"%s\">%s</checksum>"
                          % (self.checksum_type, self.groups['open_checksum']))
            output.append("    <timestamp>%d</timestamp>"
                          % (self.groups['timestamp']))
            output.append("  </data>")

        return output

    def _get_modules_data(self):
        output = []
        if self.modules:
            output.append("  <data type=\"group\">")
            output.append("    <location href=\"repodata/modules.yaml\"/>")
            output.append("    <checksum type=\"%s\">%s</checksum>"
                          % (self.checksum_type, self.modules['open_checksum']))
            output.append("    <timestamp>%d</timestamp>"
                          % (self.groups['timestamp']))
            output.append("  </data>")

        return output

    def write_repomd(self):
        output = []
        output.append(XML_ENCODING)
        output.append("<repomd xmlns=\"http://linux.duke.edu/metadata/repo\">")
        output.extend(self._get_data('primary', self.primary))
        output.extend(self._get_data('filelists', self.filelists))
        output.extend(self._get_data('other', self.other))
        output.extend(self._get_data('updateinfo', self.updateinfo))
        output.extend(self._get_comps_data())
        output.extend(self._get_modules_data())
        output.append("</repomd>")
        self.fileobj.write('\n'.join(output))


class PrimaryView(object):

    def __init__(self, channel, fileobj):
        self.channel = channel
        self.fileobj = fileobj

    def _get_deps(self, deps):
        output = []
        for dep in deps:
            if dep['flag']:
                line = "        <rpm:entry name=\"%s\" flags=\"%s\" \
                        epoch=\"%s\" ver=\"%s\" " % (dep['name'], dep['flag'],
                                                     dep['epoch'], dep['version'])
                if dep['release']:
                    line += "rel=\"%s\" " % dep['release']
                line += "/>"
                output.append(line)
            else:
                output.append("         <rpm:entry name=\"%s\" />"
                              % (text_filter(dep['name'])))
        return output

    def _get_files(self, files):
        output = []
        filere = re.compile('.*bin\/.*|^\/etc\/.*|^\/usr\/lib\.sendmail$')
        for pkg_file in files:
            if filere.match(pkg_file):
                output.append("      <file>%s</file>"
                              % (text_filter(pkg_file)))
        return output

    def _get_package(self, package):
        output = []
        output.append("  <package type=\"rpm\">")
        output.append("    <name>%s</name>" % (package.name))
        output.append("    <arch>%s</arch>" % (package.arch))
        output.append("    <version epoch=\"%s\" ver=\"%s\" rel=\"%s\" />"
                      % (package.epoch, package.version, package.release))
        output.append("    <checksum type=\"%s\" pkgid=\"YES\">%s</checksum>"
                      % (package.checksum_type, package.checksum))
        output.append("    <summary>%s</summary>"
                      % (text_filter(package.summary)))
        output.append("    <description>%s</description>"
                      % (text_filter(package.description)))
        output.append("    <packager></packager>")
        output.append("    <url></url>")
        output.append("    <time file=\"%d\" build=\"%d\" />"
                      % (package.build_time, package.build_time))
        output.append("    <size package=\"%d\" installed=\"%d\" "
                      "archive=\"%d\" />"
                      % (package.package_size, package.installed_size,
                         package.payload_size))
        output.append("    <location href=\"getPackage/%s\" />"
                      % (package.filename))
        output.append("    <format>")
        output.append("      <rpm:license>%s</rpm:license>"
                      % (text_filter(package.copyright)))
        output.append("      <rpm:vendor>%s</rpm:vendor>"
                      % (text_filter(package.vendor)))
        output.append("      <rpm:group>%s</rpm:group>"
                      % (text_filter(package.package_group)))
        output.append("      <rpm:buildhost>%s</rpm:buildhost>"
                      % (text_filter(package.build_host)))
        output.append("      <rpm:sourcerpm>%s</rpm:sourcerpm>"
                      % (text_filter(package.source_rpm)))
        output.append("      <rpm:header-range start=\"%d\" end=\"%d\" />"
                      % (package.header_start, package.header_end))

        output.append("      <rpm:provides>")
        output.extend(self._get_deps(package.provides))
        output.append("      </rpm:provides>")

        output.append("      <rpm:requires>")
        output.extend(self._get_deps(package.requires))
        output.append("      </rpm:requires>")

        output.append("      <rpm:recommends>")
        output.extend(self._get_deps(package.recommends))
        output.append("      </rpm:recommends>")

        output.append("      <rpm:suggests>")
        output.extend(self._get_deps(package.suggests))
        output.append("      </rpm:suggests>")

        output.append("      <rpm:supplements>")
        output.extend(self._get_deps(package.supplements))
        output.append("      </rpm:supplements>")

        output.append("      <rpm:enhances>")
        output.extend(self._get_deps(package.enhances))
        output.append("      </rpm:enhances>")

        output.append("      <rpm:conflicts>")
        output.extend(self._get_deps(package.conflicts))
        output.append("      </rpm:conflicts>")

        output.append("      <rpm:obsoletes>")
        output.extend(self._get_deps(package.obsoletes))
        output.append("      </rpm:obsoletes>")

        output.extend(self._get_files(package.files))

        output.append("    </format>")
        output.append("  </package>")

        return output

    def write_start(self):
        output = XML_ENCODING + "\n" + \
            "<metadata xmlns=\"http://linux.duke.edu/metadata/common\" " + \
            "xmlns:rpm=\"http://linux.duke.edu/metadata/rpm\" " + \
            "packages=\"%d\">" % self.channel.num_packages

        self.fileobj.write(output)

    def write_package(self, package):
        self.fileobj.write('\n'.join(self._get_package(package)))

    def write_end(self):
        self.fileobj.write("</metadata>")


class FilelistsView(object):

    def __init__(self, channel, fileobj):
        self.channel = channel
        self.fileobj = fileobj

    def _get_package(self, package):
        output = []
        output.append("  <package pkgid=\"%s\" name=\"%s\" arch=\"%s\">"
                      % (package.checksum, package.name, package.arch))
        output.append("    <version epoch=\"%s\" ver=\"%s\" rel=\"%s\" />"
                      % (package.epoch, package.version, package.release))

        for file_name in package.files:
            output.append("    <file>%s</file>" % (text_filter(file_name)))
        output.append("  </package>")
        return output

    def write_start(self):
        output = XML_ENCODING + "\n" + \
            "<filelists xmlns=\"http://linux.duke.edu/metadata/filelists\" " + \
            "packages=\"%d\">" % self.channel.num_packages

        self.fileobj.write(output)

    def write_package(self, package):
        self.fileobj.write('\n'.join(self._get_package(package)))

    def write_end(self):
        self.fileobj.write("</filelists>")


class OtherView(object):

    def __init__(self, channel, fileobj):
        self.channel = channel
        self.fileobj = fileobj

    def _get_package(self, package):
        output = []
        output.append("  <package pkgid=\"%s\" name=\"%s\" arch=\"%s\">"
                      % (package.checksum, package.name, package.arch))
        output.append("    <version epoch=\"%s\" ver=\"%s\" rel=\"%s\" />"
                      % (package.epoch, package.version, package.release))

        for changelog in package.changelog:
            output.append("    <changelog author=\"%s\" date=\"%d\">"
                          % (text_filter_attribute(changelog['author']),
                             changelog['date']))
            output.append("      " + text_filter(changelog['text']))
            output.append("    </changelog>")
        output.append("  </package>")
        return output

    def write_start(self):
        output = XML_ENCODING + "\n" + \
            "<otherdata xmlns=\"http://linux.duke.edu/metadata/other\" " + \
            "packages=\"%d\">" % self.channel.num_packages

        self.fileobj.write(output)

    def write_package(self, package):
        self.fileobj.write('\n'.join(self._get_package(package)))

    def write_end(self):
        self.fileobj.write("</otherdata>")


class UpdateinfoView(object):

    def __init__(self, channel, fileobj):
        self.channel = channel
        self.fileobj = fileobj

    def _get_references(self, erratum):
        output = []
        output.append("    <references>")

        ref_string = "       <reference href=\"%s%s\" id=\"%s\" type=\"%s\">"
        for cve_ref in erratum.cve_references:
            output.append(ref_string
                          % ("http://cve.mitre.org/cgi-bin/cvename.cgi?name=",
                             cve_ref, cve_ref, "cve"))
            output.append("      </reference>")

        for bz_ref in erratum.bz_references:
            output.append(ref_string
                          % ("http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=",
                             bz_ref['bug_id'], bz_ref['bug_id'], "bugzilla"))
            output.append("        " + text_filter(bz_ref['summary']))
            output.append("      </reference>")

        output.append("    </references>")
        return output

    def _get_packages(self, erratum):
        output = []

        output.append("    <pkglist>")
        output.append("      <collection short=\"%s\">"
                      % text_filter_attribute(self.channel.label))
        output.append("        <name>%s</name>"
                      % text_filter(self.channel.name))

        for package in erratum.packages:
            output.append("          <package name=\"%s\" version=\"%s\" "
                          "release=\"%s\" epoch=\"%s\" arch=\"%s\" src=\"%s\">"
                          % (package.name, package.version, package.release,
                             package.epoch, package.arch, text_filter(package.source_rpm)))
            output.append("            <filename>%s</filename>"
                          % text_filter(package.filename))
            output.append("            <sum type=\"%s\">%s</sum>"
                          % (package.checksum_type, package.checksum))
            output.append("          </package>")

        output.append("      </collection>")
        output.append("    </pkglist>")
        return output

    def _get_erratum(self, erratum):
        output = []

        output.append("  <update from=\"security@redhat.com\" " +
                      "status=\"final\" type=\"%s\" version=\"%s\">"
                      % (erratum.advisory_type, erratum.version))
        output.append("    <id>%s</id>" % erratum.readable_id)
        output.append("    <title>%s</title>" % text_filter(erratum.title))
        output.append("    <issued date=\"%s\"/>" % erratum.issued)
        output.append("    <updated date=\"%s\"/>" % erratum.updated)
        output.append("    <description>%s</description>"
                      % text_filter("%s\n\n\%s" % (erratum.synopsis,  erratum.description)))

        output.extend(self._get_references(erratum))
        output.extend(self._get_packages(erratum))

        output.append("  </update>")

        return output

    def write_updateinfo(self):
        output = XML_ENCODING + "\n" + "<updates>\n"

        self.fileobj.write(output)

        for erratum in self.channel.errata:
            self.fileobj.write('\n'.join(self._get_erratum(erratum)))

        self.fileobj.write("\n</updates>")


class RepoMDView(object):

    def __init__(self, repomd):
        self.repomd = repomd

    def get_file(self):
        repomd_file = open(self.repomd.filename)
        return repomd_file


def text_filter(text):
    # do & first
    s = text.replace('&', '&amp;')
    s = s.replace('<', '&lt;')
    s = s.replace('>', '&gt;')
    return s


def text_filter_attribute(text):
    s = text_filter(text)
    s = s.replace('"', '&quot;')
    return s
070701000001A1000081B40000000000000000000000015FBBE8EE00001A81000000000000000000000000000000000000002900000000spacewalk-backend/server/rhn.conf.sample  # rhn.conf.sample - THIS FILE IS USED FOR REFERENCE ONLY!
#
# The /etc/rhn/rhn.conf file should be created initially upon install.
#
# This file will attempt to better illustrate the possible settings for
# the file /etc/rhn/rhn.conf.
#

# How this configuration scheme works:
#
# Settings are structured hierarchically. All main components (RHN Server
# Server Satellite, and web) currently use this file. Settings are
# differentiated by a dot-delimited
# prefix. For example (ignore the initial comments; this is an illustration).
#
# debug = 3  # All debug levels for all components is 3
# traceback_mail = xxx@redhat.com # all tracebacks for all components go to
#                                 # xxx@redhat.com.
# proxy.traceback_mail = yyy@redhat.com # All proxy (broker & redirect) emails
#                                       # go to yyy@redhat.com now (overriding
#                                       # xxx@redhat.com).
# proxy.broker.debug = 4  # Spacewalk Proxy broker now runs at debug level 4, but
#                         # redirect and auth_cache still run at debug level 3


#### THE SETTINGS ####
# NOTE: All settings listed are the defaults unless overridden
#       Items left uncommented are the settings most likely needing to be
#       changed.
#
# Common (global to all components) settings
#
#debug = 5
traceback_mail = user0@example.com, user1@example.com
#quiet_mail = 15 # can set in other components... no need to change though.

#
# server
#
#server.mount_point = /pub
#server.disallow_user_creation = 0
#server.log_file = /var/log/rhn/rhn_server.log

#
# server.satellite
#
#server.satellite.log_file = /var/log/rhn/rhn_server_satellite.log
#server.satellite.encrypted_passwords = 0
#server.satellite.http_proxy =
#server.satellite.http_proxy_username =
#server.satellite.http_proxy_username =

#
# server.app
#
# -no settings at this level-

#
# server.app
#
#server.app.log_file = /var/log/rhn/rhn_server_app.log

#
# web
#
web.download_url = #FIXME
web.mail_server_errors = user0@redhat.com, user1@redhat.com

#web.session_swap_secret_1 = *installer generated*
#web.session_swap_secret_2 = *installer generated*
#web.session_swap_secret_3 = *installer generated*
#web.session_swap_secret_4 = *installer generated*

#web.session_secret_1 = *installer generated*
#web.session_secret_2 = *installer generated*
#web.session_secret_3 = *installer generated*
#web.session_secret_4 = *installer generated*

web.rhnproc_server = #FIXME
web.rhnproc_port =   #FIXME


### COMPONENT DEFINITIONS ###
#
# *global*          - if the option is defined without a component prepended,
#                     then that option is set globally unless overridden.
#                     E.g. traceback_mail = bob@company.com, mary@company.com
#
# server            - all components that are of base component type "server"
#                     will inherit these settings.
#
# server.satellite  - settings for the satellite component of the RHN Server.
#                     E.g. server.satellite.traceback_mail = jill@company.com
#                     (all error message for all server.satellite components
#                     now are sent to Jill, whereas non-server.satellite
#                     component error messages are still sent to Bob and Mary).
#
# server.app
#                   - settings for the app components of the RHN Server.
#
# web               - XXX: web stuff




### CONFIGURATION OPTION DEFINITIONS ###
#
#   NOTE: All components don't necessary understand all options listed below.
#         Use the sample settings above as a reference as to what can and cannot
#         be set. Comment (#) anything you wish to be unset/defaulted.
#
#   ** SERVER COMPONENT OPTIONS**
#
#   traceback_mail  - indicates where tracebacks (crash information) is mailed.
#                     traceback_mail = user0@company.com, user1@company.com
#                     NOTE: any options with a comma indicates a list of items.
#
#   quiet_mail      - The two main components of the Spacewalk Proxy Solution (broker
#                     and redirect) use Apache extensively. As Apache reuses
#                     processes, sometimes an error may occurs that generates
#                     multiple copies of the same "traceback". The quiet_mail
#                     setting limits the number of duplicate tracebacks sent
#                     from 1 error.
#
#   debug           - Debug level. To increase verbosity of logs to the log
#                     files, increase the value.
#                     Debug levels are arbitrary to a certain degree, but here
#                     is a rough summary of what each means:
#                     LEVEL   MEANING
#                     0       nearly nothing at all is logged
#                     1       minimal debug information logged
#                     2       some debug information logged
#                     3       somewhat verbose (most function calls and methods
#                             are logged)
#                     4       verbose
#                     5       very verbose (nearly everything)
#                     6       everything including some things only meaningful
#                             to developers
#
#   log_file        - each component can have it's own log file.
#
#   mount_point     - FIXME
#
#   encrypted_passwords
#                   - client passwords can be stored encrypted or plaintext
#                     in the database. Possible values are 0 and 1.
#
#   http_proxy      - this is only used for component server.satellite and is
#                     only important to the satellite-sync tool. If one must
#                     connect to Red Hat's servers via a corporate http_proxy
#                     it can be set here. To leave it unset, either comment
#                     that line or leave the value blank.
#                     e.g. somehttpproxy.example.com:8080
#                     ...or, to leave unset:
#                     e.g. proxy.broker.http_proxy =
#
#   http_proxy_username
#   http_proxy_password
#                   - username and password for that http_proxy if need be.
#
#
#   ** WEB COMPONENT OPTIONS**
#
#   download_url    - FIXME
#
#   mail_server_errors = user0@redhat.com, user1@redhat.com
#
#   session_swap_secret_1
#   session_swap_secret_2
#   session_swap_secret_3
#   session_swap_secret_4
#                   - these are produced by the initial installation. Do not
#                     even think of altering these.
#
#   session_secret_1
#   session_secret_2
#   session_secret_3
#   session_secret_4
#                   - these are produced by the initial installation. Do not
#                     even think of altering these.
#
#   rhnproc_server  - FIXME
#   rhnproc_port    - FIXME
#
   070701000001A2000081B40000000000000000000000015FBBE8EE0000162F000000000000000000000000000000000000002600000000spacewalk-backend/server/rhnAction.py #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

from spacewalk.common.rhnLog import log_debug
from spacewalk.server import rhnSQL


def schedule_action(action_type, action_name=None, delta_time=0,
                    scheduler=None, org_id=None, prerequisite=None):
    action_id = rhnSQL.Sequence('rhn_event_id_seq').next()

    at = rhnSQL.Table('rhnActionType', 'label')
    if not at.has_key(action_type):
        raise ValueError("Unknown action type %s" % action_type)

    params = {
        'action_id': action_id,
        'org_id': org_id,
        'action_type_id': at[action_type]['id'],
        'action_name': action_name,
        'delta': delta_time,
        'scheduler': scheduler,
        'prerequisite': prerequisite,
    }

    h = rhnSQL.prepare("""
        insert into rhnAction
               (id, org_id, action_type, name, scheduler, earliest_action, prerequisite)
        values (:action_id, :org_id, :action_type_id, :action_name, :scheduler,
                current_timestamp + numtodsinterval(:delta, 'second'), :prerequisite)
    """)
    h.execute(**params)

    return action_id


def schedule_server_action(server_id, action_type, action_name=None,
                           delta_time=0, scheduler=None, org_id=None, prerequisite=None):
    if not org_id:
        h = rhnSQL.prepare("select org_id from rhnServer where id = :id")
        h.execute(id=server_id)
        row = h.fetchone_dict()
        if not row:
            raise ValueError("Invalid server id %s" % server_id)
        org_id = row['org_id']

    action_id = schedule_action(action_type,
                                action_name,
                                delta_time=delta_time,
                                scheduler=scheduler,
                                org_id=org_id,
                                prerequisite=prerequisite,
                                )

    # Insert an action as Queued
    h = rhnSQL.prepare("""
        insert into rhnServerAction (server_id, action_id, status)
        values (:server_id, :action_id, 0)
    """)
    h.execute(server_id=server_id, action_id=action_id)

    return action_id


def update_server_action(server_id, action_id, status, result_code=None,
                         result_message=""):
    log_debug(4, server_id, action_id, status, result_code, result_message)
    h = rhnSQL.prepare("""
    update rhnServerAction
        set status = :status,
            result_code = :result_code,
            result_msg  = :result_message,
            completion_time = current_timestamp
    where action_id = :action_id
      and server_id = :server_id
    """)
    h.execute(action_id=action_id, server_id=server_id,
              status=status, result_code=result_code,
              result_message=result_message)


_query_lookup_action_childs = rhnSQL.Statement("""
    select a.id
      from rhnAction a
      join rhnServerAction sa
        on sa.action_id = a.id
     where prerequisite = :action_id
       and sa.server_id = :server_id
""")

_query_lookup_action = rhnSQL.Statement("""
    select sa.action_id, sa.status
      from rhnServerAction sa
     where sa.server_id = :server_id
       and sa.action_id = :action_id
""")


def invalidate_action(server_id, action_id):
    log_debug(4, server_id, action_id)
    h = rhnSQL.prepare(_query_lookup_action)
    h_child = rhnSQL.prepare(_query_lookup_action_childs)
    return _invalidate_action_recursive(server_id, action_id, h, h_child)


def _invalidate_action_recursive(server_id, action_id, h, h_child):
    h_child.execute(server_id=server_id, action_id=action_id)
    a_ids = []
    # invalidate childs first
    while 1:
        row = h_child.fetchone_dict()
        if not row:
            break
        child_ids = _invalidate_action_recursive(server_id, row['id'], h, h_child)
        a_ids += child_ids
    h.execute(server_id=server_id, action_id=action_id)
    s_row = h.fetchone_dict()
    if s_row and s_row['status'] != 3:
        # not already failed
        c_action_id = s_row['action_id']
        a_ids.append(c_action_id)
        update_server_action(server_id=server_id, action_id=c_action_id,
                             status=3, result_code=-100, result_message="Prerequisite failed")

    return a_ids

_query_schedule_server_packages_update_by_arch = rhnSQL.Statement("""
    insert into rhnActionPackage (id, action_id, name_id, package_arch_id, \
           parameter)
    values (sequence_nextval('rhn_act_p_id_seq'), :action_id, :name_id, :arch_id, \
           'upgrade')
""")


def schedule_server_packages_update_by_arch(server_id, package_arch_ids, org_id=None, prerequisite=None, action_name="Package update"):
    action_id = schedule_server_action(server_id,
                                       action_type='packages.update', action_name=action_name,
                                       org_id=org_id, prerequisite=prerequisite)
    h = rhnSQL.prepare(_query_schedule_server_packages_update_by_arch)

    for name_id, arch_id in package_arch_ids:
        h.execute(action_id=action_id, name_id=name_id, arch_id=arch_id)
    return action_id
 070701000001A3000081B40000000000000000000000015FBBE8EE0000048E000000000000000000000000000000000000002700000000spacewalk-backend/server/rhnAuthPAM.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import pam
import sys

from uyuni.common.usix import raise_with_tb
from spacewalk.common.rhnLog import log_error
from spacewalk.common.rhnException import rhnException


def check_password(username, password, service):
    try:
        auth = pam.pam()
        if not auth.authenticate(username, password, service=service):
            log_error("Password check failed (%s): %s" % (auth.code, auth.reason))
            return 0
        else:
            return 1
    except:
        raise_with_tb(rhnException('Internal PAM error'), sys.exc_info()[2])
  070701000001A4000081B40000000000000000000000015FBBE8EE000018F5000000000000000000000000000000000000002A00000000spacewalk-backend/server/rhnCapability.py #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

import re
import sys

# common module
from spacewalk.common import rhnFlags
from spacewalk.common.rhnLog import log_debug

# local module
from . import rhnSQL

# Globally store the parsed capabilities in rhnFlags


def set_client_capabilities(capabilities):
    if not capabilities:
        # No capabilities presented; don't set the global flag
        return

    caps = {}
    regexp = re.compile(
        r"^(?P<name>[^(]*)\((?P<version>[^)]*)\)\s*=\s*(?P<value>.*)$")
    for cap in capabilities:
        mo = regexp.match(cap)
        if not mo:
            # XXX Just ignoring it, for now
            continue
        dict = mo.groupdict()
        name = dict['name'].strip()
        version = dict['version'].strip()
        value = dict['value'].strip()

        caps[name] = {
            'version': version,
            'value': value,
        }

    rhnFlags.set('client-capabilities', caps)
    log_debug(4, "Client capabilities", caps)


def get_client_capabilities():
    return rhnFlags.get('client-capabilities')


def update_client_capabilities(server_id):
    caps = get_client_capabilities()

    if caps is None:
        caps = {}

    caps = caps.copy()

    h = rhnSQL.prepare("""
        select cc.capability_name_id, ccn.name capability, cc.version
        from rhnClientCapability cc, rhnClientCapabilityName ccn
        where cc.server_id = :server_id
        and cc.capability_name_id = ccn.id
    """)

    updates = {'server_id': [], 'capability_name_id': [], 'version': []}
    deletes = {'server_id': [], 'capability_name_id': []}
    inserts = {'server_id': [], 'capability': [], 'version': []}

    h.execute(server_id=server_id)
    while 1:
        row = h.fetchone_dict()
        if not row:
            break

        name = row['capability']
        version = row['version']
        capability_name_id = row['capability_name_id']

        if name in caps:
            local_ver = caps[name]['version']
            del caps[name]
            if local_ver == version:
                # Nothing to do - same version
                continue

            updates['server_id'].append(server_id)
            updates['capability_name_id'].append(capability_name_id)
            updates['version'].append(local_ver)
            continue

        # Have to delete it
        deletes['server_id'].append(server_id)
        deletes['capability_name_id'].append(capability_name_id)

    # Everything else has to be inserted
    for name, hash in list(caps.items()):
        inserts['server_id'].append(server_id)
        inserts['capability'].append(name)
        inserts['version'].append(hash['version'])

    log_debug(5, "Deletes:", deletes)
    log_debug(5, "Updates:", updates)
    log_debug(5, "Inserts:", inserts)

    if deletes['server_id']:
        h = rhnSQL.prepare("""
            delete from rhnClientCapability
            where server_id = :server_id
            and capability_name_id = :capability_name_id
        """)
        h.executemany(**deletes)

    if updates['server_id']:
        h = rhnSQL.prepare("""
            update rhnClientCapability
            set version = :version
            where server_id = :server_id
            and capability_name_id = :capability_name_id
        """)
        h.executemany(**updates)

    if inserts['server_id']:
        h = rhnSQL.prepare("""
            insert into rhnClientCapability
            (server_id, capability_name_id, version)
            values (:server_id, LOOKUP_CLIENT_CAPABILITY(:capability), :version)
        """)
        h.executemany(**inserts)

    # Commit work. This can be dangerous if there is previously uncommited
    # work
    rhnSQL.commit()


def set_server_capabilities():
    try:
        _set_server_capabilities()
    except rhnSQL.SQLError:
        e = sys.exc_info()[1]
        if e.args[0] != 1:
            # Not a unique constraint violation
            raise
        # Try again
        _set_server_capabilities()


def _set_server_capabilities():
    # XXX Will have to figure out how to define this
    capabilities = {
        'registration.register_osad': {'version': 1, 'value': 1},
        'registration.finish_message': {'version': 1, 'value': 1},
        'registration.remaining_subscriptions': {'version': 1, 'value': 1},
        'registration.update_contact_info': {'version': 1, 'value': 1},
        'registration.delta_packages': {'version': 1, 'value': 1},
        'registration.extended_update_support': {'version': 1, 'value': 1},
        'registration.smbios': {'version': 1, 'value': 1},
        'registration.update_systemid': {'version': 1, 'value': 1},
        'applet.has_base_channel': {'version': 1, 'value': 1},
        'xmlrpc.login.extra_data': {'version': 1, 'value': 1},
        'rhncfg.content.base64_decode': {'version': 1, 'value': 1},
        'rhncfg.filetype.directory': {'version': 1, 'value': 1},
        'xmlrpc.packages.extended_profile': {'version': '1-2', 'value': 1},
        'xmlrpc.packages.suse_products': {'version': 1, 'value': 1},
        'xmlrpc.packages.checksums': {'version': 1, 'value': 1},
        'xmlrpc.errata.patch_names': {'version': 1, 'value': 1},
        'staging_content': {'version': 1, 'value': 1},
        'ipv6': {'version': 1, 'value': 1},
        'abrt': {'version': 1, 'value': 1},
        'cpu_sockets': {'version': 1, 'value': 1},
        'queue.update_status': {'version': 1, 'value': 1},
        'mainframe_sysinfo': {'version': 1, 'value': 1},
        'machine_info': {'version': 1, 'value': 1},
    }
    l = []
    for name, hashval in list(capabilities.items()):
        l.append("%s(%s)=%s" % (name, hashval['version'], hashval['value']))

    log_debug(4, "Setting capabilities", l)
    rhnFlags.get("outputTransportOptions")['X-RHN-Server-Capability'] = l
   070701000001A5000081B40000000000000000000000015FBBE8EE00011B3B000000000000000000000000000000000000002700000000spacewalk-backend/server/rhnChannel.py    # -*- coding: utf-8 -*-
#
# Copyright (c) 2008--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

import time
import rpm
import sys
try:
    #  python 2
    import xmlrpclib
except ImportError:
    #  python3
    import xmlrpc.client as xmlrpclib

from uyuni.common.usix import IntType, raise_with_tb

# common module
from spacewalk.common import rhnCache, rhnFlags, suseLib
from spacewalk.common.rhnConfig import CFG
from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.common.rhnException import rhnFault, rhnException
from spacewalk.common.rhnTranslate import _

# local module
from . import rhnUser
from . import rhnSQL
from . import rhnLib


class NoBaseChannelError(Exception):
    pass


class InvalidServerArchError(Exception):
    pass


class BaseChannelDeniedError(Exception):
    pass


class ChannelException(Exception):

    def __init__(self, channel_id=None, *args, **kwargs):
        Exception.__init__(self, *args, **kwargs)
        self.channel_id = channel_id
        self.channel = None

class ModifiedError(ChannelException):
    pass


class IncompatibilityError(Exception):
    pass


class InvalidDataError(Exception):
    pass


class ChannelNotFoundError(Exception):
    pass


class NoToolsChannel(Exception):
    pass


class NoChildChannels(Exception):
    pass


class InvalidChannel(Exception):
    pass


class BaseDatabaseObject:

    def __init__(self):
        self._row = None

    def __getattr__(self, name):
        if name.startswith('get_'):
            return rhnLib.CallableObj(name[4:], self._get)
        if name.startswith('set_'):
            return rhnLib.CallableObj(name[4:], self._set)
        raise AttributeError(name)

    def _set(self, name, val):
        self._new_row()
        self._row[name] = val

    def _get(self, name):
        return self._row[name]

    def _new_row(self):
        raise NotImplementedError()

    def save(self, with_updates=1):
        try:
            return self._save(with_updates=with_updates)
        except:
            rhnSQL.rollback()
            raise

    def _save(self, with_updates=1):
        try:
            self._row.save(with_updates=with_updates)
        except rhnSQL.ModifiedRowError:
            raise_with_tb(ModifiedError(self._row['id']), sys.exc_info()[2])


class BaseChannelObject(BaseDatabaseObject):
    _table_name = None
    _sequence_name = None
    _generic_fields = []

    def load_by_label(self, label):
        self.__init__()
        self._row = rhnSQL.Row(self._table_name, 'label')
        self._row.load(label)
        return self

    def load_by_id(self, obj_id):
        self.__init__()
        self._row = rhnSQL.Row(self._table_name, 'id')
        self._row.load(obj_id)
        return self

    def load_from_dict(self, dict):
        # Re-init
        self.__init__()
        for f in self._generic_fields:
            method = getattr(self, 'set_' + f)
            method(dict.get(f))
        self._load_rest(dict)
        return self

    def _load_rest(self, dict):
        pass

    def exists(self):
        if not self._row:
            return 0
        return self._row.real

    def get_org_id(self):
        org_id = self._row['org_id']
        if org_id is None:
            return None
        row = self._lookup_org_id(org_id)
        if row.real:
            return row['login']
        return org_id

    def set_org_id(self, val):
        self._new_row()
        if val is None or isinstance(val, IntType):
            self._row['org_id'] = val
            return
        row = self._lookup_org_by_login(val)
        if not row.real:
            raise InvalidDataError("No such org", val)
        self._row['org_id'] = row['org_id']

    def _lookup_org_id(self, org_id):
        row = rhnSQL.Row('web_contact', 'org_id')
        row.load(org_id)
        return row

    def _lookup_org_by_login(self, login):
        row = rhnSQL.Row('web_contact', 'login')
        row.load(login)
        return row

    def _lookup_channel_family_by_id(self, channel_family_id):
        row = rhnSQL.Row('rhnChannelFamily', 'id')
        row.load(channel_family_id)
        return row

    def _lookup_channel_family_by_label(self, channel_family):
        row = rhnSQL.Row('rhnChannelFamily', 'label')
        row.load(channel_family)
        return row

    def _new_row(self):
        if self._row is None:
            self._row = rhnSQL.Row(self._table_name, 'id')
            channel_id = rhnSQL.Sequence(self._sequence_name).next()
            self._row.create(channel_id)

    def as_dict(self):
        ret = {}
        for f in self._generic_fields:
            method = getattr(self, 'get_' + f)
            val = method()
            ret[f] = val
        return ret

# Channel creation


class Channel(BaseChannelObject):
    _table_name = 'rhnChannel'
    _sequence_name = 'rhn_channel_id_seq'
    _generic_fields = ['label', 'name', 'summary', 'description', 'basedir',
                       'org_id', 'gpg_key_url', 'gpg_key_id', 'gpg_key_fp', 'end_of_life',
                       'channel_families', 'channel_arch', 'update_tag', ]

    def __init__(self):
        BaseChannelObject.__init__(self)
        self._channel_families = []
        self._dists = {}
        self._parent_channel_arch = None

    def load_by_label(self, label):
        BaseChannelObject.load_by_label(self, label)
        self._load_channel_families()
        self._load_dists()
        return self

    def load_by_id(self, label):
        BaseChannelObject.load_by_id(self, label)
        self._load_channel_families()
        self._load_dists()
        return self

    def _load_rest(self, dict):
        dists = dict.get('dists')
        if not dists:
            return
        for dist in dists:
            release = dist.get('release')
            os = dist.get('os')
            self._dists[release] = os

    _query_get_db_channel_families = rhnSQL.Statement("""
        select channel_family_id
          from rhnChannelFamilyMembers
         where channel_id = :channel_id
    """)

    def _get_db_channel_families(self, channel_id):
        if channel_id is None:
            return []
        h = rhnSQL.prepare(self._query_get_db_channel_families)
        h.execute(channel_id=channel_id)
        return [x['channel_family_id'] for x in h.fetchall_dict() or []]

    def _load_channel_families(self):
        channel_id = self._row.get('id')
        self._channel_families = self._get_db_channel_families(channel_id)
        return 1

    def _load_dists(self):
        channel_id = self._row.get('id')
        dists = self._get_db_dists(channel_id)
        self.set_dists(dists)

    _query_get_db_dists = rhnSQL.Statement("""
        select os, release
          from rhnDistChannelMap
         where channel_id = :channel_id
         and org_id is null
    """)

    def _get_db_dists(self, channel_id):
        if channel_id is None:
            return []
        h = rhnSQL.prepare(self._query_get_db_dists)
        h.execute(channel_id=channel_id)
        return h.fetchall_dict() or []

    # Setters

    def set_channel_arch(self, val):
        self._new_row()
        arch = self._sanitize_arch(val)
        row = self._lookup_channel_arch(arch)
        if not row.real:
            raise InvalidDataError("No such architecture", arch)
        self._row['channel_arch_id'] = row['id']

    def _sanitize_arch(self, arch):
        if arch == 'i386':
            return 'channel-ia32'
        p = 'channel-'
        if arch[:len(p)] != p:
            return p + arch
        return arch

    def set_parent_channel(self, val):
        self._new_row()
        if val is None:
            self._row['parent_channel'] = None
            return
        row = self._lookup_channel_by_label(val)
        if not row.real:
            raise InvalidDataError("Invalid parent channel", val)
        self._row['parent_channel'] = row['id']
        self._parent_channel_arch = row['channel_arch_id']

    def set_channel_families(self, val):
        self._new_row()
        self._channel_families = []
        for cf_label in val:
            self.add_channel_family(cf_label)

    def set_end_of_life(self, val):
        self._new_row()
        if val is None:
            self._row['end_of_life'] = None
            return
        t = time.strptime(val, "%Y-%m-%d")
        seconds = time.mktime(t)
        t = rhnSQL.TimestampFromTicks(seconds)
        self._row['end_of_life'] = t

    def add_channel_family(self, name):
        self._new_row()
        cf = self._lookup_channel_family_by_label(name)
        if not cf.real:
            raise InvalidDataError("Invalid channel family", name)
        self._channel_families.append(cf['id'])

    def add_dist(self, release, os=None):
        if os is None:
            os = 'SUSE Linux'
        self._dists[release] = os

    def set_dists(self, val):
        self._dists.clear()
        for h in val:
            release = h['release']
            os = h['os']
            self.add_dist(release, os)

    # Getters

    def get_parent_channel(self):
        pc_id = self._row['parent_channel']
        if pc_id is None:
            return None
        return self._lookup_channel_by_id(pc_id)['label']

    def get_channel_families(self):
        cf_labels = []
        for cf_id in self._channel_families:
            row = self._lookup_channel_family_by_id(cf_id)
            if row.real:
                cf_labels.append(row['label'])
        return cf_labels

    def get_channel_arch(self):
        channel_arch_id = self._row['channel_arch_id']
        row = self._lookup_channel_arch_by_id(channel_arch_id)
        assert row.real
        return row['label']

    def get_end_of_life(self):
        date_obj = self._row['end_of_life']
        if date_obj is None:
            return None
        return "%s-%02d-%02d %02d:%02d:%02d" % (
            date_obj.year, date_obj.month, date_obj.day,
            date_obj.hour, date_obj.minute, date_obj.second)

    def get_dists(self):
        ret = []
        for release, os in list(self._dists.items()):
            ret.append({'release': release, 'os': os})
        return ret

    def _lookup_channel_by_id(self, channel_id):
        row = rhnSQL.Row('rhnChannel', 'id')
        row.load(channel_id)
        return row

    def _lookup_channel_by_label(self, channel):
        row = rhnSQL.Row('rhnChannel', 'label')
        row.load(channel)
        return row

    def _lookup_channel_arch(self, channel_arch):
        row = rhnSQL.Row('rhnChannelArch', 'label')
        row.load(channel_arch)
        return row

    def _lookup_channel_arch_by_id(self, channel_arch_id):
        row = rhnSQL.Row('rhnChannelArch', 'id')
        row.load(channel_arch_id)
        return row

    def _save(self, with_updates=1):
        if self._parent_channel_arch:
            if not self._compatible_channel_arches(self._parent_channel_arch,
                                                   self._row['channel_arch_id']):
                raise IncompatibilityError("Incompatible channel arches")
        BaseChannelObject._save(self, with_updates=with_updates)
        # Save channel families now
        self._save_channel_families()
        self._save_dists()

    _query_remove_channel_families = rhnSQL.Statement("""
        delete from rhnChannelFamilyMembers
         where channel_id = :channel_id
           and channel_family_id = :channel_family_id
    """)
    _query_add_channel_families = rhnSQL.Statement("""
        insert into rhnChannelFamilyMembers (channel_id, channel_family_id)
        values (:channel_id, :channel_family_id)
    """)

    def _save_channel_families(self):
        channel_id = self._row['id']
        db_cfids = self._get_db_channel_families(channel_id)
        h = {}
        for db_cfid in db_cfids:
            h[db_cfid] = None
        to_add = []
        for cfid in self._channel_families:
            if cfid in h:
                del h[cfid]
                continue
            to_add.append(cfid)
        to_delete = list(h.keys())
        if to_delete:
            h = rhnSQL.prepare(self._query_remove_channel_families)
            cids = [channel_id] * len(to_delete)
            h.executemany(channel_id=cids, channel_family_id=to_delete)
        if to_add:
            h = rhnSQL.prepare(self._query_add_channel_families)
            cids = [channel_id] * len(to_add)
            h.executemany(channel_id=cids, channel_family_id=to_add)

    def _save_dists(self):
        channel_id = self._row['id']
        db_dists = self._get_db_dists(channel_id)
        d = self._dists.copy()
        to_add = [[], []]
        to_remove = []
        to_update = [[], []]
        for h in db_dists:
            release = h['release']
            os = h['os']
            if release not in d:
                to_remove.append(release)
                continue
            # Need to update?
            m_os = d[release]
            if m_os == os:
                # Nothing to do
                del d[release]
                continue
            to_update[0].append(release)
            to_update[1].append(os)
        # Everything else should be added
        for release, os in list(d.items()):
            to_add[0].append(release)
            to_add[1].append(os)
        self._remove_dists(to_remove)
        self._update_dists(to_update[0], to_update[1])
        self._add_dists(to_add[0], to_add[1])

    _query_add_dists = rhnSQL.Statement("""
        insert into rhnDistChannelMap
               (channel_id, channel_arch_id, release, os, org_id)
        values (:channel_id, :channel_arch_id, :release, :os, null)
        """)

    def _add_dists(self, releases, oses):
        self._modify_dists(self._query_add_dists, releases, oses)

    def _modify_dists(self, query, releases, oses):
        if not releases:
            return
        count = len(releases)
        channel_ids = [self._row['id']] * count
        query_args = {'channel_id': channel_ids, 'release': releases}
        if oses:
            channel_arch_ids = [self._row['channel_arch_id']] * count
            query_args.update({'channel_arch_id': channel_arch_ids,
                               'os': oses})
        h = rhnSQL.prepare(query)
        h.executemany(**query_args)

    _query_update_dists = rhnSQL.Statement("""
        update rhnDistChannelMap
           set channel_arch_id = :channel_arch_id,
               os = :os
         where channel_id = :channel_id
           and release = :release
           and org_id is null
    """)

    def _update_dists(self, releases, oses):
        self._modify_dists(self._query_update_dists, releases, oses)

    _query_remove_dists = rhnSQL.Statement("""
        delete from rhnDistChannelMap
         where channel_id = :channel_id
           and release = :release
           and org_id is null
    """)

    def _remove_dists(self, releases):
        self._modify_dists(self._query_remove_dists, releases, None)

    def _compatible_channel_arches(self, parent_channel_arch, channel_arch):
        # This could get more complicated later
        return (parent_channel_arch == channel_arch)

    def as_dict(self):
        ret = BaseChannelObject.as_dict(self)
        ret['dists'] = self.get_dists()
        return ret


class ChannelFamily(BaseChannelObject):
    _table_name = 'rhnChannelFamily'
    _sequence_name = 'rhn_channel_family_id_seq'
    _generic_fields = ['label', 'name', 'product_url']


def _load_by_id(query, item_object, pattern=None):
    qargs = {}
    if pattern:
        query += "and label like :pattern"
        qargs['pattern'] = pattern
    h = rhnSQL.prepare(query)
    h.execute(**qargs)
    ret = []
    while 1:
        row = h.fetchone_dict()
        if not row:
            break
        c = item_object.load_by_id(row['id'])
        ret.append(c.as_dict())
    return ret


def list_channel_families(pattern=None):
    query = """
            select id
              from rhnChannelFamily
             where org_id is null
        """
    return _load_by_id(query, ChannelFamily(), pattern)


def list_channels(pattern=None):
    query = """
            select id
              from rhnChannel
             where 1=1
        """
    return _load_by_id(query, Channel(), pattern)

# makes sure there are no None values in dictionaries, etc.


def __stringify(object):
    if object is None:
        return ''
    if type(object) == type([]):
        return list(map(__stringify, object))
    # We need to know __stringify converts immutable types into immutable
    # types
    if type(object) == type(()):
        return tuple(map(__stringify, object))
    if type(object) == type({}):
        ret = {}
        for k, v in list(object.items()):
            ret[__stringify(k)] = __stringify(v)
        return ret
    # by default, we just str() it
    return str(object)


# return the channel information
def channel_info(channel):
    log_debug(3, channel)

    # get the channel information
    h = rhnSQL.prepare("""
    select
        ca.label arch,
        c.id,
        c.parent_channel,
        c.org_id,
        c.label,
        c.name,
        c.summary,
        c.description,
        c.update_tag,
        to_char(c.last_modified, 'YYYYMMDDHH24MISS') last_modified
    from
        rhnChannel c,
        rhnChannelArch ca
    where
          c.channel_arch_id = ca.id
      and c.label = :channel
    """)
    h.execute(channel=str(channel))
    ret = h.fetchone_dict()
    return __stringify(ret)

# return information about a base channel for a server_id


def get_base_channel(server_id, none_ok=0):
    log_debug(3, server_id)
    h = rhnSQL.prepare("""
    select
        ca.label arch,
        c.id,
        c.parent_channel,
        c.org_id,
        c.label,
        c.name,
        c.summary,
        c.description,
        to_char(c.last_modified, 'YYYYMMDDHH24MISS') last_modified
    from rhnChannel c, rhnChannelArch ca, rhnServerChannel sc
    where sc.server_id = :server_id
      and sc.channel_id = c.id
      and c.channel_arch_id = ca.id
      and c.parent_channel is NULL
    """)
    h.execute(server_id=str(server_id))
    ret = h.fetchone_dict()
    if not ret:
        if not none_ok:
            log_error("Server not subscribed to a base channel!", server_id)
        return None
    return __stringify(ret)


def channels_for_server(server_id):
    """channel info list for all channels accessible by this server.

    list channels a server_id is subscribed to
    We DO NOT want to cache this one because we depend on getting
    accurate information and the caching would only introduce more
    overhead on an otherwise very fast query
    """
    log_debug(3, server_id)
    try:
        server_id = int(server_id)
    except:
        raise_with_tb(rhnFault(8, server_id), sys.exc_info()[2])  # Invalid rhnServer.id
    # XXX: need to return unsubsubcribed channels and a way to indicate
    #        they arent already subscribed

    # list all the channels this server is subscribed to. We also want
    # to know if any of those channels has local packages in it... A
    # local package has a org_id set.
    h = rhnSQL.prepare("""
    select
        ca.label arch,
        c.id,
        c.parent_channel,
        c.org_id,
        c.label,
        c.name,
        c.summary,
        c.description,
        c.gpg_key_url,
        case when c.gpg_check = 'Y' then 1 ELSE 0 end gpgcheck,
        :metadata_signed metadata_signed,
        case s.org_id when c.org_id then 1 else 0 end local_channel,
        TO_CHAR(c.last_modified, 'YYYYMMDDHH24MISS') last_modified
    from
        rhnChannelArch ca,
        rhnChannel c,
        rhnServerChannel sc,
        rhnServer s
    where
            c.id = sc.channel_id
        and sc.server_id = :server_id
        and s.id = :server_id
        and ca.id = c.channel_arch_id
    order by c.parent_channel nulls first
    """)
    h.execute(server_id=str(server_id), metadata_signed=(CFG.SIGN_METADATA == 1 and 1 or 0))
    channels = h.fetchall_dict()
    if not channels:
        log_error("Server not subscribed to any channels", server_id)
        channels = []
    return __stringify(channels)

def getSubscribedChannels(server_id):
    """
    Format the response from channels_for_server in the way that the
    handlers expect.
    """
    channelList = channels_for_server(server_id)
    channels = []
    for each in channelList:
        if 'last_modified' not in each:
            # No last_modified attribute
            # Probably an empty channel, so ignore
            continue
        channel = [each['label'], each['last_modified']]
        # isBaseChannel
        if each['parent_channel']:
            flag = "0"
        else:
            flag = "1"
        channel.append(flag)

        # isLocalChannel
        if each['local_channel']:
            flag = "1"
        else:
            flag = "0"
        channel.append(flag)

        channels.append(channel)
    return channels

def isCustomChannel(channel_id):
    """
    Input:      channel_id  (from DB Table rhnChannel.id)
    Returns:    True if this is a custom channel
            False if this is not a custom channel
    """
    log_debug(3, channel_id)
    h = rhnSQL.prepare("""
    select
        rcf.label
    from
        rhnChannelFamily rcf,
        rhnChannelFamilyMembers rcfm
    where
        rcfm.channel_id = :channel_id
        and rcfm.channel_family_id = rcf.id
        and rcf.org_id is not null
    """)
    h.execute(channel_id=str(channel_id))
    label = h.fetchone()
    if label:
        if label[0].startswith("private-channel-family"):
            log_debug(3, channel_id, "is a custom channel")
            return True
    return False


# Fetch base channel for a given release and arch
def base_channel_for_rel_arch(release, server_arch, org_id=-1,
                              user_id=None):
    log_debug(4, release, server_arch, org_id, user_id)

    query = """
        select ca.label arch,
               c.id,
               c.parent_channel,
               c.org_id,
               c.label,
               c.name,
               c.summary,
               c.description,
               to_char(c.last_modified, 'YYYYMMDDHH24MISS') last_modified
          from rhnChannel c,
               rhnChannelArch ca
        where c.channel_arch_id = ca.id
          and c.id = rhn_channel.base_channel_for_release_arch(
                :release, :server_arch, :org_id, :user_id)
    """
    rhnSQL.transaction("base_channel_for_rel_arch")
    h = rhnSQL.prepare(query)
    try:
        h.execute(release=str(release), server_arch=str(server_arch),
                  org_id=org_id, user_id=user_id)
    except rhnSQL.SQLSchemaError:
        e = sys.exc_info()[1]
        rhnSQL.rollback("base_channel_for_rel_arch")
        if e.errno == 20263:
            # Insufficient permissions for subscription
            log_debug(4, 'BaseChannelDeniedError')
            raise_with_tb(BaseChannelDeniedError(), sys.exc_info()[2])
        if e.errno == 20244:
            # Server architecture could not be found
            log_debug(4, 'InvalidServerArchError')
            raise_with_tb(InvalidServerArchError(str(server_arch)), sys.exc_info()[2])
        # Re-raise unknown eceptions
        log_debug(4, 'unkown exception')
        raise

    log_debug(4, 'got past exceptions')
    return h.fetchone_dict()


def base_eus_channel_for_ver_rel_arch(version, release, server_arch,
                                      org_id=-1, user_id=None):
    """
    given a redhat-release version, release, and server arch, return a list
    of dicts containing the details of the channel z streams either match the
    version/release pair, or are greater.
    """

    log_debug(4, version, release, server_arch, org_id, user_id)

    eus_channels_query = """
        select c.id,
               c.label,
               c.name,
               rcm.release,
               c.receiving_updates
        from
            rhnChannelPermissions cp,
            rhnChannel c,
            rhnServerArch sa,
            rhnServerChannelArchCompat scac,
            rhnReleaseChannelMap rcm
        where
                rcm.version = :version
            and scac.server_arch_id = sa.id
            and sa.label = :server_arch
            and scac.channel_arch_id = rcm.channel_arch_id
            and rcm.channel_id = c.id
            and cp.channel_id = c.id
            and cp.org_id = :org_id
            and rhn_channel.loose_user_role_check(c.id, :user_id,
                                                     'subscribe') = 1
    """

    eus_channels_prepared = rhnSQL.prepare(eus_channels_query)
    eus_channels_prepared.execute(version=version,
                                  server_arch=server_arch,
                                  user_id=user_id,
                                  org_id=org_id)

    channels = []
    while True:
        channel = eus_channels_prepared.fetchone_dict()
        if channel is None:
            break

        # the release part of redhat-release for rhel 4 is like
        # 6.1 or 7; we just look at the first digit.
        # for rhel 5 and up it's the full release number of rhel, followed by
        # the true release number of the rpm, like 5.0.0.9 (for the 9th
        # version of the redhat-release rpm, for RHEL GA)
        db_release = channel['release']
        if version in ['4AS', '4ES']:
            parts = 1
        else:
            parts = 2

        server_rel = '.'.join(release.split('-')[0].split('.')[:parts])
        channel_rel = '.'.join(db_release.split('-')[0].split('.')[:parts])

        # XXX we're no longer using the is_default column from the db
        if rpm.labelCompare(('0', server_rel, '0'),
                            ('0', channel_rel, '0')) == 0:
            channel['is_default'] = 'Y'
            channels.append(channel)
        if rpm.labelCompare(('0', server_rel, '0'),
                            ('0', channel_rel, '0')) < 0:
            channel['is_default'] = 'N'
            channels.append(channel)

    return channels


def get_channel_for_release_arch(release, server_arch, org_id=None):
    log_debug(3, release, server_arch)

    server_arch = rhnLib.normalize_server_arch(str(server_arch))
    log_debug(3, 'normalized arch as %s' % server_arch)

    if org_id is None:
        query = """
            select distinct
                   ca.label arch,
                   c.id,
                   c.parent_channel,
                   c.org_id,
                   c.label,
                   c.name,
                   c.summary,
                   c.description,
                   to_char(c.last_modified, 'YYYYMMDDHH24MISS') last_modified
              from rhnDistChannelMap dcm,
                   rhnChannel c,
                   rhnChannelArch ca,
                   rhnServerChannelArchCompat scac,
                   rhnServerArch sa
             where scac.server_arch_id = sa.id
               and sa.label = :server_arch
               and scac.channel_arch_id = dcm.channel_arch_id
               and dcm.release = :release
               and dcm.channel_id = c.id
               and dcm.channel_arch_id = c.channel_arch_id
               and dcm.org_id is null
               and c.parent_channel is null
               and c.org_id is null
               and c.channel_arch_id = ca.id
        """
    else:
        query = """
            select distinct
                   ca.label arch,
                   c.id,
                   c.parent_channel,
                   c.org_id,
                   c.label,
                   c.name,
                   c.summary,
                   c.description,
                   to_char(c.last_modified, 'YYYYMMDDHH24MISS') last_modified
              from rhnOrgDistChannelMap odcm,
                   rhnChannel c,
                   rhnChannelArch ca,
                   rhnServerChannelArchCompat scac,
                   rhnServerArch sa
             where scac.server_arch_id = sa.id
               and sa.label = :server_arch
               and scac.channel_arch_id = odcm.channel_arch_id
               and odcm.release = :release
               and odcm.channel_id = c.id
               and odcm.channel_arch_id = c.channel_arch_id
               and odcm.org_id = :org_id
               and c.parent_channel is null
               and c.org_id is null
               and c.channel_arch_id = ca.id
        """
    h = rhnSQL.prepare(query)
    h.execute(release=str(release), server_arch=server_arch, org_id=org_id)
    row = h.fetchone_dict()
    if not row:
        # No channles for this guy
        log_debug(3, 'No channles for this guy')
        return None
    log_debug(3, 'row is %s' % str(row))
    return row


def applet_channels_for_uuid(uuid):
    log_debug(3, uuid)

    query = """
        select distinct
               ca.label arch,
               c.id,
               c.parent_channel,
               c.org_id,
               c.label,
               c.name,
               c.summary,
               c.description,
               to_char(c.last_modified, 'YYYYMMDDHH24MISS') last_modified,
               to_char(s.channels_changed, 'YYYYMMDDHH24MISS') server_channels_changed
          from rhnChannelArch ca,
               rhnChannel c,
               rhnServerChannel sc,
               rhnServer s,
               rhnServerUuid su
         where su.uuid = :uuid
           and su.server_id = s.id
           and su.server_id = sc.server_id
           and sc.channel_id = c.id
           and c.channel_arch_id = ca.id
    """
    h = rhnSQL.prepare(query)
    h.execute(uuid=uuid)
    rows = h.fetchall_dict() or []
    return rows

# retrieve a list of public channels for a given release and architecture
# we cannot cache this if it involves an org_id
# If a user_id is passed to this function, and all the available base channels
# for this server_arch/release combination are denied by the org admin, this
# function raises BaseChannelDeniedError


def channels_for_release_arch(release, server_arch, org_id=-1, user_id=None):
    if not org_id:
        org_id = -1

    org_id = str(org_id).strip()
    log_debug(3, release, server_arch, org_id)

    # Can raise BaseChannelDeniedError or InvalidServerArchError
    base_channel = base_channel_for_rel_arch(release, server_arch,
                                             org_id=org_id, user_id=user_id)

    if not base_channel:
        raise NoBaseChannelError()

    # At this point, base_channel is not null

    # We assume here that subchannels are compatible with the base channels,
    # so there would be no need to check for arch compatibility from this
    # point
    h = rhnSQL.prepare("""
    select
        ca.label arch,
        c.id,
        c.parent_channel,
        c.org_id,
        c.label,
        c.name,
        c.summary,
        c.description,
        to_char(c.last_modified, 'YYYYMMDDHH24MISS') last_modified,
        -- If user_id is null, then the channel is subscribable
        rhn_channel.loose_user_role_check(c.id, :user_id, 'subscribe')
            subscribable
    from
        rhnChannelPermissions cp,
        rhnOrgDistChannelMap odcm,
        rhnChannel c,
        rhnChannelArch ca
    where
        c.id = odcm.channel_id
    and odcm.os in (
        'Powertools'
    )
    and odcm.for_org_id = :org_id
    and c.channel_arch_id = ca.id
    and cp.channel_id = c.id
    and cp.org_id = :org_id
    and c.parent_channel = :parent_channel
    """)
    h.execute(org_id=org_id,
              parent_channel=base_channel['id'], user_id=user_id)

    channels = [base_channel]
    while 1:
        row = h.fetchone_dict()
        if not row:
            break
        subscribable = row['subscribable']
        del row['subscribable']

        if not subscribable:
            # Not allowed to subscribe to this channel
            continue

        channels.append(row)

    return __stringify(channels)


_query_get_source_packages_from_ids = rhnSQL.Statement("""
    select srpm.name
      from rhnChannelPackage cp,
           rhnPackage p,
           rhnSourceRPM srpm
     where cp.channel_id = :channel_id
       and cp.package_id = p.id
       and p.source_rpm_id = srpm.id
""")


def list_packages_source(channel_id):
    ret = []
    h = rhnSQL.prepare(_query_get_source_packages_from_ids)
    h.execute(channel_id=channel_id)
    results = h.fetchall_dict()
    if results:
        for r in results:
            r = r['name']
            if r.find(".rpm") != -1:
                r = r.replace(".rpm", "")
                new_evr = rhnLib.make_evr(r, source=1)
                new_evr_list = [new_evr['name'], new_evr['version'], new_evr['release'], new_evr['epoch']]
            ret.append(new_evr_list)

    return ret

# the latest packages from the specified channel
_query_all_packages_from_channel_checksum = """
    select
        p.id,
        pn.name,
        pevr.version,
        pevr.release,
        pevr.epoch,
        pa.label arch,
        p.package_size,
        ct.label as checksum_type,
        c.checksum
    from
        rhnChannelPackage cp,
        rhnPackage p,
        rhnPackageName pn,
        rhnPackageEVR pevr,
        rhnPackageArch pa,
        rhnChecksumType ct,
        rhnChecksum c
    where
        cp.channel_id = :channel_id
    and cp.package_id = p.id
    and p.name_id = pn.id
    and p.evr_id = pevr.id
    and p.package_arch_id = pa.id
    and p.checksum_id = c.id
    and c.checksum_type_id = ct.id
    order by pn.name, pevr.evr desc, pa.label
    """

# This function executes the SQL call for listing packages with checksum info


def list_all_packages_checksum_sql(channel_id):
    log_debug(3, channel_id)
    h = rhnSQL.prepare(_query_all_packages_from_channel_checksum)
    h.execute(channel_id=str(channel_id))
    ret = h.fetchall_dict()
    if not ret:
        return []
    # process the results
    ret = [(a["name"], a["version"], a["release"], a["epoch"],
                         a["arch"], a["package_size"], a['checksum_type'],
                         a['checksum']) for a in __stringify(ret)]
    return ret

# This function executes the SQL call for listing latest packages with
# checksum info


def list_packages_checksum_sql(channel_id):
    log_debug(3, channel_id)
    # return the latest packages from the specified channel
    query = """
    select
        pn.name,
        pevr.version,
        pevr.release,
        pevr.epoch,
        pa.label arch,
        full_channel.package_size,
        full_channel.checksum_type,
        full_channel.checksum
    from
        rhnPackageArch pa,
        ( select
            p.name_id,
            max(pe.evr) evr
          from
            rhnChannelPackage cp,
            rhnPackage p,
            rhnPackageEVR pe
          where
              cp.channel_id = :channel_id
          and cp.package_id = p.id
          and p.evr_id = pe.id
          group by p.name_id
        ) listall,
        ( select distinct
            p.package_size,
            p.name_id,
            p.evr_id,
            p.package_arch_id,
            ct.label as checksum_type,
            c.checksum
          from
            rhnChannelPackage cp,
            rhnPackage p,
            rhnChecksumType ct,
            rhnChecksum c
          where
              cp.channel_id = :channel_id
          and cp.package_id = p.id
          and p.checksum_id = c.id
          and c.checksum_type_id = ct.id
        ) full_channel,
        -- Rank the package's arch
        ( select
            package_arch_id,
            count(*) rank
          from
            rhnServerPackageArchCompat
          group by package_arch_id
        ) arch_rank,
        rhnPackageName pn,
        rhnPackageEVR pevr
    where
        pn.id = listall.name_id
        -- link back to the specific package
    and full_channel.name_id = listall.name_id
    and full_channel.evr_id = pevr.id
    and pevr.evr = listall.evr
    and pa.id = full_channel.package_arch_id
    and pa.id = arch_rank.package_arch_id
    order by pn.name, arch_rank.rank desc
    """
    h = rhnSQL.prepare(query)
    h.execute(channel_id=str(channel_id))
    ret = h.fetchall_dict()
    if not ret:
        return []
    # process the results
    ret = [(a["name"], a["version"], a["release"], a["epoch"],
                         a["arch"], a["package_size"], a['checksum_type'],
                         a['checksum']) for a in __stringify(ret)]
    return ret

# This function executes the SQL call for listing packages


def _list_packages_sql(query, channel_id):
    h = rhnSQL.prepare(query)
    h.execute(channel_id=str(channel_id))
    ret = h.fetchall_dict()
    if not ret:
        return []
    # process the results
    ret = [(a["name"], a["version"], a["release"], a["epoch"],
                         a["arch"], a["package_size"]) for a in __stringify(ret)]
    return ret


def list_packages_sql(channel_id):
    log_debug(3, channel_id)
    # return the latest packages from the specified channel
    query = """
    select
        pn.name,
        pevr.version,
        pevr.release,
        pevr.epoch,
        pa.label arch,
        full_channel.package_size
    from
        rhnPackageArch pa,
        ( select
            p.name_id,
            max(pe.evr) evr
          from
            rhnChannelPackage cp,
            rhnPackage p,
            rhnPackageEVR pe
          where
              cp.channel_id = :channel_id
          and cp.package_id = p.id
          and p.evr_id = pe.id
          group by p.name_id
        ) listall,
        ( select distinct
            p.package_size,
            p.name_id,
            p.evr_id,
            p.package_arch_id
          from
            rhnChannelPackage cp,
            rhnPackage p
          where
              cp.channel_id = :channel_id
          and cp.package_id = p.id
        ) full_channel,
        -- Rank the package's arch
        ( select
            package_arch_id,
            count(*) rank
          from
            rhnServerPackageArchCompat
          group by package_arch_id
        ) arch_rank,
        rhnPackageName pn,
        rhnPackageEVR pevr
    where
        pn.id = listall.name_id
        -- link back to the specific package
    and full_channel.name_id = listall.name_id
    and full_channel.evr_id = pevr.id
    and pevr.evr = listall.evr
    and pa.id = full_channel.package_arch_id
    and pa.id = arch_rank.package_arch_id
    order by pn.name, arch_rank.rank desc
    """
    return _list_packages_sql(query, channel_id)

# the latest packages from the specified channel
_query_latest_packages_from_channel = """
    select
        p.id,
        pn.name,
        pevr.version,
        pevr.release,
        pevr.epoch,
        pa.label arch,
        p.package_size
    from
        rhnChannelPackage cp,
        rhnPackage p,
        rhnPackageName pn,
        rhnPackageEVR pevr,
        rhnPackageArch pa
    where
        cp.channel_id = :channel_id
    and cp.package_id = p.id
    and p.name_id = pn.id
    and p.evr_id = pevr.id
    and p.package_arch_id = pa.id
    order by pn.name, pevr.evr desc, pa.label
    """

# This function executes the SQL call for listing packages


def list_all_packages_sql(channel_id):
    log_debug(3, channel_id)
    return _list_packages_sql(_query_latest_packages_from_channel, channel_id)

# This function executes the SQL call for listing packages with all the
# dep information for each package also


def list_all_packages_complete_sql(channel_id):
    log_debug(3, channel_id)
    # return the latest packages from the specified channel
    h = rhnSQL.prepare(_query_latest_packages_from_channel)
    # This gathers the provides, requires, conflicts, obsoletes info
    g = rhnSQL.prepare("""
    select
       pp.package_id,
       'provides' as capability_type,
       pp.capability_id,
       pp.sense,
       pc.name,
       pc.version
    from
       rhnPackageProvides pp,
       rhnPackageCapability pc
    where
       pp.package_id = :package_id
       and pp.capability_id = pc.id
    union all
    select
       pr.package_id,
       'requires' as capability_type,
       pr.capability_id,
       pr.sense,
       pc.name,
       pc.version
    from
       rhnPackageRequires pr,
       rhnPackageCapability pc
    where
       pr.package_id = :package_id
       and pr.capability_id = pc.id
    union all
    select
       prec.package_id,
       'recommends' as capability_type,
       prec.capability_id,
       prec.sense,
       pc.name,
       pc.version
    from
       rhnPackageRecommends prec,
       rhnPackageCapability pc
    where
       prec.package_id = :package_id
       and prec.capability_id = pc.id
    union all
    select
       sugg.package_id,
       'suggests' as capability_type,
       sugg.capability_id,
       sugg.sense,
       pc.name,
       pc.version
    from
       rhnPackageSuggests sugg,
       rhnPackageCapability pc
    where
       sugg.package_id = :package_id
       and sugg.capability_id = pc.id
    union all
    select
       supp.package_id,
       'supplements' as capability_type,
       supp.capability_id,
       supp.sense,
       pc.name,
       pc.version
    from
       rhnPackageSupplements supp,
       rhnPackageCapability pc
    where
       supp.package_id = :package_id
       and supp.capability_id = pc.id
    union all
    select
       enh.package_id,
       'enhances' as capability_type,
       enh.capability_id,
       enh.sense,
       pc.name,
       pc.version
    from
       rhnPackageEnhances enh,
       rhnPackageCapability pc
    where
       enh.package_id = :package_id
       and enh.capability_id = pc.id
    union all
    select
       pcon.package_id,
       'conflicts' as capability_type,
       pcon.capability_id,
       pcon.sense,
       pc.name,
       pc.version
    from
       rhnPackageConflicts pcon,
       rhnPackageCapability pc
    where
       pcon.package_id = :package_id
       and pcon.capability_id = pc.id
    union all
    select
       po.package_id,
       'obsoletes' as capability_type,
       po.capability_id,
       po.sense,
       pc.name,
       pc.version
    from
       rhnPackageObsoletes po,
       rhnPackageCapability pc
    where
       po.package_id = :package_id
       and po.capability_id = pc.id
    union all
    select
       brks.package_id,
       'breaks' as capability_type,
       brks.capability_id,
       brks.sense,
       pc.name,
       pc.version
    from
       rhnPackageBreaks brks,
       rhnPackageCapability pc
    where
       brks.package_id = :package_id
       and brks.capability_id = pc.id
    union all
    select
       pdep.package_id,
       'predepends' as capability_type,
       pdep.capability_id,
       pdep.sense,
       pc.name,
       pc.version
    from
       rhnPackagePredepends pdep,
       rhnPackageCapability pc
    where
       pdep.package_id = :package_id
       and pdep.capability_id = pc.id
    """)

    h.execute(channel_id=str(channel_id))
    # XXX This query has to order the architectures somehow; the 7.2 up2date
    # client was broken and was selecting the wrong architecture if athlons
    # are passed first. The rank ordering here should make sure that i386
    # kernels appear before athlons.
    ret = h.fetchall_dict()
    if not ret:
        return []
    for pkgi in ret:
        pkgi['provides'] = []
        pkgi['requires'] = []
        pkgi['conflicts'] = []
        pkgi['obsoletes'] = []
        pkgi['recommends'] = []
        pkgi['suggests'] = []
        pkgi['supplements'] = []
        pkgi['enhances'] = []
        pkgi['breaks'] = []
        pkgi['predepends'] = []
        g.execute(package_id=pkgi["id"])
        deps = g.fetchall_dict() or []
        for item in deps:
            version = item['version'] or ""
            relation = ""
            if version:
                sense = item['sense'] or 0
                if sense & 2:
                    relation = relation + "<"
                if sense & 4:
                    relation = relation + ">"
                if sense & 8:
                    relation = relation + "="
                if relation:
                    relation = " " + relation
                if version:
                    version = " " + version
            dep = item['name'] + relation + version
            pkgi[item['capability_type']].append(dep)
    # process the results
    ret = [(a["name"], a["version"], a["release"], a["epoch"],
                         a["arch"], a["package_size"], a['provides'],
                         a['requires'], a['conflicts'], a['obsoletes'], a['recommends'], a['suggests'], a['supplements'], a['enhances'], a['breaks'], a['predepends']) for a in __stringify(ret)]
    return ret


def list_packages_path(channel_id):
    log_debug(3, channel_id)
    # return the latest packages from the specified channel
    h = rhnSQL.prepare("""
    select
        p.path
    from
        rhnPackage p,
        rhnChannelPackage cp
    where
        cp.channel_id = :channel_id
    and cp.package_id = p.id
    """)
    h.execute(channel_id=str(channel_id))
    ret = h.fetchall()
    if not ret:
        return []
    # process the results
    # ret = map(lambda a: (a["path"]),
        # __stringify(ret))
    return ret


# list the latest packages for a channel
def list_packages(channel):
    return _list_packages(channel, cache_prefix="list_packages",
                          function=list_packages_sql)

# list _all_ the packages for a channel


def list_all_packages(channel):
    return _list_packages(channel, cache_prefix="list_all_packages",
                          function=list_all_packages_sql)

# list _all_ the packages for a channel, including checksum info


def list_all_packages_checksum(channel):
    return _list_packages(channel, cache_prefix="list_all_packages_checksum",
                          function=list_all_packages_checksum_sql)

# list _all_ the packages for a channel


def list_all_packages_complete(channel):
    return _list_packages(channel, cache_prefix="list_all_packages_complete",
                          function=list_all_packages_complete_sql)

# Common part of list_packages and list_all_packages*
# cache_prefix is the prefix for the file name we're caching this request as
# function is the generator function


def _list_packages(channel, cache_prefix, function):
    log_debug(3, channel, cache_prefix)

    # try the caching thing first
    c_info = channel_info(channel)
    if not c_info:  # unknown channel
        raise rhnFault(40, "could not find any data on channel '%s'" % channel)
    cache_entry = "%s-%s" % (cache_prefix, channel)
    ret = rhnCache.get(cache_entry, c_info["last_modified"])
    if ret:  # we scored a cache hit
        log_debug(4, "Scored cache hit", channel)
        # Mark the response as being already XMLRPC-encoded
        rhnFlags.set("XMLRPC-Encoded-Response", 1)
        return ret

    ret = function(c_info["id"])
    if not ret:
        # we assume that channels with no packages are very fast to list,
        # so we don't bother caching...
        log_error("No packages found in channel",
                  c_info["id"], c_info["label"])
        return []
    # we need to append the channel label to the list
    ret = list(map(lambda a, c=channel: a + (c,), ret))
    ret = xmlrpclib.dumps((ret, ), methodresponse=1)
    # Mark the response as being already XMLRPC-encoded
    rhnFlags.set("XMLRPC-Encoded-Response", 1)
    # set the cache
    rhnCache.set(cache_entry, ret, c_info["last_modified"])
    return ret


def getChannelInfoForKickstart(kickstart):
    query = """
    select c.label,
           to_char(c.last_modified, 'YYYYMMDDHH24MISS') last_modified
      from rhnChannel c,
           rhnKickstartableTree kt
     where c.id = kt.channel_id
       and kt.label = :kickstart_label
    """
    h = rhnSQL.prepare(query)
    h.execute(kickstart_label=str(kickstart))
    return h.fetchone_dict()


def getChannelInfoForKickstartOrg(kickstart, org_id):
    query = """
    select c.label,
           to_char(c.last_modified, 'YYYYMMDDHH24MISS') last_modified
      from rhnChannel c,
           rhnKickstartableTree kt
     where c.id = kt.channel_id
       and kt.label = :kickstart_label
       and kt.org_id = :org_id
    """
    h = rhnSQL.prepare(query)
    h.execute(kickstart_label=str(kickstart), org_id=int(org_id))
    return h.fetchone_dict()


def getChannelInfoForKickstartSession(session):
    # decode the session string
    try:
        session_id = int(session.split('x')[0].split(':')[0])
    except Exception:
        return None, None

    query = """
    select c.label,
           to_char(c.last_modified, 'YYYYMMDDHH24MISS') last_modified
      from rhnChannel c,
           rhnKickstartableTree kt,
           rhnKickstartSession ks
     where c.id = kt.channel_id
       and kt.id = ks.kstree_id
       and ks.id = :session_id
    """
    h = rhnSQL.prepare(query)
    h.execute(session_id=session_id)
    return h.fetchone_dict()


def getChildChannelInfoForKickstart(kickstart, child):
    query = """
    select c.label,
           to_char(c.last_modified, 'YYYYMMDDHH24MISS') last_modified
      from rhnChannel c,
           rhnKickstartableTree kt,
           rhnKickstartSession ks,
           rhnChannel c2
     where c2.id = kt.channel_id
       and kt.label = :kickstart_label
       and c.label = :child_label
       and c.parent_channel = c2.id
    """
    h = rhnSQL.prepare(query)
    h.execute(kickstart_label=str(kickstart), child_label=str(child))
    return h.fetchone_dict()


def getChannelInfoForTinyUrl(tinyurl):
    query = """
    select tu.url
      from rhnTinyUrl tu
     where tu.enabled = 'Y'
       and tu.token = :tinyurl
    """
    h = rhnSQL.prepare(query)
    h.execute(tinyurl=str(tinyurl))
    return h.fetchone_dict()

# list the obsoletes for a channel


def list_obsoletes(channel):
    log_debug(3, channel)

    # try the caching thing first
    c_info = channel_info(channel)
    if not c_info:  # unknown channel
        raise rhnFault(40, "could not find any data on channel '%s'" % channel)
    cache_entry = "list_obsoletes-%s" % channel
    ret = rhnCache.get(cache_entry, c_info["last_modified"])
    if ret:  # we scored a cache hit
        log_debug(4, "Scored cache hit", channel)
        return ret

    # Get the obsoleted packages
    h = rhnSQL.prepare("""
        select  distinct
                pn.name,
                pe.version, pe.release, pe.epoch,
                pa.label arch,
                pc.name obsolete_name,
                pc.version obsolete_version,
                p_info.sense
        from    rhnPackageCapability pc,
                rhnPackageArch pa,
                rhnPackageEVR pe,
                rhnPackageName pn,
                rhnPackage p,
                (   select  cp.channel_id,
                            po.package_id, po.capability_id, po.sense
                    from    rhnPackageObsoletes po,
                            rhnChannelPackage cp,
                            rhnChannel c
                    where   1=1
                        and c.label = :channel
                        and c.id = cp.channel_id
                        and cp.package_id = po.package_id
                ) p_info
        where   1=1
            and p_info.package_id = p.id
            and p.name_id = pn.id
            and p.evr_id = pe.id
            and p.package_arch_id = pa.id
            and p_info.capability_id = pc.id
    """)
    h.execute(channel=str(channel))
    # Store stuff in a dictionary to makes things simpler
    hash = {}
    while 1:
        row = h.fetchone_dict()
        if not row:
            break
        row = __stringify(row)
        key = (row['name'], row['version'], row['release'],
               row["epoch"], row['arch'])
        value = key + (row['obsolete_name'], row['obsolete_version'],
                       row['sense'])
        if key not in hash:
            hash[key] = []
        hash[key].append(value)

    # Now grab a listall and match it against what we got
    pkglist = list_packages_sql(c_info["id"])
    result = []
    for pkg in pkglist:
        key = tuple(pkg[:5])
        if key in hash:
            for p in hash[key]:
                result.append(p)
    # we can cache this now
    rhnCache.set(cache_entry, result, c_info["last_modified"])
    return result


def __auth_user(server_id, username, password):
    """ Auth if user can add/remove channel from given server """
    log_debug(3, server_id, username)
    # check the username and password for compliance
    user = rhnUser.auth_username_password(username, password)
    # The user's password checks, verify that they have perms on that
    # server.
    h = rhnSQL.prepare("""
    select 1
    from rhnUserServerPerms usp
    where usp.user_id = :user_id
    and   usp.server_id = :server_id
    """)
    h.execute(user_id=str(user.getid()), server_id=str(server_id))
    res = h.fetchone_dict()
    if not res:
        # Not allowed to perform administrative tasks on this server
        raise rhnFault(37)
    return 1


# small wrapper around a PL/SQL function
def subscribe_sql(server_id, channel_id, commit=1):
    log_debug(3, server_id, channel_id, commit)
    subscribe_channel = rhnSQL.Procedure("rhn_channel.subscribe_server")
    try:
        # don't run the EC yet
        subscribe_channel(server_id, channel_id, 0)
    except rhnSQL.SQLSchemaError:
        e = sys.exc_info()[1]
        if e.errno == 20102:  # channel_server_one_base
            log_error("Channel subscribe failed, "
                      "%s already subscribed to %s (?)" % (server_id, channel_id))
            raise_with_tb(rhnFault(38, "Server already subscribed to %s" % channel_id), sys.exc_info()[2])
        # If we got here, it's an unknown error; ISE (for now)
        log_error("SQLSchemaError", e)
        raise_with_tb(rhnException(e), sys.exc_info()[2])
    except rhnSQL.SQLError:
        e = sys.exc_info()[1]
        # If we got here, it's an unknown error; ISE (for now)
        log_error("SQLError", e)
        raise_with_tb(rhnException(e), sys.exc_info()[2])
    if commit:
        rhnSQL.commit()
    return 1

_query_channel_details = rhnSQL.Statement("""
select c.id, c.label, c.parent_channel
  from rhnChannel c
 where c.label = :channel
""")

_query_server_parent_channel = rhnSQL.Statement("""
select pc.id, pc.label
  from rhnChannel c
  join rhnServerChannel sc on c.parent_channel = sc.channel_id
  join rhnChannel pc on c.parent_channel = pc.id
 where sc.server_id = :sid
 group by pc.id, pc.label
""")

_query_can_subscribe = rhnSQL.Statement("""
select rhn_channel.user_role_check(:cid, wc.id, 'subscribe') as can_subscribe
  from web_contact wc
 where wc.login_uc = upper(:username)
""")

# subscribe a server to a channel with authentication
def subscribe_channel(server_id, channel, username, password):
    log_debug(3, server_id, channel, username)
    # If auth doesn't blow up we're fine
    __auth_user(server_id, username, password)

    # get channel details
    h = rhnSQL.prepare(_query_channel_details)
    h.execute(channel=str(channel))
    channel_details = h.fetchone_dict()
    if not channel_details:
        log_error("Channel %s does not exist?" % channel)
        raise rhnFault(40, "Channel %s does not exist?" % channel)

    # get server's parent channel
    h = rhnSQL.prepare(_query_server_parent_channel)
    h.execute(sid=server_id)
    server_parent_channel = h.fetchone_dict()

    # Can't add more than one parent or child of parent channel to which server isn't subscibed
    if not channel_details['parent_channel'] and server_parent_channel:
            log_error("Cannot add parent channel %s. Server already subscribed to parent channel %s." %
                      (channel, server_parent_channel['label']))
            raise rhnFault(32, "Cannot add parent channel %s. Server already subscribed to parent channel %s." %
                      (channel, server_parent_channel['label']))
    else:
        if ( server_parent_channel and
             server_parent_channel['id'] != channel_details['parent_channel'] ):
            log_error("Server is not subscribed to parent of channel %s." % channel)
            raise rhnFault(32, "Server is not subscribed to parent of channel %s." % channel)

    # check specific channel subscription permissions
    h = rhnSQL.prepare(_query_can_subscribe)
    h.execute(cid=channel_details['id'], username=username)
    ret = h.fetchone_dict()

    if ret and ret['can_subscribe']:
        subscribe_sql(server_id, channel_details['id'])
        return 1

    raise rhnFault(71)


# This class is only a convenient encapsulation of a server's attributes:
# server_id, org_id, release, arch, user_id. Sometimes we only pass the
# server_id, and later down the road we have to message "no channel for
# release foo, arch bar", but we don't know the release and arch anymore
class LiteServer:
    _attributes = ['id', 'org_id', 'release', 'arch', 'suse_products']

    def __init__(self, **kwargs):
        # Initialize attributes from **kwargs (set to None if value is not
        # present)
        for attr in self._attributes:
            setattr(self, attr, kwargs.get(attr))

    def init_from_server(self, server):
        self.id = server.getid()
        self.org_id = server.server['org_id']
        self.release = server.server['release']
        self.suse_products = server.get_suse_products()
        self.arch = server.archname
        return self

    def get_suse_products(self):
        return self.suse_products

    def add_suse_products(self, suse_products):
        log_debug(1, suse_products)
        if isinstance(suse_products, dict):
            self.suse_products = suse_products['products']
        elif isinstance(suse_products, list):
            self.suse_products = suse_products

    def __repr__(self):
        dict = {}
        for attr in self._attributes:
            dict[attr] = getattr(self, attr)
        return "<%s instance at %s: attributes=%s>" % (
            self.__class__.__name__, id(self), dict)


def guess_suse_channels_for_server(server, org_id=None, user_id=None, raise_exceptions=0):
    log_debug(3, server)
    suse_products = server.get_suse_products()
    if len(suse_products) == 0:
        return None

    baseproduct = None
    for product in suse_products:
        if product['baseproduct'] == 'Y':
            baseproduct = product

    if not baseproduct:
        log_error("Missing baseproduct in ", server)
        return None

    all_products = []
    rootProductId = suseLib.findProduct(baseproduct)
    exts = suseLib.findAllExtensionProductsOf(rootProductId, rootProductId)
    while len(exts) > 0:
        all_products = all_products + exts
        exts_next = []
        for ext in exts:
            exts_next = exts_next + suseLib.findAllExtensionProductsOf(ext.pop("id", None), rootProductId)
        exts = exts_next

    basechannels = suseLib.channelForProduct(baseproduct, user_id=user_id, org_id=org_id)
    if not basechannels or basechannels == []:
        return None
    bc = basechannels[0]

    # search childchannels of the base product which should be added too
    childchannels = {}
    for product in suse_products + all_products:
        ccs = suseLib.channelForProduct(product, bc['id'], user_id=user_id, org_id=org_id)
        if ccs:
            for cc in ccs:
                childchannels[cc['id']] = cc

    channels = [bc]
    for chan in list(childchannels.values()):
        channels.append(chan)

    return __stringify(channels)

# If raise_exceptions is set, BaseChannelDeniedError, NoBaseChannelError are
# raised
def guess_channels_for_server(server, user_id=None, none_ok=0,
                              raise_exceptions=0):
    log_debug(3, server)
    if not isinstance(server, LiteServer):
        raise rhnException("Server object is not a LiteServer")
    if None in (server.org_id, server.release, server.arch):
        # need to obtain the release and/or arch and/or org_id
        h = rhnSQL.prepare("""
        select s.org_id, s.release, sa.label arch
        from rhnServer s, rhnServerArch sa
        where s.id = :server_id and s.server_arch_id = sa.id
        """)
        h.execute(server_id=server.id)
        ret = h.fetchone_dict()
        if not ret:
            log_error("Could not get the release/arch "
                      "for server %s" % server.id)
            raise rhnFault(8, "Could not find the release/arch "
                           "for server %s" % server.id)
        if server.org_id is None:
            server.org_id = ret["org_id"]
        if server.release is None:
            server.release = ret["release"]
        if server.arch is None:
            server.arch = ret["arch"]

    suse_channels = guess_suse_channels_for_server(server, server.org_id, user_id, raise_exceptions)
    if suse_channels:
        return suse_channels

    if raise_exceptions and not none_ok:
        # Let exceptions pass through
        return channels_for_release_arch(server.release, server.arch,
                                         server.org_id, user_id=user_id)

    try:
        return channels_for_release_arch(server.release, server.arch,
                                         server.org_id, user_id=user_id)
    except NoBaseChannelError:
        if none_ok:
            return []

        log_error("No available channels for (server, org)",
                  (server.id, server.org_id), server.release, server.arch)
        msg = _("Your account does not have access to any channels matching "
                "(release='%(release)s', arch='%(arch)s')%(www_activation)s")

        error_strings = {
            'release': server.release,
            'arch': server.arch,
            'www_activation': ''
        }

        raise_with_tb(rhnFault(19, msg % error_strings), sys.exc_info()[2])
    except BaseChannelDeniedError:
        if none_ok:
            return []

        raise raise_with_tb(rhnFault(71,
                                     _("Insufficient subscription permissions for release (%s, %s")
                                     % (server.release, server.arch)), sys.exc_info()[2])

# Subscribes the server to channels
# can raise BaseChannelDeniedError, NoBaseChannelError
# Only used for new server registrations


def subscribe_server_channels(server, user_id=None, none_ok=0):
    s = LiteServer().init_from_server(server)

    # bretm 02/19/2007 -- have to leave none_ok in here for now due to how
    # the code is setup for reg token crap; it'd be very nice to clean up that
    # path to eliminate any chance for a server to be registered and not have base
    # channels, excluding expiration of channel entitlements
    channels = guess_channels_for_server(s, user_id=user_id, none_ok=none_ok,
                                         raise_exceptions=1)
    rhnSQL.transaction('subscribe_server_channels')
    for c in channels:
        subscribe_sql(s.id, c["id"], 0)

    return channels

# small wrapper around a PL/SQL function


def unsubscribe_sql(server_id, channel_id, commit=1):
    log_debug(3, server_id, channel_id, commit)
    unsubscribe_channel = rhnSQL.Procedure("rhn_channel.unsubscribe_server")
    try:
        # don't run the EC yet
        unsubscribe_channel(server_id, channel_id, 0)
    except rhnSQL.SQLError:
        log_error("Channel unsubscribe from %s failed for %s" % (
            channel_id, server_id))
        return 0
    if commit:
        rhnSQL.commit()
    return 1

# unsubscribe a server from a channel


def unsubscribe_channel(server_id, channel, username, password):
    log_debug(3, server_id, channel, username)
    # If auth doesn't blow up we're fine
    __auth_user(server_id, username, password)

    # now get the id of the channel
    h = rhnSQL.prepare("""
    select id, parent_channel from rhnChannel where label = :channel
    """)
    h.execute(channel=channel)
    ret = h.fetchone_dict()
    if not ret:
        log_error("Asked to unsubscribe server %s from non-existent channel %s" % (
            server_id, channel))
        raise rhnFault(40, "The specified channel '%s' does not exist." % channel)
    if not ret["parent_channel"]:
        log_error("Cannot unsubscribe %s from base channel %s" % (
            server_id, channel))
        raise rhnFault(72, "You can not unsubscribe %s from base channel %s." % (
            server_id, channel))

    # check specific channel subscription permissions
    channel_id = ret['id']
    h = rhnSQL.prepare(_query_can_subscribe)
    h.execute(cid=channel_id, username=username)
    ret = h.fetchone_dict()

    if ret and ret['can_subscribe']:
        return unsubscribe_sql(server_id, channel_id)

    raise rhnFault(71)

# unsubscribe from all channels


def unsubscribe_all_channels(server_id):
    log_debug(3, server_id)
    # We need to unsubscribe the children channels before the base ones.
    rhnSQL.transaction("unsub_all_channels")
    h = rhnSQL.prepare("""
    select
        sc.channel_id id
    from
        rhnChannel c,
        rhnServerChannel sc
    where
        sc.server_id = :server_id
    and sc.channel_id = c.id
    order by c.parent_channel nulls last
    """)
    h.execute(server_id=str(server_id))
    while 1:
        c = h.fetchone_dict()
        if not c:
            break
        ret = unsubscribe_sql(server_id, c["id"], 0)
        if not ret:
            rhnSQL.rollback("unsub_all_channels")
            raise rhnFault(36, "Could not unsubscribe server %s "
                           "from existing channels" % (server_id,))
    # finished unsubscribing
    return 1

# Unsubscribe the server from the channels in the list
# A channel is a hash containing at least the keys:
# [id, label, parent_channel]


def unsubscribe_channels(server_id, channels):
    log_debug(4, server_id, channels)
    if not channels:
        # Nothing to do
        return 1

    # We need to unsubscribe the children channels before the base ones.
    rhnSQL.transaction("unsub_channels")

    base_channels = [x for x in channels if not x['parent_channel']]
    child_channels = [x for x in channels if x['parent_channel']]

    for channel in child_channels + base_channels:
        ret = unsubscribe_sql(server_id, channel["id"], 0)
        if not ret:
            rhnSQL.rollback("unsub_channels")
            raise rhnFault(36, "Could not unsubscribe server %s "
                           "from channel %s" % (server_id, channel["label"]))

    # finished unsubscribing
    return 1

# Subscribe the server to the channels in the list
# A channel is a hash containing at least the keys:
# [id, label, parent_channel]


def subscribe_channels(server_id, channels):
    log_debug(4, server_id, channels)
    if not channels:
        # Nothing to do
        return 1

    # We need to subscribe the base channel before the child ones.
    base_channels = [x for x in channels if not x['parent_channel']]
    child_channels = [x for x in channels if x['parent_channel']]

    for channel in base_channels + child_channels:
        subscribe_sql(server_id, channel["id"], 0)

    # finished subscribing
    return 1


# check if a server is subscribed to a channel
def is_subscribed(server_id, channel):
    log_debug(3, server_id, channel)
    h = rhnSQL.prepare("""
    select 1 subscribed
    from rhnServerChannel sc, rhnChannel c
    where
        sc.channel_id = c.id
    and c.label = :channel
    and sc.server_id = :server_id
    """)
    h.execute(server_id=str(server_id), channel=str(channel))
    ret = h.fetchone_dict()
    if not ret:
        # System not subscribed to channel
        return 0
    return 1

# Returns 0, "", "" if system does not need any message, or
# (error_code, message_title, message) otherwise


def system_reg_message(server):
    server_id = server.server['id']
    # Is this system subscribed to a channel?
    h = rhnSQL.prepare("""
        select sc.channel_id
          from rhnServerChannel sc
         where sc.server_id = :server_id
    """)
    h.execute(server_id=server_id)
    ret = h.fetchone_dict()
    if not ret:
        # System not subscribed to any channel
        #
        return (-1, s_invalid_channel_title,
                s_invalid_channel_message %
                (server.server["release"], server.archname))

    # System does have a base channel; check entitlements
    from rhnServer import server_lib  # having this on top, cause TB due circular imports
    entitlements = server_lib.check_entitlement(server_id)
    if not entitlements:
        # No entitlement
        # We don't have an autoentitle preference for now, so display just one
        # message
        templates = rhnFlags.get('templateOverrides')
        if templates and 'hostname' in templates:
            hostname = templates['hostname']
        else:
            # Default to www
            hostname = "rhn.redhat.com"
        params = {
            'entitlement_url': "https://%s"
            "/rhn/systems/details/Edit.do?sid=%s" %
            (hostname, server_id)
        }
        return -1, no_entitlement_title, no_entitlement_message % params
    return 0, "", ""


def subscribe_to_tools_channel(server_id):
    """
        Subscribes server_id to the RHN Tools channel associated with its base channel, if one exists.
    """
    base_channel_dict = get_base_channel(server_id, none_ok=1)

    if base_channel_dict is None:
        raise NoBaseChannelError("Server %s has no base channel." %
                                 str(server_id))

    lookup_child_channels = rhnSQL.Statement("""
        select  id, label, parent_channel
          from  rhnChannel
         where  parent_channel = :id
    """)

    child_channel_data = rhnSQL.prepare(lookup_child_channels)
    child_channel_data.execute(id=base_channel_dict['id'])
    child_channels = child_channel_data.fetchall_dict()

    if child_channels is None:
        raise NoChildChannels("Base channel id %s has no child channels associated with it." %
                              base_channel_dict['id'])

    tools_channel = None
    for channel in child_channels:
        if 'label' in channel:
            if 'rhn-tools' in channel['label'] or 'manager-tools' in channel['label']:
                tools_channel = channel

    if tools_channel is None:
        raise NoToolsChannel("Base channel id %s does not have a Tools channel as a child channel." % \
                             base_channel_dict['id'])
    else:
        if 'id' not in tools_channel:
            raise InvalidChannel("Tools channel has no id.")
        if 'label' not in tools_channel:
            raise InvalidChannel("Tools channel has no label.")
        if 'parent_channel' not in tools_channel:
            raise InvalidChannel("Tools channel has no parent_channel.")

        subscribe_channels(server_id, [tools_channel])

# Various messages that can be reused
#
# bretm 02/07/2007 -- when we have better old-client documentation, probably
# will be safe to get rid of all this crap

s_invalid_channel_title = _("System Registered but Inactive")
s_invalid_channel_message = _("""
Invalid Architecture and OS release combination (%s, %s).
Your system has been registered, but will not receive updates
because it could not be subscribed to a base channel.
Please contact your organization administrator for assistance.
""")

no_autoentitlement_message = _("""
  This system has been successfully registered, but is not yet entitled
  to service.  To entitle this system to service, login to the web site at:

  %(entitlement_url)s
""")

no_entitlement_title = _("System Registered but Inactive")
no_entitlement_message = _("""
  This system has been successfully registered, but no service entitlements
  were available.  To entitle this system to service, login to the web site at:

  %(entitlement_url)s
""")
 070701000001A6000081B40000000000000000000000015FBBE8EE000024EE000000000000000000000000000000000000002D00000000spacewalk-backend/server/rhnDatabaseCache.py  #
# Copyright (c) 2008--2010 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
# 
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation. 
#
#

import math
import gzip
import string
try:
    # python 3
    import pickle as cPickle
    import io as cStringIO
except ImportError:
    # python 2
    import cPickle
    import cStringIO

from spacewalk.common import rhnCache
from spacewalk.common.rhnLog import log_debug, log_error
from uyuni.common.rhnLib import timestamp

from spacewalk.server import rhnSQL

# XXX Although it would have been much easier to do it all in python, we want
# this code to commit as soon as possible. Also, we cannot just commit
# ourselves, there may be data outside of this module that wasn't committed
# yet, and that may have to be rolled back at a later point. The only solution
# is using stored procedures that are marked as doing autonomous transactions.
# Such procedures don't see the changes in the same transaction, and commiting
# doesn't commit the outer transaction.

### The following functions expose this module as a dictionary

def has_key(name, modified = None):
    # We have to rely on the same entity generating the time and comparing it;
    # we are generating UNIX timestamps on the app side, and we store them in
    # the database as DATE fields. The trick is to make both conversions in
    # the same way.
    # One second differences seem to be returned as zero, presumably because
    # 1 means one day for Oracle; 1/86400 is silently converted by DCOracle to
    # 0, which is bad; so scale the response to number_of_seconds instead of
    # days.

    # Even though we set now as time.time(), we don't actually use it; the
    # database will set its own time if modified is not specified; in this
    # case we only need a placeholder value so that the query can correctly
    # compute the time delta
    h = _fetch_cursor(key=name, modified=modified)

    row = h.fetchone_dict()
    if not row:
        # Key not found
        return 0
    
    # has_key behaves as stat(): the access time doesn't change just by
    # poking around to see if the key is there
    
    if modified and row['delta'] != 0:
        # Different version
        return 0
    # Same copy
    return 1
    
def get(name, modified = None, raw = None, compressed = None):
    # Check to see if the entry is in the database, with the right version
    h = _fetch_cursor(key=name, modified=modified)

    row = h.fetchone_dict()

    if not row:
        # Key not found
        return None

    if modified and row['delta'] != 0:
        # Different version
        log_debug(4, "database cache: different version")
        return None

    if modified is None:
        # The caller doesn't care about the modified time, but we do, since we
        # want to fetch the same version from the disk cache
        modified = row['modified']

    if rhnCache.has_key(name, modified):
        # We have the value
        log_debug(4, "Filesystem cache HIT")
        return rhnCache.get(name, modified=modified, raw=raw)

    log_debug(4, "Filesystem cache MISS")

    # The disk cache doesn't have this key at all, or it's a modified value
    # Fetch the value from the database

    v = row['value']
    # Update the accessed field
    rhnSQL.Procedure("rhn_cache_update_accessed")(name)

    if compressed:
        io = cStringIO.StringIO()

        io.write(rhnSQL.read_lob(v))
        io.seek(0, 0)

        # XXX For about 40M of compressed data sometimes we get:
        # zlib.error: Error -3 while decompressing: incomplete dynamic bit lengths tree
        v = gzip.GzipFile(None, "r", 0, io)

    try:
        data = v.read()
    except (ValueError, IOError, gzip.zlib.error) as e:
        # XXX poking at gzip.zlib may not be that well-advised
        log_error("rhnDatabaseCache: gzip error for key %s: %s" % (
            name, e))
        # Ignore this entry in the database cache, it has invalid data
        return None

    # We store the data in the database cache, in raw format
    rhnCache.set(name, data, modified=modified, raw=1)
    
    # Unpickle the data, unless raw access was requested
    if not raw:
        return cPickle.loads(data)

    return data


def delete(name):
    # Uses the stored procedure. Quite simple
    rhnSQL.Procedure("rhn_cache_delete")(name)
    # Delete it from the disk cache too, just in case
    rhnCache.delete(name)
    
# We only set the database cache value
# The local disk one will be cached when get() is called for the first time
def set(name, value, modified = None, raw = None, compressed = None):
    if modified is not None:
        modified = timestamp(modified)
    if raw:
        val = value
    else:
        val = cPickle.dumps(value, 1)

    if compressed:
        # Since most of the data is kept in memory anyway, don't bother to
        # write it to a temp file at this point - it's probably much smaller
        # anyway
        io = cStringIO.StringIO()

        f = gzip.GzipFile(None, "w", 5, io)
        f.write(val)
        f.close()

        val = io.getvalue()
        io.close()

    data_length = len(val)
    chunk_size = 32512
    chunks = int(math.ceil(float(data_length) / chunk_size))
    #if chunks > 256:
    #    raise Exception, "Data too big"

    plsql_template = r"""
DECLARE
    PRAGMA AUTONOMOUS_TRANSACTION;
    blob_val BLOB;
    modified_date DATE;
    now DATE := sysdate;
    our_key_id number;
%s
BEGIN
    our_key_id := lookup_cache_key(:key);
    BEGIN
        SELECT value INTO blob_val
          FROM rhnCache
         WHERE key_id = our_key_id
           FOR UPDATE OF value;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            -- The entry is not here yet, let's create it
            INSERT INTO rhnCache (key_id, value, created, modified)
            VALUES (our_key_id, EMPTY_BLOB(), sysdate, sysdate)
            RETURNING value INTO blob_val;
    END;
    -- If we want to write less data than currently available, trim the blob
    IF :data_len < DBMS_LOB.getlength(blob_val) THEN
        DBMS_LOB.TRIM(blob_val, :data_len);
    END IF;
    
%s

    -- Now update last_modified and last_accessed
    if :modified IS NULL THEN
        modified_date := now;
    ELSE
        modified_date := TO_DATE('1970-01-01 00:00:00', 
            'YYYY-MM-DD HH24:MI:SS') + :modified / 86400;
    END IF;
    UPDATE rhnCache SET modified = modified_date WHERE key_id = our_key_id;
    -- Update accessed too
    UPDATE rhnCacheTimestamps
       SET accessed = now
     WHERE key_id = our_key_id;
    if SQL%%ROWCOUNT = 0 THEN
        -- No entry in rhnCacheTimestamps; insert it
        INSERT INTO rhnCacheTimestamps (key_id, accessed)
        VALUES (our_key_id, now);
    END IF;
    COMMIT;
END;
"""

    decl_template = "    arg_%s LONG RAW := :val_%s;"
    dbms_lob_template = "   DBMS_LOB.WRITE(blob_val, %s, %s, arg_%s);"

    indices = list(range(chunks))
    start_pos = list(map(lambda x, cs=chunk_size: x * cs + 1, indices))
    sizes = [ chunk_size ] * (chunks - 1) + \
        [ 'length(rawtohex(arg_%s)) / 2' % (chunks - 1) ]

    query = plsql_template % (
        string.join(
            list(map(lambda x, y, t=decl_template: t % (x, y),
                indices, indices)),
            "\n"
        ),
        string.join(
            list(map(lambda x, y, z, t=dbms_lob_template: t % (x, y, z),
                sizes, start_pos, indices)),
            "\n"
        ),
    )
    params = {
        'modified'  : modified,
        'data_len'  : data_length,
        'key'       : name,
    }
    for i in indices:
        start = i * chunk_size
        end = (i + 1) * chunk_size
        params['val_%s' % i] = rhnSQL.types.LONG_BINARY(val[start:end])

    h = rhnSQL.prepare(query)
    tries = 3
    while tries:
        tries = tries - 1
        try:
            h.execute(*(), **params)
        except rhnSQL.SQLSchemaError as e:
            if e.errno == 1:
                # Unique constraint violated - probably someone else was
                # doing the same thing at the same time
                # Try again
                continue
        # No errors - we're done
        # We're done
        break
    else:
        # Kept raising Unique constraint violated - something else may be
        # wrong; re-raise the last exception
        raise
    
def _fetch_cursor(key=None, modified=None):
    if modified is not None:
        modified = timestamp(modified)
           
    # Computing the number of seconds since Jan 1 1970
    
    h = rhnSQL.prepare("""
    select c.key_id, c.value, nvl(
             (c.modified - 
                TO_DATE('1970-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) *
                86400 - :modified, 
             0) delta,
           (c.modified - TO_DATE('1970-01-01 00:00:00', 
             'YYYY-MM-DD HH24:MI:SS')) * 86400 modified
      from rhnCache c
     where c.key_id = LOOKUP_CACHE_KEY(:key)
    """)
    h.execute(key=key, modified=modified)
    return h

  070701000001A7000081B40000000000000000000000015FBBE8EE00004D90000000000000000000000000000000000000002A00000000spacewalk-backend/server/rhnDependency.py #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.common.rhnException import rhnFault
from . import rhnSQL
from . import rhnLib
import rpm

# QUERY PACKAGES
# sql query for solving a dep as a package
__packages_with_arch_and_id_sql = """
select distinct
    p.id id,
    pn.name,
    (pe.evr).version as version,
    (pe.evr).release as release,
    (pe.evr).epoch as epoch,
    pa.label as arch,
    1 as preference
from
    rhnPackageEvr pe,
    rhnChannelPackage cp,
    rhnPackage p,
    rhnServerChannel sc,
    rhnPackageName pn,
    rhnPackageArch pa
where 1=1
and pn.name = :dep
and sc.server_id = :server_id
and p.name_id = pn.id
and cp.channel_id = sc.channel_id
and p.id = cp.package_id
and p.evr_id = pe.id
and p.package_arch_id = pa.id
and pe.evr = (
    select MAX(pe1.evr)
    from
        rhnPackageEVR pe1,
        rhnChannelPackage cp1,
        rhnPackage p1,
        rhnServerChannel sc1
    where
        sc1.server_id = :server_id
    and p1.name_id = pn.id
    and sc1.channel_id = cp1.channel_id
    and cp1.package_id = p1.id
    and p1.evr_id = pe1.id
    )
"""
__packages_sql = """
select distinct
    pn.name,
    (pe.evr).version as version,
    (pe.evr).release as release,
    (pe.evr).epoch as epoch,
    pa.label as arch,
    1 as preference
from
    rhnPackageEvr pe,
    rhnChannelPackage cp,
    rhnPackage p,
    rhnServerChannel sc,
    rhnPackageName pn,
    rhnPackageArch pa
where 1=1
and pn.name = :dep
and sc.server_id = :server_id
and p.name_id = pn.id
and cp.channel_id = sc.channel_id
and p.id = cp.package_id
and p.evr_id = pe.id
and p.package_arch_id = pa.id
and pe.evr = (
    select MAX(pe1.evr)
    from
        rhnPackageEVR pe1,
        rhnChannelPackage cp1,
        rhnPackage p1,
        rhnServerChannel sc1
    where
        sc1.server_id = :server_id
    and p1.name_id = pn.id
    and sc1.channel_id = cp1.channel_id
    and cp1.package_id = p1.id
    and p1.evr_id = pe1.id
    )
"""

__packages_all_sql = """
select distinct
    pn.name,
    (pe.evr).version as version,
    (pe.evr).release as release,
    (pe.evr).epoch as epoch,
    pa.label as arch,
    1 as preference
from
    rhnPackageEvr pe,
    rhnChannelPackage cp,
    rhnPackage p,
    rhnServerChannel sc,
    rhnPackageName pn,
    rhnPackageArch pa
where 1=1
and pn.name = :dep
and sc.server_id = :server_id
and p.name_id = pn.id
and cp.channel_id = sc.channel_id
and p.id = cp.package_id
and p.evr_id = pe.id
and p.package_arch_id = pa.id
"""
# QUERY PROVIDES
# sql query for solving a dep as a provide
__provides_sql = """
select  distinct
    pn.name,
    (pe.evr).version as version,
    (pe.evr).release as release,
    (pe.evr).epoch as epoch,
    pa.label as arch,
    2 as preference
from
    rhnServerChannel sc,
    rhnChannelPackage cp,
    rhnPackageProvides pr,
    rhnPackage p,
    rhnPackageCapability cap,
    rhnPackageName pn,
    rhnPackageEVR pe,
    rhnPackageArch pa
where
    sc.server_id = :server_id
and sc.channel_id = cp.channel_id
and cp.package_id = p.id
and cp.package_id = pr.package_id
and pr.package_id = p.id
and pr.capability_id = cap.id
and cap.name = :dep
and p.name_id = pn.id
and p.evr_id = pe.id
and p.package_arch_id = pa.id
-- and this package is the latest one from all the channels
-- this server is subscribed to.
and pe.evr = (
    select MAX(pe1.evr)
    from
        rhnPackage p1,
        rhnPackageEVR pe1,
        rhnServerChannel sc1,
        rhnChannelPackage cp1
    where
        sc1.server_id = :server_id
    and sc1.channel_id = cp1.channel_id
    and cp1.package_id = p1.id
    and p1.name_id = pn.id
    and p1.evr_id = pe1.id
    )
"""

__provides_all_sql = """
select  distinct
    pn.name,
    (pe.evr).version as version,
    (pe.evr).release as release,
    (pe.evr).epoch as epoch,
    pa.label as arch,
    2 as preference
from
    rhnServerChannel sc,
    rhnChannelPackage cp,
    rhnPackageProvides pr,
    rhnPackage p,
    rhnPackageCapability cap,
    rhnPackageName pn,
    rhnPackageEVR pe,
    rhnPackageArch pa
where
    sc.server_id = :server_id
and sc.channel_id = cp.channel_id
and cp.package_id = p.id
and cp.package_id = pr.package_id
and pr.package_id = p.id
and pr.capability_id = cap.id
and cap.name = :dep
and p.name_id = pn.id
and p.evr_id = pe.id
and p.package_arch_id = pa.id
"""
# QUERY FILES
# sql query for solving a dependency as a file provide
__files_sql = """
select distinct
    pn.name,
    (pe.evr).version as version,
    (pe.evr).release as release,
    (pe.evr).epoch as epoch,
    pa.label as arch,
    3 as preference
from
    rhnServerChannel sc,
    rhnChannelPackage cp,
    rhnPackageFile f,
    rhnPackage p,
    rhnPackageCapability cap,
    rhnPackageName pn,
    rhnPackageEVR pe,
    rhnPackageArch pa
where
    sc.server_id = :server_id
and sc.channel_id = cp.channel_id
and cp.package_id = p.id
and cp.package_id = f.package_id
and f.capability_id = cap.id
and cap.name = :dep
and p.name_id = pn.id
and p.evr_id = pe.id
and p.package_arch_id = pa.id
-- and this package is the latest one from all the channels
-- this server is subscribed to.
and pe.evr = (
    select MAX(pe1.evr)
    from
        rhnPackage p1,
        rhnPackageEVR pe1,
        rhnServerChannel sc1,
        rhnChannelPackage cp1
    where
        sc1.server_id = :server_id
    and sc1.channel_id = cp1.channel_id
    and cp1.package_id = p1.id
    and p1.name_id = pn.id
    and p1.evr_id = pe1.id
    )
"""


__files_all_sql = """
select distinct
    pn.name,
    (pe.evr).version as version,
    (pe.evr).release as release,
    (pe.evr).epoch as epoch,
    pa.label as arch,
    3 as preference
from
    rhnServerChannel sc,
    rhnChannelPackage cp,
    rhnPackageFile f,
    rhnPackage p,
    rhnPackageCapability cap,
    rhnPackageName pn,
    rhnPackageEVR pe,
    rhnPackageArch pa
where
    sc.server_id = :server_id
and sc.channel_id = cp.channel_id
and cp.package_id = p.id
and cp.package_id = f.package_id
and f.capability_id = cap.id
and cap.name = :dep
and p.name_id = pn.id
and p.evr_id = pe.id
and p.package_arch_id = pa.id
"""


class SolveDependenciesError(Exception):

    def __init__(self, deps=None, packages=None, *args, **kwargs):
        Exception.__init__(self, *args, **kwargs)
        self.deps = deps
        self.packages = packages


def __single_query_with_arch_and_id(server_id, deps, query):
    """ Run one of the queries and return the results along with the arch. """
    ret = {}
    h = rhnSQL.prepare(query)
    for dep in deps:
        h.execute(server_id=server_id, dep=dep)
        data = h.fetchall() or []
        ret[dep] = [a[:6] for a in data]
    return ret

#
# Interfaces
#

# simple one type queries


def find_package_with_arch(server_id, deps):
    log_debug(4, server_id, deps)
    return __single_query_with_arch_and_id(server_id, deps, __packages_with_arch_and_id_sql)


def solve_dependencies_with_limits(server_id, deps, version, all=0, limit_operator=None, limit=None):
    """ This version of solve_dependencies allows the caller to get all of the packages that solve a dependency and limit
        the packages that are returned to those that match the criteria defined by limit_operator and limit. This version
        of the function also returns the architecture label of the package[s] that get returned.

        limit_operator can be any of: '<', '<=', '==', '>=', or '>'.
        limit is a a string of the format [epoch:]name-version-release
        deps is a list of filenames that the packages that are returned must provide.
        version is the version of the client that is calling the function.

        Indexes for the tuple
        entry_index = 0
        preference_index = 1

        Indexes for the list of package fields.
        name_index = 0
        version_index = 1
        release_index = 2
        epoch_index = 3
    """
    # Containers used while the packages get categorized, sorted, and filtered.
    packages_all = {}
    package_list = []

    # List of fields in a package. Corresponds to the keys for the dictionary that holds the package information.
    nvre = ['name', 'version', 'release', 'epoch', 'arch']

    # Make sure there are no duplicate dependencies.
    deplist = set(deps)

    statement = "%s UNION ALL %s UNION ALL %s" % (__packages_all_sql, __provides_all_sql, __files_all_sql)
    h = rhnSQL.prepare(statement)

    # prepare return value
    packages = {}

    for dep in deplist:
        dict = {}

        # Retrieve the package information from the database.
        h.execute(server_id=server_id, dep=dep)

        # Get a list of dictionaries containing row data.
        rs = h.fetchall_dict() or []  # rs = [{},{},... ]

        # Each package gets a list that may contain multiple versions of a package
        for record in rs:
            if record['name'] in packages_all:
                packages_all[record['name']].append(record)
            else:
                packages_all[record['name']] = [record]

        # sort all the package lists so the most recent version is first
        for pl in list(packages_all.keys()):

            packages_all[pl].sort(cmp_evr)
            package_list = package_list + packages_all[pl]

        package_list.reverse()
        # Use the limit* parameters to filter out packages you don't want.
        if limit_operator is not None and limit is not None:
            keep_list = []

            try:
                limit = rhnLib.make_evr(limit)
            except:
                raise

            for package in package_list:
                try:
                    keep = test_evr(package, limit_operator,  limit)
                except:
                    raise

                if keep:
                    keep_list.append(package)

            package_list = keep_list

        list_of_tuples = []
        for p in package_list:
            if p['epoch'] is None:
                p['epoch'] = ""

            entry = []

            list(map(lambda f, e=entry, p=p: e.append(p[f]), nvre))

            # Added for readability
            name_key = entry[0]

            if all == 0:
                # NOTE: Remember that the values in dict are tuples that look like (entry, preference).
                # NOTE, Part Deux: the '<=' was a '<' originally. I changed it because if two packages
                # with the same preference but different versions came through, the second package was being used.
                # The changes I made above make it so that at this point the packages are sorted from highest nvre
                # to lowest nvre. Selecting the second package was causing the earlier package to be
                # returned, which is bad.
                if name_key in dict and dict[name_key][1] <= p['preference']:
                    # Already have it with a lower preference
                    continue
                # The first time we see this package.
                dict[name_key] = (entry, p['preference'])
            else:
                name_key = entry[0]
                newtuple = (entry, p['preference'])
                list_of_tuples.append(newtuple)

        if all == 0:
            packages[dep] = _avoid_compat_packages(dict)
        else:
            # filter out compats
            if len(list_of_tuples) > 1:
                filterstring = "compat-"
                len_filter = len(filterstring)
                tup_keep = []
                for tup in list_of_tuples:
                    if tup[0][0][:len_filter] != filterstring:
                        tup_keep.append(tup)
                list_of_tuples = tup_keep

            list_of_tuples.sort(lambda a, b: cmp(a[1], b[1]))
            packages[dep] = [x[0] for x in list_of_tuples]

    # v2 clients are done
    if version > 1:
        return packages
    else:
        return _v2packages_to_v1list(packages, deplist, all)


def _v2packages_to_v1list(packages, deplist, all=0):
    # v1 clients expect a list as a result
    result = []
    # Return the results in order (not that anyone would care)
    for dep in deplist:
        if not packages[dep]:
            # Unresolved dependency; skip it
            continue
        # consider only the first one for each dep
        r = packages[dep][0]
        # Avoid sending the same result back multiple times
        if all == 0:
            if r not in result:
                result.append(r)
        else:
            result.append(r)
    return result


def solve_dependencies_arch(server_id, deps, version):
    """ Does the same thing as solve_dependencies, but also returns the architecture label with the package info.
        E.g.
        OUT:
           Dictionary with key values being the filnames in deps and the values being a list of lists of package info.
           Example :=  {'filename1'    :   [['name', 'version', 'release', 'epoch', 'architecture'],
                                            ['name2', 'version2', 'release2', 'epoch2', 'architecture2']]}
    """
    # list of the keys to the values in each row of the recordset.
    nvre = ['name', 'version', 'release', 'epoch', 'arch']
    return solve_dependencies(server_id, deps, version, nvre)


def solve_dependencies(server_id, deps, version, nvre=None):
    """ The unchanged version of solve_dependencies.
        IN:
           server_id := id info of the server
           deps := list of filenames that are needed by the caller
           version := version of the client

        OUT:
           Dictionary with key values being the filnames in deps and the values being a list of lists of package info.
           Example :=  {'filename1'    :   [['name', 'version', 'release', 'epoch'],
                                            ['name2', 'version2', 'release2', 'epoch2']]}
    """
    if not nvre:
        # list of the keys to the values in each row of the recordset.
        nvre = ['name', 'version', 'release', 'epoch']

    # first, uniquify deps
    deplist = set(deps)

    # SQL statement.  It is a union of 3 statements:
    #  - Lookup by package name
    #  - Lookup by provides
    #  - Lookup by file name

    statement = "%s UNION ALL %s UNION ALL %s" % (
        __packages_sql, __provides_sql, __files_sql)
    h = rhnSQL.prepare(statement)

    # prepare return value
    packages = {}
    # Iterate through the dependency problems
    for dep in deplist:
        dict = {}
        h.execute(server_id=server_id, dep=dep)
        rs = h.fetchall_dict() or []
        if not rs:  # test shortcut
            log_error("Unable to solve dependency", server_id, dep)
            packages[dep] = []
            continue

        for p in rs:
            if p['epoch'] is None:
                p['epoch'] = ""
            entry = []
            list(map(lambda f, e=entry, p=p: e.append(p[f]), nvre))

            name_key = entry[0]
            if name_key in dict and dict[name_key][1] < p['preference']:
                # Already have it with a lower preference
                continue
            # The first time we see this package.
            dict[name_key] = (entry, p['preference'])

        packages[dep] = _avoid_compat_packages(dict)

    # v2 clients are done
    if version > 1:
        return packages
    else:
        return _v2packages_to_v1list(packages, deplist)


def _avoid_compat_packages(dict):
    """ attempt to avoid giving out the compat-* packages
        if there are other candidates
    """
    if len(dict) > 1:
        matches = list(dict.keys())
        # check we have at least one non- "compat-*" package name
        compats = [a for a in matches if a[:7] == "compat-"]
        if len(compats) > 0 and len(compats) < len(matches):  # compats and other things
            for p in compats:  # delete all references to a compat package for this dependency
                del dict[p]
        # otherwise there's nothing much we can do (no compats or only compats)
    # and now return these final results ordered by preferece
    l = list(dict.values())
    l.sort(lambda a, b: cmp(a[1], b[1]))
    return [x[0] for x in l]


def cmp_evr(pkg1, pkg2):
    """ Intended to be passed to a list object's sort().
        In: {'epoch': 'value', 'version':'value', 'release':'value'}
    """
    pkg1_epoch = pkg1['epoch']
    pkg1_version = pkg1['version']
    pkg1_release = pkg1['release']

    pkg2_epoch = pkg2['epoch']
    pkg2_version = pkg2['version']
    pkg2_release = pkg2['release']

    if pkg1_epoch is not None:
        pkg1_epoch = str(pkg1_epoch)
    elif pkg1_epoch == '':
        pkg1_epoch = None

    if pkg2_epoch is not None:
        pkg2_epoch = str(pkg2_epoch)
    elif pkg1_epoch == '':
        pkg1_epoch = None

    return rpm.labelCompare((pkg1_epoch, pkg1_version, pkg1_release),
                            (pkg2_epoch, pkg2_version, pkg2_release))


def test_evr(evr, operator, limit):
    """ Check to see if evr is within the limit.
        IN: evr = { 'epoch' : value, 'version':value, 'release':value }
            operator can be any of: '<', '<=', '==', '>=', '>'
            limit = { 'epoch' : value, 'version':value, 'release':value }
        OUT:
           1 or 0
    """
    good_operators = ['<', '<=', '==', '>=', '>']

    if not operator in good_operators:
        raise rhnFault(err_code=21,
                       err_text="Bad operator passed into test_evr.")

    evr_epoch = evr['epoch']
    evr_version = evr['version']
    evr_release = evr['release']

    limit_epoch = limit['epoch']
    limit_version = limit['version']
    limit_release = limit['release']

    if evr_epoch is not None:
        evr_epoch = str(evr_epoch)
    elif evr_epoch == '':
        evr_epoch = None

    if limit_epoch is not None:
        limit_epoch = str(limit_epoch)
    elif limit_epoch == '':
        limit_epoch = None

    ret = rpm.labelCompare((evr_epoch, evr_version, evr_release),
                           (limit_epoch, limit_version, limit_release))

    return check_against_operator(ret, operator)


def check_against_operator(ret, operator):
    if ret == -1:
        if operator in (">", ">=", "=="):
            return 0
        if operator in ("<", "<="):
            return 1
    if ret == 0:
        if operator in (">", "<"):
            return 0
        if operator in (">=", "<=", "=="):
            return 1
    if ret == 1:
        if operator in ("<", "<=", "=="):
            return 0
        if operator in (">", ">="):
            return 1
    return 0

# DEVEL NOTES
# This faster query for solvind dependencies that refer to package
# names causes Oracle 9i (all versions) to segfault badly. We
# therefore use a slower query that has the drawback of effectively
# double selecting the same data and then filtering it to obtain the
# correct response.
# __packages_sql = """
# select
# q.name,
# q.evr.version version,
# q.evr.release release,
# q.evr.epoch epoch,
# 1 preference
# from
# ( select
# pn.name name,
# max(pe.evr) evr
# from
# rhnServerChannel sc,
# rhnChannelPackage cp,
# rhnPackage p,
# rhnPackageName pn,
# rhnPackageEVR pe
# where
# sc.server_id = :server_id
# and sc.channel_id = cp.channel_id
# and cp.package_id = p.id
# and p.name_id = pn.id
# and pn.name = :dep
# and p.evr_id = pe.id
# group by pn.name
# ) q
# """
070701000001A8000081B40000000000000000000000015FBBE8EE00000C91000000000000000000000000000000000000002700000000spacewalk-backend/server/rhnHandler.py    #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.common.rhnConfig import CFG
from spacewalk.common.rhnException import rhnFault
from spacewalk.common.rhnTranslate import _
from spacewalk.common.RPC_Base import RPC_Base

from spacewalk.server import rhnServer

# extend the RPC_Base base class


class rhnHandler(RPC_Base):

    def __init__(self):
        RPC_Base.__init__(self)
        # extra class members we handle
        self.server = None
        self.server_id = None

        # XXX Some subclasses set this as a string, others as an rhnUser
        self.user = None

        # defaults that can be easily overridden through assignement of self.*
        # do we load the user infomation (seldomly needed)
        self.load_user = 0
        # do we check for entitlement of the server
        self.check_entitlement = 1
        # do we attempt throttling
        self.throttle = CFG.THROTTLE
        # attempt quality of service checks
        self.set_qos = CFG.QOS
        # do we update the checking counters
        self.update_checkin = 1

    # Authenticate a system based on the certificate. There are a lot
    # of modifiers that can be set before this function is called (see
    # the __init__ function for this class).

    def auth_system(self, system_id):
        log_debug(3)

        server = rhnServer.get(system_id, load_user=self.load_user)
        if not server:
            # Invalid server certificate.
            raise rhnFault(9, _(
                "Please run rhn_register as root on this client"))
        self.server_id = server.getid()
        self.server = server
        # update the latest checkin time
        if self.update_checkin:
            server.checkin()

        # is the server entitled?
        if self.check_entitlement:
            entitlements = server.check_entitlement()
            if not entitlements:  # we require entitlement for this functionality
                log_error("Server Not Entitled", self.server_id)
                raise rhnFault(31, _(
                    'Service not enabled for system profile: "%s"')
                    % server.server["name"])

        # Kind of poking where we shouldn't, but what the hell
        if self.load_user and self.user is not None:
            self.user = server.user.username
        else:
            self.user = None

        if self.user is None:
            self.user = ""
        # Throttle users if necessary
        if self.throttle:
            server.throttle()
        # Set QOS
        if self.set_qos:
            server.set_qos()
        return server
   070701000001A9000081B40000000000000000000000015FBBE8EE00000D2D000000000000000000000000000000000000002600000000spacewalk-backend/server/rhnImport.py #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

import os
import sys

from spacewalk.common.rhnLog import log_debug, log_error


class Loader:
    # Class that saves the state of imported objects
    _imports = {}

    def load(self, dir, interface_signature='rpcClasses'):
        # The key we use for caching
        root_dir = "/usr/share/rhn"
        key = (dir, root_dir, interface_signature)

        if key in self._imports:
            return self._imports[key]

        dirname = "%s/%s" % (root_dir, dir)

        # We need to import things
        if root_dir is not None and root_dir not in sys.path:
            sys.path.append(root_dir)

        fromcomps = dir.split('/')
        _imports = {}

        # Keep track of the modules we've already tried to load, to avoid loading
        # them twice
        modules = []
        # Load each module (that is not internal - i.e. doesn't start with _)
        for module in os.listdir(dirname):
            log_debug(5, "Attempting to load module %s from %s %s" % (
                module, '.'.join(fromcomps), dirname))
            if module[0] in ('_', '.'):
                # We consider it 'internal' and we don't load it
                log_debug(6, "Ignoring module %s" % module)
                continue

            # Importing files or directories with . in them is broken, so keep
            # only the first part
            module = module.split('.', 1)[0]
            if module in modules:
                log_debug(6, "Already tried to load Module %s" % (module, ))
                continue

            # Add it to the list, so we don't load it again
            modules.append(module)

            # We use fromclause to build the full module path
            fromclause = '.'.join(fromcomps + [module])

            # Try to import the module
            try:
                m = __import__(fromclause, {}, {}, [module])
            except ImportError:
                e = sys.exc_info()[1]
                log_error("Error importing %s: %s" % (module, e))
                log_debug(6, "Details: sys.path: %s" % (sys.path, ))
                continue

            if not hasattr(m, interface_signature):
                # The module does not support our API
                log_error("Module %s doesn't support our API" % (module, ))
                continue
            log_debug(5, "Module %s loaded" % (module, ))

            _imports[module] = getattr(m, interface_signature)

        self._imports[key] = _imports
        return _imports


def load(dir, root_dir=None, interface_signature='rpcClasses'):
    """
    Load modules (handlers) beneath the handlers/ tree.

    root_dir: which directory to use as a top-level directory
    """

    l = Loader()
    return l.load(dir, interface_signature=interface_signature)
   070701000001AA000081B40000000000000000000000015FBBE8EE00002140000000000000000000000000000000000000002300000000spacewalk-backend/server/rhnLib.py    #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import os
import hmac
import hashlib
import base64
import struct
import posixpath

from uyuni.common.rhnLib import parseRPMName, parseDEBName
from spacewalk.common.rhnLog import log_debug
from spacewalk.common.rhnException import rhnFault

# architecture work
from .rhnMapping import check_package_arch


def computeSignature(*fields):
    # Init the hash
    m = hmac.new(key=str(fields[0]).encode(), digestmod=hashlib.sha256)
    for i in fields[1:]:
        i = str(i).encode()
        m.update(struct.pack('<Q', len(i)) + i)
    # We are still expecting the signature to be a string, so we have to
    # decode the output of encodestring(). Otherwise bootstrapping just
    # stales.
    return base64.encodestring(m.digest()).rstrip().decode()


# 'n_n-n-v.v.v-r_r.r:e.ARCH.rpm' ---> [n,v,r,e,a]
def parseRPMFilename(pkgFilename):
    """
    IN: Package Name: xxx-yyy-ver.ver.ver-rel.rel_rel:e.ARCH.rpm (string)
    Understood rules:
       o Name can have nearly any char, but end in a - (well seperated by).
         Any character; may include - as well.
       o Version cannot have a -, but ends in one.
       o Release should be an actual number, and can't have any -'s.
       o Release can include the Epoch, e.g.: 2:4 (4 is the epoch)
       o Epoch: Can include anything except a - and the : seperator???
         XXX: Is epoch info above correct?
    OUT: [n,e,v,r, arch].
    """
    if type(pkgFilename) != type(''):
        raise rhnFault(21, str(pkgFilename))  # Invalid arg.

    pkgFilename = os.path.basename(pkgFilename)

    # Check that this is a package NAME (with arch.rpm) and strip
    # that crap off.
    pkg = pkgFilename.split('.')

    dist = pkg[-1].lower()

    # 'rpm' at end?
    if dist not in ['rpm', 'deb']:
        raise rhnFault(21, 'neither an rpm nor a deb package name: %s' % pkgFilename)

    # Valid architecture next?
    if check_package_arch(pkg[-2]) is None:
        raise rhnFault(21, 'Incompatible architecture found: %s' % pkg[-2])

    _arch = pkg[-2]

    # Nuke that arch.rpm.
    pkg = '.'.join(pkg[:-2])

    if dist == "deb":
        ret = list(parseDEBName(pkg))
    else:
        ret = list(parseRPMName(pkg))

    if ret:
        ret.append(_arch)
    return ret

# XXX TBD where to place this function - it has to be accessible from several
# places


def normalize_server_arch(arch):
    log_debug(4, 'server arch', arch)

    if arch is None:
        return ''
    arch = str(arch)
    if '-' in arch:
        # Already normalized
        return arch

    # Fix the arch if need be
    suffix = '-redhat-linux'
    arch = arch + suffix
    return arch


class InvalidAction(Exception):

    """ An error class to signal when we can not handle an action """
    pass


class EmptyAction(Exception):

    """ An error class that signals that we encountered an internal error
        trying to handle an action through no fault of the client
    """
    pass


class ShadowAction(Exception):

    """ An error class for actions that should not get to the client """
    pass


def transpose_to_hash(arr, column_names):
    """ Handy function to transpose an array from row-based to column-based,
        with named columns.
    """
    result = []
    for c in column_names:
        result.append([])

    colnum = len(column_names)
    for r in arr:
        if len(r) != colnum:
            raise Exception(
                "Mismatching number of columns: expected %s, got %s; %s" % (
                    colnum, len(r), r))
        for i in range(len(r)):
            result[i].append(r[i])

    # Now build the hash labeled with the column names
    rh = {}
    for i in range(len(column_names)):
        rh[column_names[i]] = result[i]

    return rh


def get_package_path(nevra, org_id, source=0, prepend="", omit_epoch=None,
                     package_type='rpm', checksum_type=None, checksum=None):
    """ Computes a package path, optionally prepending a prefix
        The path will look like
        <prefix>/<org_id>/checksum[:3]/n/e:v-r/a/checksum/n-v-r.a.rpm if not omit_epoch
        <prefix>/<org_id>/checksum[:3]/n/v-r/a/checksum/n-v-r.a.rpm if omit_epoch
    """
    name, epoch, version, release, pkgarch = nevra

    # dirarch and pkgarch are special-cased for source rpms
    if source:
        dirarch = 'SRPMS'
    else:
        dirarch = pkgarch

    if org_id in ['', None]:
        org = "NULL"
    else:
        org = org_id

    if not omit_epoch and epoch not in [None, '']:
        version = str(epoch) + ':' + version
    # normpath sanitizes the path (removing duplicated / and such)
    template = os.path.normpath(prepend +
                                "/%s/%s/%s/%s-%s/%s/%s/%s-%s-%s.%s.%s")
    return template % (org, checksum[:3], name, version, release, dirarch, checksum,
                       name, nevra[2], release, pkgarch, package_type)


# bug #161989
# It seems that our software was written specifically for rpms in far too many
# ways. Here's a little bit of a hack function that will return the package path
# (as in from get_package_path) but without the filename appended.
# This enables us to append an arbitrary file name that is not restricted to the
# form: name-version-release.arch.type
def get_package_path_without_package_name(nevra, org_id, prepend="",
                                          checksum_type=None, checksum=None):
    """return a package path without the package name appended"""
    return os.path.dirname(get_package_path(nevra, org_id, prepend=prepend,
                                            checksum_type=checksum_type, checksum=checksum))


class CallableObj:

    """ Generic callable object """

    def __init__(self, name, func):
        self.func = func
        self.name = name

    def __call__(self, *args, **kwargs):
        return self.func(self.name, *args, **kwargs)


def make_evr(nvre, source=False):
    """ IN: 'e:name-version-release' or 'name-version-release:e'
        OUT: {'name':name, 'version':version, 'release':release, 'epoch':epoch }
    """
    if ":" in nvre:
        nvr, epoch = nvre.rsplit(":", 1)
    if "-" in epoch:
        nvr, epoch = epoch, nvr
    else:
        nvr, epoch = nvre, ""

    nvr_parts = nvr.rsplit("-", 2)
    if len(nvr_parts) != 3:
        raise rhnFault(err_code=21, err_text="NVRE is missing name, version, or release.")

    result = dict(list(zip(["name", "version", "release"], nvr_parts)))
    result["epoch"] = epoch

    if source and result["release"].endswith(".src"):
        result["release"] = result["release"][:-4]

    return result


def _is_secure_path(path):
    path = posixpath.normpath(path)
    return not (path.startswith('/') or path.startswith('../'))


def get_crash_path(org_id, system_id, crash):
    """For a given org_id, system_id and crash, return relative path to a crash directory."""

    path = os.path.join('systems', org_id, system_id, 'crashes', crash)

    if _is_secure_path(path):
        return path
    else:
        return None


def get_crashfile_path(org_id, system_id, crash, filename):
    """For a given org_id, system_id, crash and filename, return relative path to a crash file."""
    path = os.path.join(get_crash_path(org_id, system_id, crash), filename)

    if _is_secure_path(path):
        return path
    else:
        return None


def get_action_path(org_id, system_id, action_id):
    """For a given org_id, system_id, and action_id, return relative path to a store directory."""
    path = os.path.join('systems', str(org_id), str(system_id), 'actions', str(action_id))
    if _is_secure_path(path):
        return path


def get_actionfile_path(org_id, system_id, action_id, filename):
    """For a given org_id, system_id, action_id, and file, return relative path to a file."""
    path = os.path.join(get_action_path(org_id, system_id, action_id), str(filename))

    if _is_secure_path(path):
        return path
070701000001AB000081B40000000000000000000000015FBBE8EE00000444000000000000000000000000000000000000002700000000spacewalk-backend/server/rhnMapping.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

from spacewalk.server import rhnSQL

# checks if an arch is for real


def check_package_arch(name):
    name = str(name)
    if name is None or len(name) == 0:
        return None
    h = rhnSQL.prepare("select id from rhnPackageArch where label = :label")
    h.execute(label=name)
    ret = h.fetchone_dict()
    if not ret:
        return None
    return name

if __name__ == '__main__':
    """Test code.
    """
    rhnSQL.initDB()
    print((check_package_arch('i386')))
070701000001AC000081B40000000000000000000000015FBBE8EE0000267B000000000000000000000000000000000000002700000000spacewalk-backend/server/rhnPackage.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import os
import sys

from uyuni.common.usix import ListType

from spacewalk.common import rhnFlags
from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.common.rhnConfig import CFG
from spacewalk.common.rhnException import rhnFault
from spacewalk.common.rhnTranslate import _
from spacewalk.server import rhnSQL
from .rhnLib import parseRPMFilename


#
# Functions that deal with the database
#

# New client
# Returns a package path, given a server_id, package filename and channel label
def get_package_path(server_id, pkg_spec, channel):
    log_debug(3, server_id, pkg_spec, channel)
    checksum = None
    if isinstance(pkg_spec, ListType):
        pkg = pkg_spec[:4]
        # Insert EPOCH
        pkg.insert(1, None)
    else:
        if "/" in pkg_spec:
            org, checksum, pkg_spec = pkg_spec.split('/', 2)
        pkg = parseRPMFilename(pkg_spec)
        if pkg is None:
            log_debug(4, "Error", "Requested weird package", pkg_spec)
            raise rhnFault(17, _("Invalid RPM package %s requested") % pkg_spec)

    statement = """
        select  p.id, p.path path, pe.epoch epoch
        from
                rhnPackageArch pa,
                rhnChannelPackage cp,
                rhnPackage p,
                rhnChecksum cs,
                rhnPackageEVR pe,
                rhnServerChannel sc,
                rhnPackageName pn,
                rhnChannel c
        where 1=1
            and c.label = :channel
            and pn.name = :name
            and sc.server_id = :server_id
            and pe.version = :ver
            and pe.release = :rel
            and c.id = sc.channel_id
            and c.id = cp.channel_id
            and pa.label = :arch
            and pn.id = p.name_id
            and p.id = cp.package_id
            and p.evr_id = pe.id
            and sc.channel_id = cp.channel_id
            and p.package_arch_id = pa.id
            and p.checksum_id = cs.id
            and (:checksum IS NULL OR cs.checksum = :checksum)
    """
    pkg = list(map(str, pkg))
    h = rhnSQL.prepare(statement)
    h.execute(name=pkg[0], ver=pkg[2], rel=pkg[3], arch=pkg[4],
              channel=channel, server_id=server_id, checksum=checksum)
    rs = h.fetchall_dict()
    if not rs:
        log_debug(4, "Error", "Non-existant package requested", server_id,
                  pkg_spec, channel)
        raise rhnFault(17, _("Invalid RPM package %s requested") % pkg_spec)
    # It is unlikely for this query to return more than one row,
    # but it is possible
    # (having two packages with the same n, v, r, a and different epoch in
    # the same channel is prohibited by the RPM naming scheme; but extra
    # care won't hurt)
    max_row = rs[0]
    for each in rs[1:]:
        # Compare the epoch as string
        if _none2emptyString(each['epoch']) > _none2emptyString(max_row['epoch']):
            max_row = each

    # Set the flag for the proxy download accelerator
    rhnFlags.set("Download-Accelerator-Path", max_row['path'])
    return check_package_file(max_row['path'], max_row['id'], pkg_spec), max_row['id']


def check_package_file(rel_path, logpkg, raisepkg):
    if rel_path is None:
        log_error("Package path null for package id", logpkg)
        raise rhnFault(17, _("Invalid RPM package %s requested") % raisepkg)
    filePath = "%s/%s" % (CFG.MOUNT_POINT, rel_path)
    if not os.access(filePath, os.R_OK):
        # Package not found on the filesystem
        log_error("Package not found", filePath)
        raise rhnFault(17, _("Package not found"))

    return filePath


def unlink_package_file(path):
    try:
        os.unlink(path)
    except OSError:
        log_debug(1,  "Error unlinking %s;" % path)
    dirname = os.path.dirname(path)
    base_dirs = (CFG.MOUNT_POINT + '/' + CFG.PREPENDED_DIR, CFG.MOUNT_POINT)
    while dirname not in base_dirs:
        try:
            os.rmdir(dirname)
        except OSError:
            e = sys.exc_info()[1]
            if e.errno == 39:  # OSError: [Errno 39] Directory not empty
                break
            else:
                raise
        dirname = os.path.dirname(dirname)


def get_all_package_paths(server_id, pkg_spec, channel):
    """
    return the remote path if available and localpath
    for the requested package with respect to package id
    """
    log_debug(3, server_id, pkg_spec, channel)
    remotepath = None
    # get the path and package
    localpath, pkg_id = get_package_path(server_id, pkg_spec, channel)

    return remotepath, localpath

# New client
# Returns the path to a source rpm


def get_source_package_path(server_id, pkgFilename, channel):
    log_debug(3, server_id, pkgFilename, channel)
    rs = __query_source_package_path_by_name(server_id, pkgFilename, channel)
    if rs is None:
        log_debug(4, "Error", "Non-existant package requested", server_id,
                  pkgFilename, channel)
        raise rhnFault(17, _("Invalid RPM package %s requested") % pkgFilename)

    # Set the flag for the proxy download accelerator
    rhnFlags.set("Download-Accelerator-Path", rs['path'])
    return check_package_file(rs['path'], pkgFilename, pkgFilename)


# 0 or 1: is this source in this channel?
def package_source_in_channel(server_id, pkgFilename, channel):
    log_debug(3, server_id, pkgFilename, channel)
    rs = __query_source_package_path_by_name(server_id, pkgFilename, channel)
    if rs is None:
        return 0
    return 1


# The query used both in get_source_package_path and package_source_in_channel
def __query_source_package_path_by_name(server_id, pkgFilename, channel):
    statement = """
    select
            unique ps.path
    from
            rhnSourceRPM sr,
            rhnPackageSource ps,
            rhnPackage p,
            rhnChannelPackage cp,
            rhnChannel c,
            rhnServerChannel sc
    where
                sc.server_id = :server_id
            and sc.channel_id = cp.channel_id
            and cp.channel_id = c.id
            and c.label = :channel
            and cp.package_id = p.id
            and p.source_rpm_id = sr.id
            and sr.name = :name
            and p.source_rpm_id = ps.source_rpm_id
            and ((p.org_id is null and ps.org_id is null)
                or p.org_id = ps.org_id)
    """
    h = rhnSQL.prepare(statement)
    h.execute(name=pkgFilename, channel=channel, server_id=server_id)
    return h.fetchone_dict()


def get_info_for_package(pkg, channel_id, org_id):
    log_debug(3, pkg)
    pkg = list(map(str, pkg))
    params = {'name': pkg[0],
              'ver': pkg[1],
              'rel': pkg[2],
              'epoch': pkg[3],
              'arch': pkg[4],
              'channel_id': channel_id,
              'org_id': org_id}
    # yum repo has epoch="0" not only when epoch is "0" but also if it's NULL
    # in DB we cannot insert an empty string, so we check for NULL or '0'
    if pkg[3] == '0' or pkg[3] == '' or pkg[3] is None:
        epochStatement = "(epoch is null or epoch = '0')"
    else:
        epochStatement = "epoch = :epoch"
    if params['org_id']:
        orgStatement = "org_id = :org_id"
    else:
        orgStatement = "org_id is null"

    statement = """
    select p.path, cp.channel_id,
           cv.checksum_type, cv.checksum, p.org_id, pe.epoch
      from rhnPackage p
      join rhnPackageName pn
        on p.name_id = pn.id
      join rhnPackageEVR pe
        on p.evr_id = pe.id
      join rhnPackageArch pa
        on p.package_arch_id = pa.id
      left join rhnChannelPackage cp
        on p.id = cp.package_id
       and cp.channel_id = :channel_id
      join rhnChecksumView cv
        on p.checksum_id = cv.id
     where pn.name = :name
       and pe.version = :ver
       and pe.release = :rel
       and %s
       and pa.label = :arch
       and %s
     order by cp.channel_id nulls last,
              p.id desc
    """ % (epochStatement, orgStatement)

    h = rhnSQL.prepare(statement)
    h.execute(**params)

    ret = h.fetchall_dict() or []
    if not ret:
        return ret
    for i in ret:
        if i['org_id'] == None:
            i['org_id'] = ''
        else:
            i['org_id'] = str(i['org_id'])
    return ret


def _none2emptyString(foo):
    if foo is None:
        return ""
    return str(foo)

def add_eula_to_package(package_id, eula_id):
    """ Associates an EULA to a package """

    h = rhnSQL.prepare("""
        SELECT *
          FROM susePackageEula
         WHERE package_id = :package_id
           AND eula_id    = :eula_id
    """)
    h.execute(package_id=package_id, eula_id=eula_id)
    ret = h.fetchone_dict()

    if not ret:
        h = rhnSQL.prepare("""
            INSERT INTO susePackageEula (package_id, eula_id)
                 VALUES (:package_id, :eula_id)
        """)
        h.execute(package_id=package_id, eula_id=eula_id)

if __name__ == '__main__':
    """Test code.
    """
    from spacewalk.common.rhnLog import initLOG
    initLOG("stdout", 1)
    rhnSQL.initDB()
    print("")
    # new client
    print((get_package_path(1000463284, 'kernel-2.4.2-2.i686.rpm', 'redhat-linux-i386-7.1')))
    print((get_source_package_path(1000463284, 'kernel-2.4.2-2.i686.rpm', 'redhat-linux-i386-7.1')))
 070701000001AD000081B40000000000000000000000015FBBE8EE00002F6D000000000000000000000000000000000000002D00000000spacewalk-backend/server/rhnPackageUpload.py  #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import os
import sys
import tempfile

from uyuni.common.usix import raise_with_tb
from uyuni.common import rhn_mpm, rhn_deb, rhn_pkg
from spacewalk.common.rhnLog import log_debug
from spacewalk.common.rhnConfig import CFG
from spacewalk.common.rhnException import rhnFault
from uyuni.common.rhn_rpm import get_header_byte_range

from spacewalk.server import rhnSQL
from spacewalk.server.importlib.backendOracle import SQLBackend
from spacewalk.server.importlib import importLib, userAuth, mpmSource, \
    packageImport, errataCache
from spacewalk.server.rhnLib import get_package_path, \
    get_package_path_without_package_name
from spacewalk.server.rhnServer import server_packages


def authenticate(username, password, channels=[], null_org=None, force=None):
    log_debug(4, username, force)
    authobj = userAuth.UserAuth()
    authobj.auth(username, password)
    return _authenticate(authobj, channels, null_org, force)


def authenticate_session(session_string, channels=[], null_org=None, force=None):
    log_debug(4, session_string, force)
    authobj = userAuth.UserAuth()
    authobj.auth_session(session_string)
    return _authenticate(authobj, channels, null_org, force)


def _authenticate(authobj, channels, null_org, force):
    params = {}
    if null_org:
        params['orgId'] = ''

        # XXX don't allow superusers to force stuff
        if force:
            raise rhnFault(4, "Cannot force push nullorg content", explain=0)

    if force and not CFG.FORCE_PACKAGE_UPLOAD:
        raise rhnFault(55, "Package Upload Failed", explain=0)

    authobj.authzOrg(params)
    if channels:
        authobj.authzChannels(channels)

    if null_org:
        org_id = None
    else:
        org_id = authobj.org_id

    return org_id, force


def relative_path_from_header(header, org_id, checksum_type=None, checksum=None):
    nevra = importLib.get_nevra(header)
    if header.is_source:
        # 4/18/05 wregglej. if 1051 is in the header's keys, then it's a nosrc package.
        if 1051 in list(header.keys()):
            nevra[4] = 'nosrc'
        else:
            nevra[4] = 'src'

    log_debug(4, "NEVRA", nevra)

    # if the package isn't an rpm and the package name is spelled out in the
    # header, use it
    if header.packaging == "mpm" and "package_name" in list(header.keys()) and \
       header["package_name"]:

        rel_path = relative_path_from_nevra_without_package_name(nevra, org_id,
                                                                 checksum_type, checksum)
        return os.path.join(rel_path, header["package_name"])

    return relative_path_from_nevra(nevra,
                                    org_id, header.packaging, checksum_type, checksum)


def relative_path_from_nevra(nevra, org_id, package_type=None, checksum_type=None, checksum=None):
    # 4/18/05 wregglej. if 1051 is in the header's keys, then it's a nosrc package.
    if nevra[4] == 'src' or nevra[4] == 'nosrc':
        is_source = 1
    else:
        is_source = 0
    log_debug(4, nevra, is_source)
    return get_package_path(nevra, org_id=org_id, source=is_source,
                            prepend=CFG.PREPENDED_DIR, omit_epoch=None, package_type=package_type,
                            checksum_type=checksum_type, checksum=checksum)

# bug #161989 - get the relative path from the nevra, but omit the package name


def relative_path_from_nevra_without_package_name(nevra, org_id, checksum_type, checksum):
    log_debug(4, nevra, "no package name")
    return get_package_path_without_package_name(nevra, org_id,
                                                 CFG.PREPENDED_DIR, checksum_type, checksum)


def push_package(a_pkg, org_id=None, force=None, channels=[], relative_path=None):
    """Uploads a package"""

    if relative_path:
        # First write the package to the filesystem to final location
        try:
            importLib.move_package(a_pkg.payload_stream.name, basedir=CFG.MOUNT_POINT,
                                   relpath=relative_path,
                                   checksum_type=a_pkg.checksum_type, checksum=a_pkg.checksum, force=1)
        except OSError:
            e = sys.exc_info()[1]
            raise_with_tb(rhnFault(50, "Package upload failed: %s" % e), sys.exc_info()[2])
        except importLib.FileConflictError:
            raise_with_tb(rhnFault(50, "File already exists"), sys.exc_info()[2])
        except:
            raise_with_tb(rhnFault(50, "File error"), sys.exc_info()[2])

        # Remove any pending scheduled file deletion for this package
        h = rhnSQL.prepare("""
            delete from rhnPackageFileDeleteQueue where path = :path
        """)
        h.execute(path=relative_path)

    pkg = mpmSource.create_package(a_pkg.header, size=a_pkg.payload_size,
                                   checksum_type=a_pkg.checksum_type, checksum=a_pkg.checksum,
                                   relpath=relative_path, org_id=org_id, header_start=a_pkg.header_start,
                                   header_end=a_pkg.header_end, channels=channels)

    batch = importLib.Collection()
    batch.append(pkg)

    backend = SQLBackend()

    if force:
        upload_force = 4
    else:
        upload_force = 0
    importer = packageImport.packageImporter(batch, backend,
                                             source=a_pkg.header.is_source, caller="server.app.uploadPackage")
    importer.setUploadForce(upload_force)
    importer.run()

    package = batch[0]
    log_debug(5, "Package diff", package.diff)

    if package.diff and not force and package.diff.level > 1:
        # Packages too different; bail out
        log_debug(1, "Packages too different", package.toDict(),
                  "Level:", package.diff.level)
        pdict = package.toDict()
        orig_path = package['path']
        orig_path = os.path.join(CFG.MOUNT_POINT, orig_path)
        log_debug(4, "Original package", orig_path)

        # MPMs do not store their headers on disk, so we must avoid performing
        # operations which rely on information only contained in the headers
        # (such as header signatures).
        if os.path.exists(orig_path) and a_pkg.header.packaging != 'mpm':
            oh = rhn_pkg.get_package_header(orig_path)
            _diff_header_sigs(a_pkg.header, oh, pdict['diff']['diff'])

        return pdict, package.diff.level

    if package.diff and not force and package.diff.level:
        # No need to copy it - just the path is modified
        # pkilambi bug#180347
        # case 1:check if the path exists in the db and also on the file system.
        # if it does then no need to copy
        # case2: file exists on file system but path not in db.then add the
        # realtive path in the db based on checksum of the pkg
        # case3: if no file on file system but path exists.then we write the
        # file to file system
        # case4:no file exists on FS and no path in db .then we write both.
        orig_path = package['path']
        orig_path = os.path.join(CFG.MOUNT_POINT, orig_path)
        log_debug(3, "Original package", orig_path)

        # check included to query for source and binary rpms
        h_path_sql = """
            select ps.path path
                from %s ps,
                     rhnChecksumView c
            where
                c.checksum = :csum
            and c.checksum_type = :ctype
            and ps.checksum_id = c.id
            and (ps.org_id = :org_id or
                 (ps.org_id is null and :org_id is null)
                )
            """
        if a_pkg.header.is_source:
            h_package_table = 'rhnPackageSource'
        else:
            h_package_table = 'rhnPackage'
        h_path = rhnSQL.prepare(h_path_sql % h_package_table)
        h_path.execute(ctype=a_pkg.checksum_type, csum=a_pkg.checksum, org_id=org_id)

        rs_path = h_path.fetchall_dict()
        path_dict = {}
        if rs_path:
            path_dict = rs_path[0]

        if os.path.exists(orig_path) and path_dict['path']:
            return {}, 0
        elif not path_dict['path']:
            h_upd = rhnSQL.prepare("""
            update rhnpackage
               set path = :path
            where checksum_id = (
                        select id from rhnChecksumView c
                                 where c.checksum = :csum
                                   and c.checksum_type = :ctype)
            """)
            h_upd.execute(path=relative_path, ctype=a_pkg.checksum_type,
                          csum=a_pkg.checksum)

    # commit the transactions
    rhnSQL.commit()
    if not a_pkg.header.is_source:
        # Process Package Key information
        server_packages.processPackageKeyAssociations(a_pkg.header,
                                                      a_pkg.checksum_type, a_pkg.checksum)

    if not a_pkg.header.is_source:
        errataCache.schedule_errata_cache_update(importer.affected_channels)

    log_debug(2, "Returning")
    return {}, 0


def _diff_header_sigs(h1, h2, diff_list):
    # XXX This can be far more complicated if we take into account that
    # signatures can be different
    h1sigs = h1.signatures
    h2sigs = h2.signatures
    if not h1sigs and not h2sigs:
        # No differences here
        return
    h1_key_ids = _key_ids(h1sigs)
    h2_key_ids = _key_ids(h2sigs)

    diff_list.append(['sig_key_id', h1_key_ids, h2_key_ids])


def _key_ids(sigs):
    h = {}
    for sig in sigs:
        h[sig['key_id']] = None

    l = list(h.keys())
    l.sort()
    return l


def save_uploaded_package(stream, nevra, org_id, packaging,
                          checksum_type=None, checksum=None):
    a_pkg = rhn_pkg.package_from_stream(stream, packaging=packaging)
    a_pkg.read_header()

    temp_dir = os.path.join(CFG.MOUNT_POINT, CFG.PREPENDED_DIR, org_id, 'stage')
    if not os.path.isdir(temp_dir):
        os.makedirs(temp_dir)
    temp_stream = tempfile.NamedTemporaryFile(dir=temp_dir,
                                              prefix='-'.join((nevra[0], nevra[2], nevra[3], nevra[4])))
    a_pkg.save_payload(temp_stream)

    if checksum_type and checksum:
        # verify checksum
        if not (checksum_type == a_pkg.checksum_type
                and checksum == a_pkg.checksum):
            log_debug(1, "Mismatching checksums: expected %s:%s got %s:%s" %
                      (checksum_type, checksum,
                       a_pkg.checksum_type, a_pkg.checksum))
            raise rhnFault(104, "Mismatching information")

    temp_stream.file.close()
    temp_stream.close_called = True
    return a_pkg


def load_package(package_stream):
    if package_stream.name.endswith('.deb'):
        try:
            header, payload_stream = rhn_deb.load(filename=package_stream.name)
        except:
            raise_with_tb(rhnFault(50, "Unable to load package", explain=0), sys.exc_info()[2])
    else:
        try:
            header, payload_stream = rhn_mpm.load(file_obj=package_stream)
        except:
            raise_with_tb(rhnFault(50, "Unable to load package", explain=0), sys.exc_info()[2])

    payload_stream.seek(0, 0)
    if header.packaging == "mpm" or header.packaging == "deb":
        header.header_start = header.header_end = 0
        (header_start, header_end) = (0, 0)
    else:
        (header_start, header_end) = get_header_byte_range(payload_stream)
        payload_stream.seek(0, 0)

    return header, payload_stream, header_start, header_end


class AlreadyUploadedError(Exception):
    pass
   070701000001AE000081B40000000000000000000000015FBBE8EE00003F26000000000000000000000000000000000000002A00000000spacewalk-backend/server/rhnRepository.py #
# Copyright (c) 2008--2018 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

# system module imports
import os
import stat
import sys

from rhn import rpclib

# common modules imports
from uyuni.common.usix import raise_with_tb
from spacewalk.common import rhnRepository, rhnFlags, rhnCache
from spacewalk.common.rhnLog import log_debug
from spacewalk.common.rhnConfig import CFG
from spacewalk.common.rhnException import rhnFault, redirectException
from uyuni.common.rhnLib import rfc822time, timestamp

# local modules imports
from spacewalk.server import rhnChannel, rhnPackage, taskomatic, rhnSQL
from .rhnServer import server_lib
from .repomd import repository


class Repository(rhnRepository.Repository):

    """ Cache class to perform RHN server file system and DB actions.

    This class gets all data from the file system and oracle.
    All the functions that are performed upon GET requests are here (and
    since proxies perform these functions as well, a good chunk of code is
    in common/rhnRepository.py)

    The listall code is here too, because it performs a lot of disk caching
    and here's the appropriate location for it

    The dependency solving code is not handled in this repository -
    all the code we need is already in xmlrpc/up2date
    """

    def __init__(self, channelName=None, server_id=None, username=None):
        """Initialize the class, setting channel name and server

        ID, that serial number (w/o ID-), if necessary.
        NOTE: server_id is a string.
        """
        log_debug(3, channelName, server_id)
        rhnRepository.Repository.__init__(self, channelName)
        self.server_id = server_id
        self.username = username
        self.functions.append('listPackages')
        self.functions.append('getObsoletes')
        self.functions.append('getObsoletesBlacklist')
        self.functions.append('listAllPackages')
        self.functions.append('listAllPackagesChecksum')
        self.functions.append('listAllPackagesComplete')
        self.functions.append('repodata')
        self.set_compress_headers(CFG.COMPRESS_HEADERS)
        self.redirect_location = None

    def getPackageHeader(self, pkgFilename):
        ret = rhnRepository.Repository.getPackageHeader(self, pkgFilename)
        # Clean up the download-accelerator flag
        rhnFlags.set("Download-Accelerator-Path", None)
        return ret

    def listChannels(self):
        """ Clients v2+
        returns a list of the channels the server is subscribed to, or
        could subscribe to.
        """
        return rhnChannel.channels_for_server(self.server_id)

    def listPackages(self, version):
        """ Clients v2+.
        Creates and/or serves up a cached copy of the package list for
        this channel.
        """
        log_debug(3, self.channelName, version)
        # Check to see if the version they are requesting is the latest

        # check the validity of what the client thinks about this channel
        # or blow up
        self.__check_channel(version)

        packages = rhnChannel.list_packages(self.channelName)

        # transport options...
        transportOptions = rhnFlags.get('outputTransportOptions')
        transportOptions['Last-Modified'] = rfc822time(timestamp(version))
        rhnFlags.set("compress_response", 1)
        return packages

    def getObsoletes(self, version):
        """ Returns a list of packages that obsolete other packages """
        log_debug(3, self.channelName, version)
        # Check to see if the version they are requesting is the latest

        # check the validity of what the client thinks about this channel
        # or blow up
        self.__check_channel(version)

        obsoletes = rhnChannel.list_obsoletes(self.channelName)

        # Set the transport options
        transportOptions = rhnFlags.get('outputTransportOptions')
        transportOptions['Last-Modified'] = rfc822time(timestamp(version))
        rhnFlags.set("compress_response", 1)
        return obsoletes

    def getObsoletesBlacklist(self, version):
        """ Returns a list of packages that obsolete other packages
        XXX Obsoleted
        """
        log_debug(3, self.channelName, version)
        # Check to see if the version they are requesting is the latest

        # check the validity of what the client thinks about this channel
        # or blow up
        self.__check_channel(version)

        # Set the transport options
        transportOptions = rhnFlags.get('outputTransportOptions')
        transportOptions['Last-Modified'] = rfc822time(timestamp(version))
        rhnFlags.set("compress_response", 1)
        # Return nothing
        return []

    def listAllPackages(self, version):
        """ Creates and/or serves up a cached copy of all the packages for
        this channel.
        """
        log_debug(3, self.channelName, version)
        # Check to see if the version they are requesting is the latest

        # check the validity of what the client thinks about this channel
        # or blow up
        self.__check_channel(version)

        packages = rhnChannel.list_all_packages(self.channelName)

        # transport options...
        transportOptions = rhnFlags.get('outputTransportOptions')
        transportOptions['Last-Modified'] = rfc822time(timestamp(version))
        rhnFlags.set("compress_response", 1)
        return packages

    def listAllPackagesChecksum(self, version):
        """ Creates and/or serves up a cached copy of all the packages for
        this channel, including checksum information.
        """
        log_debug(3, self.channelName, version)
        # Check to see if the version they are requesting is the latest

        # check the validity of what the client thinks about this channel
        # or blow up
        self.__check_channel(version)

        packages = rhnChannel.list_all_packages_checksum(self.channelName)

        # transport options...
        transportOptions = rhnFlags.get('outputTransportOptions')
        transportOptions['Last-Modified'] = rfc822time(timestamp(version))
        rhnFlags.set("compress_response", 1)
        return packages

    def listAllPackagesComplete(self, version):
        """ Creates and/or serves up a cached copy of all the packages for
        this channel including requires, obsoletes, conflicts, etc.
        """
        log_debug(3, self.channelName, version)
        # Check to see if the version they are requesting is the latest

        # check the validity of what the client thinks about this channel
        # or blow up
        self.__check_channel(version)

        packages = rhnChannel.list_all_packages_complete(self.channelName)

        # transport options...
        transportOptions = rhnFlags.get('outputTransportOptions')
        transportOptions['Last-Modified'] = rfc822time(timestamp(version))
        rhnFlags.set("compress_response", 1)
        return packages

    def _repodata_python(self, file_name):
        log_debug(3, 'repodata', file_name)
        c_info = rhnChannel.channel_info(self.channelName)
        repo = repository.get_repository(c_info)

        output = None
        content_type = "application/x-gzip"

        if file_name == "repomd.xml":
            content_type = "text/xml"
            output = repo.get_repomd_file()
        elif file_name == "primary.xml.gz":
            output = repo.get_primary_xml_file()
        elif file_name == "other.xml.gz":
            output = repo.get_other_xml_file()
        elif file_name == "filelists.xml.gz":
            output = repo.get_filelists_xml_file()
        elif file_name == "updateinfo.xml.gz":
            output = repo.get_updateinfo_xml_file()
        elif file_name == "comps.xml":
            content_type = "text/xml"
            output = repo.get_comps_file()
        elif file_name == "modules.yaml":
            output = repo.get_modules_file()
        else:
            log_debug(2, "Unknown repomd file requested: %s" % file_name)
            raise rhnFault(6)

        output = rpclib.transports.File(output, name=file_name)

        rhnFlags.set('Content-Type', content_type)

        return output

    def _repodata_taskomatic(self, file_name):
        log_debug(3, 'repodata', file_name)

        content_type = "application/x-gzip"

        if file_name in ["repomd.xml", "comps.xml", "products.xml"]:
            content_type = "text/xml"
        elif file_name in ["repomd.xml.asc", "repomd.xml.key"]:
            content_type = "text/plain"
        elif file_name not in ["primary.xml.gz", "other.xml.gz",
                               "filelists.xml.gz", "updateinfo.xml.gz", "Packages.gz", "modules.yaml",
                               "InRelease", "Release", "Release.gpg",
                               "susedata.xml.gz"]:
            log_debug(2, "Unknown repomd file requested: %s" % file_name)
            raise rhnFault(6)

        # XXX this won't be repconned or CDNd
        if file_name in ["comps.xml", "modules.yaml"]:
            return self._repodata_python(file_name)

        file_path = "%s/%s/%s" % (CFG.REPOMD_PATH_PREFIX, self.channelName, file_name)
        rhnFlags.set('Content-Type', content_type)
        try:
            rhnFlags.set('Download-Accelerator-Path', file_path)
            return self._getFile(CFG.REPOMD_CACHE_MOUNT_POINT + "/" + file_path)
        except IOError:
            e = sys.exc_info()[1]
            # For file not found, queue up a regen, and return 404
            if e.errno == 2 and file_name not in ["comps.xml", "modules.yaml"]:
                if file_name not in ["repomd.xml.key", "repomd.xml.asc"]:
                    taskomatic.add_to_repodata_queue(self.channelName, "repodata request",
                                                     file_name, bypass_filters=True)
                    rhnSQL.commit()
                # This returns 404 to the client
                raise_with_tb(rhnFault(6), sys.exc_info()[2])
            raise

    def repodata(self, file_name):
        # By default we're using taskomatic's repomd. But if the config
        # value is present and set to anything other than 1, we'll use the
        # old python code
        use_taskomatic = True
        try:
            use_taskomatic = (CFG.USE_TASKOMATIC_REPOMD == 1)
        except AttributeError:
            pass

        log_debug(4, "Using taskomatic for repomd generation: %s"
                  % use_taskomatic)

        if use_taskomatic:
            return self._repodata_taskomatic(file_name)
        else:
            return self._repodata_python(file_name)

    # Helper functions
    # These functions are not private, they should be defined as 'protected',
    # since the code that handles v2 package retrieval (plus headers) is in
    # common/rhnRepository, and expects a definition for these functions to
    # know where to take stuff from

    def getPackagePath(self, pkgFilename, redirect_capable=0):
        """ Retrieves package path
        Overloads getPackagePath in common/rhnRepository.
        checks if redirect and hosted;
        makes a call to query the db for pkg_location
        """

        log_debug(2, pkgFilename, redirect_capable)
        # check for re-direct check flag from header to issue package
        # request from client in order to avoid failover loops.
        skip_redirect = rhnFlags.get('x-rhn-redirect')
        log_debug(3, "check flag for X-RHN-REDIRECT  ::", skip_redirect)

        # get the redirect and local paths
        remotepath, localpath = self.getAllPackagePaths(pkgFilename)

        # check for redirect conditions and fail over checks
        if redirect_capable and not CFG.SATELLITE and not skip_redirect \
                and remotepath is not None:
            self.redirect_location = remotepath
            # We've set self.redirect_location, we're done here
            # we throw a redirectException in _getFile method.
            return None
            # Package cannot be served from the edge, we serve it ourselves
        return localpath

    def _getFile(self, path):
        """
        overwrites the common/rhnRepository._getFile to check for redirect
        """
        if self.redirect_location:
            raise redirectException(self.redirect_location)
        return rhnRepository.Repository._getFile(self, path)

    def getAllPackagePaths(self, pkgFilename):
        """
        retrives the package location if edge network location available
        and its local path.
        """
        log_debug(3, pkgFilename)
        return rhnPackage.get_all_package_paths(self.server_id, pkgFilename,
                                                self.channelName)

    def getSourcePackagePath(self, pkgFilename):
        """ Retrieves package source path
            Overloads getSourcePackagePath in common/rhnRepository.
        """
        return rhnPackage.get_source_package_path(self.server_id, pkgFilename,
                                                  self.channelName)

    # Private methods

    def __check_channel(self, version):
        """ check if the current channel version matches that of the client """
        channel_list = rhnChannel.channels_for_server(self.server_id)
        # Check the subscription to this channel
        for channel in channel_list:
            if channel['label'] == self.channelName:
                # Okay, we verified the subscription
                # Check the version too
                if channel['last_modified'] == version:
                    # Great
                    break
                # Old version; should re-login to get the new version
                raise rhnFault(41, "Invalid channel version")
        else:
            # Not subscribed
            raise rhnFault(39, "No subscription to the specified channel")
        return 1

    def set_qos(self):
        server_lib.set_qos(self.server_id)

    def _getHeaderFromFile(self, filePath, stat_info=None):
        """ Wraps around common.rhnRepository's method, adding a caching layer
        If stat_info was already passed, don't re-stat the file
        """
        log_debug(3, filePath)
        if not CFG.CACHE_PACKAGE_HEADERS:
            return rhnRepository.Repository._getHeaderFromFile(self, filePath,
                                                               stat_info=stat_info)
        # Ignore stat_info for now - nobody sets it anyway
        stat_info = None
        try:
            stat_info = os.stat(filePath)
        except:
            raise_with_tb(rhnFault(17, "Unable to read package %s"
                               % os.path.basename(filePath)), sys.exc_info()[2])
        lastModified = stat_info[stat.ST_MTIME]

        # OK, file exists, check the cache
        cache_key = os.path.normpath("headers/" + filePath)
        header = rhnCache.get(cache_key, modified=lastModified, raw=1,
                              compressed=1)
        if header:
            # We're good to go
            log_debug(2, "Header cache HIT for %s" % filePath)
            extra_headers = {
                'X-RHN-Package-Header': os.path.basename(filePath),
            }
            self._set_last_modified(lastModified, extra_headers=extra_headers)
            return header
        log_debug(3, "Header cache MISS for %s" % filePath)
        header = rhnRepository.Repository._getHeaderFromFile(self, filePath,
                                                             stat_info=stat_info)
        if header:
            rhnCache.set(cache_key, header, modified=lastModified, raw=1,
                         compressed=1)
        return header
  070701000001AF000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002000000000spacewalk-backend/server/rhnSQL   070701000001B0000081B40000000000000000000000015FBBE8EE000000EC000000000000000000000000000000000000002900000000spacewalk-backend/server/rhnSQL/Makefile  # Makefile for the rhnSQL module
#

TOP     = ../..
SUBDIR	= server/rhnSQL

SPACEWALK_FILES	= __init__ sql_base sql_lib \
	  sql_row sql_sequence sql_table sql_types \
          dbi driver_postgresql const

include $(TOP)/Makefile.defs
070701000001B1000081B40000000000000000000000015FBBE8EE00001DD0000000000000000000000000000000000000002C00000000spacewalk-backend/server/rhnSQL/__init__.py   #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# entry points for the rhnSQL module
#

import sys

from uyuni.common.usix import raise_with_tb
from spacewalk.common.rhnLog import log_debug
from spacewalk.common.rhnConfig import CFG, initCFG
from spacewalk.common.rhnException import rhnException
from spacewalk.common.rhnTB import add_to_seclist

# SQL objects
from . import sql_table
from . import sql_row
from . import sql_sequence
from . import dbi
from . import sql_types
types = sql_types

from .const import POSTGRESQL, SUPPORTED_BACKENDS

# expose exceptions
from .sql_base import SQLError, SQLSchemaError, SQLConnectError, \
    SQLStatementPrepareError, Statement, ModifiedRowError

# ths module works with a private global __DB object that is
# instantiated by the initDB call. This object/instance should NEVER,
# EVER be exposed to the calling applications.


def __init__DB(backend, host, port, username, password, database, sslmode, sslrootcert):
    """
    Establish and check the connection so we can wrap it and handle
    exceptions.
    """
    # __DB global object created here and pushed into the global namespace.
    global __DB
    try:
        my_db = __DB
    except NameError:  # __DB has not been set up
        db_class = dbi.get_database_class(backend=backend)
        __DB = db_class(host, port, username, password, database, sslmode, sslrootcert)
        __DB.connect()
        return
    else:
        del my_db

    if __DB.is_connected_to(backend, host, port, username, password,
                            database, sslmode, sslrootcert):
        __DB.check_connection()
        return

    __DB.commit()
    __DB.close()
    # now we have to get a different connection
    __DB = dbi.get_database_class(backend=backend)(
        host, port, username, password, database, sslmode, sslrootcert)
    __DB.connect()
    return 0


def initDB(backend=None, host=None, port=None, username=None,
           password=None, database=None, sslmode=None, sslrootcert=None):
    """
    Initialize the database.

    Either we get backend and all parameter which means the caller
    knows what they are doing, or we populate everything from the
    config files.
    """

    if backend is None:
        if CFG is None or not CFG.is_initialized():
            initCFG('server')
        backend = CFG.DB_BACKEND
        host = CFG.DB_HOST
        port = CFG.DB_PORT
        database = CFG.DB_NAME
        username = CFG.DB_USER
        password = CFG.DB_PASSWORD
        sslmode = None
        sslrootcert = None
        if CFG.DB_SSL_ENABLED:
            sslmode = 'verify-full'
            sslrootcert = CFG.DB_SSLROOTCERT

    if backend not in SUPPORTED_BACKENDS:
        raise rhnException("Unsupported database backend", backend)

    if port:
        port = int(port)

    # Hide the password
    add_to_seclist(password)
    try:
        __init__DB(backend, host, port, username, password, database, sslmode, sslrootcert)
#    except (rhnException, SQLError):
#        raise  # pass on, we know those ones
#    except (KeyboardInterrupt, SystemExit):
#        raise
    except SQLConnectError:
        e = sys.exc_info()[1]
        try:
            closeDB()
        except NameError:
            pass
        raise_with_tb(e, sys.exc_info()[2])
    except:
        raise
        #e_type, e_value = sys.exc_info()[:2]
        # raise rhnException("Could not initialize Oracle database connection",
        #                   str(e_type), str(e_value))
    return 0

# close the database


def closeDB(committing=True, closing=True):
    global __DB
    try:
        my_db = __DB
    except NameError:
        return
    else:
        del my_db
    if committing:
        __DB.commit()
    if closing:
        __DB.close()
    del __DB
    return


# common function for testing the connection state (ie, __DB defined
def __test_DB():
    global __DB
    try:
        return __DB
    except NameError:
        raise_with_tb(SystemError("Not connected to any database!"), sys.exc_info()[2])

# wrapper for a Procedure callable class


def Procedure(name):
    db = __test_DB()
    return db.procedure(name)


# wrapper for a Procedure callable class
def Function(name, ret_type):
    db = __test_DB()
    return db.function(name, ret_type)


# Wrapper for the Sequence class
def Sequence(seq):
    db = __test_DB()
    return sql_sequence.Sequence(db, seq)


# Wrapper for the Row class
def Row(table, hash_name, hash_value=None):
    db = __test_DB()
    return sql_row.Row(db, table, hash_name, hash_value)


# Wrapper for the Table class
def Table(table, hash_name, local_cache=0):
    db = __test_DB()
    return sql_table.Table(db, table, hash_name, local_cache)


###########################
# Functions points of entry
###########################


def cursor():
    db = __test_DB()
    return db.cursor()


def prepare(sql, blob_map=None):
    db = __test_DB()
    if isinstance(sql, Statement):
        sql = sql.statement
    return db.prepare(sql, blob_map=blob_map)


def execute(sql, *args, **kwargs):
    db = __test_DB()
    return db.execute(sql, *args, **kwargs)


def fetchall_dict(sql, *args, **kwargs):
    h = prepare(sql)
    h.execute(sql, *args, **kwargs)
    return h.fetchall_dict()


def fetchone_dict(sql, *args, **kwargs):
    h = prepare(sql)
    h.execute(sql, *args, **kwargs)
    return h.fetchone_dict()


def commit():
    db = __test_DB()
    return db.commit()


def rollback(name=None):
    db = __test_DB()
    return db.rollback(name)


def transaction(name):
    db = __test_DB()
    return db.transaction(name)


def TimestampFromTicks(*args, **kwargs):
    db = __test_DB()
    return db.TimestampFromTicks(*args, **kwargs)


def DateFromTicks(*args, **kwargs):
    db = __test_DB()
    return db.DateFromTicks(*args, **kwargs)


def Date(*args, **kwargs):
    db = __test_DB()
    return db.Date(*args, **kwargs)


def _fix_encoding(text):
    if isinstance(text, str):
        return text
    elif isinstance(text, bytes):
        try:
            return text.decode("utf8")
        except:
            return text.decode("iso8859-1")


def read_lob(lob):
    if not lob:
        return None
    db = __test_DB()
    return db._read_lob(lob)


class _Callable(object):

    def __init__(self, name):
        self._name = name
        self._implementor = None

    def __getattr__(self, name):
        return self.__class__("%s.%s" % (self._name, name))

    def __call__(self, *args):
        proc = self._implementor.__call__(self._name)
        return proc(*args)


class _Procedure(_Callable):

    def __init__(self, name):
        _Callable.__init__(self, name)
        self._implementor = Procedure


class _Function(_Callable):

    def __init__(self, name):
        _Callable.__init__(self, name)
        self._implementor = Function


class _CallableWrapper(object):

    def __init__(self, wrapped):
        self._wrapped = wrapped

    def __getattr__(self, x):
        return self._wrapped(x)

procedure = _CallableWrapper(_Procedure)
function = _CallableWrapper(_Function)
070701000001B2000081B40000000000000000000000015FBBE8EE000002FD000000000000000000000000000000000000002900000000spacewalk-backend/server/rhnSQL/const.py  #
# Copyright (c) 2008--2014 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

# Constants used to identify the supported database backends:
POSTGRESQL = "postgresql"

# Backend constants:
SUPPORTED_BACKENDS = set([POSTGRESQL])
   070701000001B3000081B40000000000000000000000015FBBE8EE000005C0000000000000000000000000000000000000002700000000spacewalk-backend/server/rhnSQL/dbi.py    #
# Copyright (c) 2008--2013 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

from .const import POSTGRESQL

# Map supported backend constants to a specific Python driver:
BACKEND_DRIVERS = {
    POSTGRESQL: "postgresql",
}


def get_database_module(backend=None):
    """Loads the database driver module, performing autodetection if needed"""

    # Assume Oracle if no backend is specified:
    if backend is None:
        driver = BACKEND_DRIVERS[POSTGRESQL]
    else:
        driver = BACKEND_DRIVERS[backend]

    driver_dir = "spacewalk.server.rhnSQL"
    driver_mod = "driver_" + driver
    try:
        module = __import__(driver_dir, globals(), locals(), [driver_mod])
        module = getattr(module, driver_mod)
    except ImportError:
        raise

    return module


def get_database_class(backend=None):
    """Returns the database class"""
    module = get_database_module(backend=backend)
    return module.Database
070701000001B4000081B40000000000000000000000015FBBE8EE00003372000000000000000000000000000000000000003500000000spacewalk-backend/server/rhnSQL/driver_postgresql.py  #
# Copyright (c) 2008--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
#
# Database driver for PostgreSQL
#

import sys
import string
import re
import psycopg2
import psycopg2.extras

# workaround for python-psycopg2 = 2.0.13 (RHEL6)
# which does not import extensions by default
if not hasattr(psycopg2, 'extensions'):
    import psycopg2.extensions

from . import sql_base
from rhn.UserDictCase import UserDictCase
from spacewalk.server import rhnSQL

from uyuni.common.usix import BufferType, raise_with_tb
from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.common.rhnException import rhnException
from .const import POSTGRESQL


def convert_named_query_params(query):
    """
    Convert a query with named parameters (i.e. :id, :name, etc) into one
    that uses %(id)s, %(name)s parameters instead.

    python-psycopg2 requires parameters to be in this form, so to keep our
    existing queries intact we'll convert them when provided to the
    postgresql driver.

    RETURNS: the new query with parameters replaced
    """
    log_debug(6, "Converting query for PostgreSQL: %s" % query)
    new_query = re.sub(r'(\W):(\w+)', r'\1%(\2)s', query.replace('%', '%%'))
    log_debug(6, "New query: %s" % new_query)
    return new_query


class Function(sql_base.Procedure):

    """
    Function implementation for PostgreSQL. As there is no support in the Python
    driver we use direct SQL.
    """

    def __init__(self, name, cursor, ret_type):
        sql_base.Procedure.__init__(self, name, cursor)
        self.ret_type = ret_type

    def __call__(self, *args):
        log_debug(2, self.name, args)

        # Buildup a string for the positional arguments to the procedure:
        positional_args = ""
        i = 1
        for arg in args:
            if len(positional_args) == 0:
                positional_args = "%s"
            else:
                positional_args = positional_args + ", %s"
            i += 1
        query = "SELECT %s(%s)" % (self.name, positional_args)

        log_debug(2, query, args)
        try:
            ret = self.cursor.execute(query, args)
        except psycopg2.Error:
            e = sys.exc_info()[1]
            error_code = 99999
            m = re.match('ERROR: +-([0-9]+)', e.pgerror)
            if m:
                error_code = int(m.group(1))
            raise sql_base.SQLSchemaError(error_code, e.pgerror, e)

        if self.ret_type is None:
            return ret
        else:
            return self.cursor.fetchone()[0]


class Procedure(Function):

    """
    PostgreSQL functions are somewhat different than stored procedures in
    other databases. As a result the python-pgsql does not even implement
    the Python DBI API callproc method.

    To workaround this and keep rhnSQL database independent, we'll translate
    any incoming requests to call a procedure into a PostgreSQL query.
    """

    def __init__(self, name, cursor):
        Function.__init__(self, name, cursor, None)
        self.ret_type = None

    def __call__(self, *args):
        result = Function.__call__(self, *args)
        # we do not expect any result (this is procedure)
        # if not (type(result) == 'tuple' and result[0] == ''):
        #raise rhnSQL.SQLError("Unexpected result returned by procedure %s: %s" % (self.name, str(result)))


def decimal2intfloat(dec, cursor):
    "Convert a Decimal to an int or a float with no loss of information."
    "The dec is passed in as str (not Decimal) so we cannot check its type."
    if dec is None:
        return None
    "If we can convert to int without loss of information, return int, float otherwise."
    try:
        if float(dec) == float(int(dec)):
            return int(dec)
        return float(dec)
    except ValueError:
        return float(dec)


class Database(sql_base.Database):

    """ Class for PostgreSQL database operations. """

    def __init__(self, host=None, port=None, username=None,
                 password=None, database=None, sslmode=None, sslrootcert=None):

        self.username = username
        self.password = password
        self.database = database
        self.sslmode = sslmode
        self.sslrootcert = sslrootcert

        # Minimum requirements to connect to a PostgreSQL db:
        if not (self.username and self.database):
            raise AttributeError("PostgreSQL requires at least a user and database name.")

        if host is None or host == '' or host == 'localhost':
            self.host = None
            self.port = None
        else:
            self.host = host
            self.port = port

        # pgsql module prefers -1 for an unspecified port:
        if not self.port:
            self.port = -1

        self.dbh = None

        sql_base.Database.__init__(self)

    def connect(self, reconnect=1):
        try:
            dsndata = {
                'dbname': self.database,
                'user': self.username,
                'password': self.password}
            if self.host is not None:
                dsndata['host'] = self.host
                dsndata['port'] = self.port
            if self.sslmode is not None and self.sslmode == 'verify-full' and self.sslrootcert is not None:
                dsndata['sslmode'] = self.sslmode
                dsndata['sslrootcert'] = self.sslrootcert
            elif self.sslmode is not None:
                raise AttributeError("Only sslmode=\"verify-full\" (or None) is supported.")
            if self.sslmode is not None and self.sslrootcert is None:
                raise AttributeError("Attribute sslrootcert needs to be set if sslmode is set.")

            self.dbh = psycopg2.connect(" ".join("%s=%s" % (k, re.escape(str(v))) for k, v in list(dsndata.items())))

            # convert all DECIMAL types to float (let Python to choose one)
            DEC2INTFLOAT = psycopg2.extensions.new_type(psycopg2._psycopg.DECIMAL.values,
                                                        'DEC2INTFLOAT', decimal2intfloat)
            psycopg2.extensions.register_type(DEC2INTFLOAT)
        except psycopg2.Error:
            e = sys.exc_info()[1]
            if reconnect > 0:
                # Try one more time:
                return self.connect(reconnect=reconnect - 1)

            # Failed reconnect, time to error out:
            raise_with_tb(sql_base.SQLConnectError(
                self.database, e.pgcode, e.pgerror,
                "All attempts to connect to the database failed"), sys.exc_info()[2])

    def is_connected_to(self, backend, host, port, username, password,
                        database, sslmode, sslrootcert):
        if host is None or host == '' or host == 'localhost':
            host = None
            port = None
        if not port:
            port = -1
        return (backend == POSTGRESQL) and (self.host == host) and \
               (self.port == port) and (self.username == username) and \
               (self.password == password) and (self.database == database) and \
               (self.sslmode == sslmode) and (self.sslrootcert == sslrootcert)

    def check_connection(self):
        try:
            c = self.prepare("select 1")
            c.execute()
        except:  # try to reconnect, that one MUST WORK always
            log_error("DATABASE CONNECTION TO '%s' LOST" % self.database,
                      "Exception information: %s" % sys.exc_info()[1])
            self.connect()  # only allow one try

    def prepare(self, sql, force=0, blob_map=None):
        return Cursor(dbh=self.dbh, sql=sql, force=force, blob_map=blob_map)

    def execute(self, sql, *args, **kwargs):
        cursor = self.prepare(sql)
        cursor.execute(*args, **kwargs)
        return cursor

    def transaction(self, name):
        if not name:
            raise rhnException("Can not set a transaction without a name", name)
        c = self.prepare("savepoint %s" % name)
        return c.execute()

    def commit(self):
        if self.dbh is not None:
            self.dbh.commit()

    def rollback(self, name=None):
        if name:
            c = self.prepare("rollback to %s" % name)
            return c.execute()
        else:
            return self.dbh.rollback()

    def procedure(self, name):
        c = self.dbh.cursor()
        # Pass the cursor in so we can close it after execute()
        return Procedure(name, c)

    def _function(self, name, ret_type):
        c = self.dbh.cursor()
        return Function(name, c, ret_type)

    def cursor(self):
        return Cursor(dbh=self.dbh)

    def _read_lob(self, lob):
        return bytes(lob)


class Cursor(sql_base.Cursor):

    """ PostgreSQL specific wrapper over sql_base.Cursor. """

    def __init__(self, dbh=None, sql=None, force=None, blob_map=None):

        sql_base.Cursor.__init__(self, dbh, sql, force)
        self.blob_map = blob_map

        # Accept Oracle style named query params, but convert for python-pgsql
        # under the hood:
        temp_sql = ""
        if self.sql is not None:
            temp_sql = self.sql
        self.sql = convert_named_query_params(temp_sql)

    def _prepare_sql(self):
        cursor = self.dbh.cursor()
        return cursor

    def _execute_wrapper(self, function, *p, **kw):
        params = ','.join(["%s: %s" % (key, value) for key, value
                           in list(kw.items())])
        log_debug(5, "Executing SQL: \"%s\" with bind params: {%s}"
                  % (self.sql, params))
        if self.sql is None:
            raise rhnException("Cannot execute empty cursor")
        if self.blob_map:
            for blob_var in list(self.blob_map.keys()):
                if isinstance(kw[blob_var], str):
                    kw[blob_var] = BufferType(kw[blob_var].encode())
                else:
                    kw[blob_var] = BufferType(kw[blob_var])

        try:
            retval = function(*p, **kw)
        except psycopg2.InternalError:
            e = sys.exc_info()[1]
            error_code = 99999
            m = re.match('ERROR: +-([0-9]+)', e.pgerror)
            if m:
                error_code = int(m.group(1))
            raise sql_base.SQLSchemaError(error_code, e.pgerror, e)
        except psycopg2.ProgrammingError:
            e = sys.exc_info()[1]
            raise sql_base.SQLStatementPrepareError(str(self.dbh), e.pgerror, self.sql)
        except KeyError:
            e = sys.exc_info()[1]
            raise sql_base.SQLError("Unable to bound the following variable(s): %s"
                                    % (" ".join(e.args)))
        return retval

    def _execute_(self, args, kwargs):
        """
        PostgreSQL specific execution of the query.
        """
        params = UserDictCase(kwargs)
        try:
            self._real_cursor.execute(self.sql, params)
        except psycopg2.OperationalError:
            e = sys.exc_info()[1]
            raise sql_base.SQLError("Cannot execute SQL statement: %s" % str(e))

        self.description = self._real_cursor.description
        return self._real_cursor.rowcount

    def _executemany(self, *args, **kwargs):
        if not kwargs:
            return 0

        params = UserDictCase(kwargs)

        # First break all the incoming keyword arg lists into individual
        # hashes:
        all_kwargs = []
        for key in list(params.keys()):
            if len(all_kwargs) < len(params[key]):
                for i in range(len(params[key])):
                    all_kwargs.append({})

            i = 0
            for val in params[key]:
                all_kwargs[i][key] = val
                i = i + 1

        psycopg2.extras.execute_batch(self._real_cursor, self.sql, all_kwargs)
        self.description = self._real_cursor.description

    def _execute_values(self, sql, argslist, template=None, page_size=1000, fetch=True):
        results = psycopg2.extras.execute_values(self._real_cursor, sql, argslist, template=template, page_size=page_size, fetch=fetch)
        self.description = self._real_cursor.description
        return results

    def update_blob(self, table_name, column_name, where_clause, data,
                    **kwargs):
        """
        PostgreSQL uses bytea columns instead of blobs. Nothing special
        needs to be done to insert text into one.
        """
        # NOTE: Injecting a :column_name parameter here
        sql = "UPDATE %s SET %s = :%s %s" % (table_name, column_name,
                                             column_name, where_clause)
        c = rhnSQL.prepare(sql)
        kwargs[column_name] = data
        c.execute(**kwargs)

    def close(self):
        pass
  070701000001B5000081B40000000000000000000000015FBBE8EE00002B65000000000000000000000000000000000000002C00000000spacewalk-backend/server/rhnSQL/sql_base.py   #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# This file defines the base classes for the objects and classes used
# by the generic SQL interfaces so we can make sure that all backends
# adhere and provide the same API to the generic layer
#
# This file provides a skeleton defnition of functions RHN uses and
# expects to be available. The interface drivers should only inherit
# from the Database class and feel free to use their own cursors,
# provided they make available the methods defined by the Cursor
# class.
#

import sys
from . import sql_types
from uyuni.common import usix


def ociDict(names=None, row=None):
    """ Create a dictionary from a row description and its values. """
    data = {}
    if not names:
        raise AttributeError("Class initialization requires a description hash")
    if row is None:
        return data
    for x in range(len(names)):
        name, value = __oci_name_value(names[x], row[x])
        data[name] = value
    return data


def __oci_name_value(names, value):
    """ Extract the name, value pair needed by ociDict function. """
    # the format of the names is
    name, dbitype, dsize, dbsize, prec, scale, nullok = names
    name = name.lower()
    return name, value


# this is for when an execute statement went bad...
class SQLError(Exception):
    pass


# other Schema Errors
class SQLSchemaError(SQLError):

    def __init__(self, errno, errmsg, *args):
        self.errno = errno
        (self.errmsg, errmsg) = errmsg.split('\n', 1)
        SQLError.__init__(self, self.errno, self.errmsg, errmsg, *args)


# SQL connect error
class SQLConnectError(SQLError):

    def __init__(self, db, errno, errmsg, *args):
        self.db = db
        self.errno = errno
        self.errmsg = errmsg
        SQLError.__init__(self, errno, errmsg, db, *args)


# Cannot prepare statement
class SQLStatementPrepareError(SQLError):

    def __init__(self, db, errmsg, *args):
        self.db = db
        self.errmsg = errmsg
        SQLError.__init__(self, errmsg, db, *args)


class ModifiedRowError(SQLError):
    pass


class Cursor:

    """ A class to implement generic SQL Cursor operations. """

    # The cursor cache is a hash of:
    #   id(dbh) as keys
    #   hash with the sql statement as a key and the cursor as a value
    _cursor_cache = {}

    def __init__(self, dbh=None, sql=None, force=None):
        self.sql = sql
        self.dbh = dbh

        self.reparsed = 0
        self._real_cursor = None
        self._dbh_id = id(dbh)

        self.description = None

        if self._dbh_id not in self._cursor_cache:
            self._cursor_cache[self._dbh_id] = {}

        # Store a reference to the underlying Python DB API Cursor:
        self._real_cursor = self._prepare(force=force)

    def _prepare_sql(self):
        raise NotImplementedError()

    def _prepare(self, force=None):
        if self.sql:
            # Check the cache
            _h = self._cursor_cache[self._dbh_id]
            if not force and self.sql in _h:
                return _h[self.sql]
        cursor = self._prepare_sql()
        if self.sql:
            _h[self.sql] = cursor
        return cursor

    def prepare(self, sql, force=None):
        """
        Prepares the current statement.

        Must be called prior to execute even if the underlying database driver
        does not support an explicit prepare before execution.
        """
        if sql is None:
            raise Exception("XXX Unable to prepare None")
        self.sql = sql
        self._real_cursor = self._prepare(force=force)

    def update_blob(self, table_name, column_name, where_clause,
                    data, **kwargs):
        """
        Abstraction for the update of a blob column which can vary wildly
        between different database implementations.
        """
        raise NotImplementedError()

    def execute(self, *p, **kw):
        """ Execute a single query. """
        return self._execute_wrapper(self._execute, *p, **kw)

    def executemany(self, *p, **kw):
        """
        Execute a query multiple times with different data sets.

        Call with keyword arguments mapping to ordered lists.
        i.e. cursor.executemany(id=[1, 2], name=["Bill", "Mary"])
        """
        self._execute_wrapper(self._executemany, *p, **kw)

    def execute_values(self, sql, argslist, template=None, page_size=1000, fetch=True):
        """
        Execute a query with a potentially-long VALUEs list. This method will split the query up in page_size
        chunks. Use a %s placeholder where the VALUE list goes.
        """
        return self._execute_wrapper(self._execute_values, sql, argslist, template, page_size, fetch)

    def _execute_wrapper(self, function, *p, **kw):
        """
        Database specific execute wrapper. Mostly used just to catch DB
        exceptions and wrap them.

        Must be subclasses by database specific drivers.
        """
        raise NotImplementedError()

    def _execute(self, *args, **kwargs):
        if kwargs:
            val = list(kwargs.values())[0]
            if self._is_sequence_type(val):
                sys.stderr.write("WARNING: calling execute with named bound arrays\n")
        return self._execute_(args, kwargs)

    def _executemany(self, *args, **kwargs):
        raise NotImplementedError()

    def _execute_values(self, *args, **kwargs):
        raise NotImplementedError()

    def _execute_(self, args, kwargs):
        """ Database specific execution of the query. """
        raise NotImplementedError()

    # DATA RETRIEVAL
    # Please note: these functions return None if no data is available,
    # not an empty tuple or a list of empty tuples, or an empty list
    # or any other combination you can imagine with the word "empty" in it.
    def fetchone(self):
        return self._real_cursor.fetchone()

    def fetchall(self):
        rows = self._real_cursor.fetchall()
        return rows

    def fetchone_dict(self):
        """
        Return a dictionary for the row returned mapping column name to
        it's value.
        """
        ret = ociDict(self.description, self._real_cursor.fetchone())

        if len(ret) == 0:
            return None
        return ret

    def fetchall_dict(self):
        """
        Fetch all rows as a list of dictionaries.
        """
        rows = self._real_cursor.fetchall()

        ret = []
        for x in rows:
            d = ociDict(self.description, x)
            if len(d) > 0:
                ret.append(d)
        if ret == []:
            return None
        return ret

    def _is_sequence_type(self, val):
        if type(val) in (usix.ListType, usix.TupleType):
            return 1
        return 0


class Procedure:

    """
    Class for calling out to stored procedures.

    Written to behave very much like a Python function in that these
    Procedure objects are "callable".

    See database specific implementations for more details.
    """

    def __init__(self, name, cursor):
        self.name = name
        self.cursor = cursor

    def __del__(self):
        if self.cursor:
            self.cursor.close()
            self.cursor = None


class Database:

    """
    Base class for handling database operations.

    Inherited from by the backend specific classes for Oracle, PostgreSQL, etc.
    """
    _procedure_class = Procedure
    TimestampFromTicks = None

    def __init__(self):
        pass

    def connect(self, reconnect=1):
        """ Opens a connection to the database. """
        raise NotImplementedError()

    def check_connection(self):
        """ Check that this connection is still valid. """
        # Delegates to sub-classes as this is usually done with a DB specific
        # query:
        raise NotImplementedError()

    def prepare(self, sql, force=0):
        """ Prepare an SQL statement. """
        raise NotImplementedError()

    def commit(self):
        """ Commit changes """
        raise NotImplementedError()

    def procedure(self, name):
        """Return a pointer to a callable instance for a given stored
        procedure.
        The return value is a (possibly modified) copy of the arguments passed
        in. see cx_Oracle's Cursor.callproc for more details"""
        return self._procedure_class(name, None)

        return self._procedure_class(name, None)

    def function(self, name, ret_type):
        """
        Return a pointer to a callable instance for a given stored
        function.

        The return value is the return value of the function.
        One has to properly define the return type for the function, since
        usually the database drivers do not allow for auto-discovery.
        See cx_Oracle's Cursor.callfunc for more details.
        """
        if not isinstance(ret_type, sql_types.DatabaseDataType):
            raise SQLError("Invalid return type specified", ret_type)
        return self._function(name, ret_type)

    def _function(self, name, ret_type):
        raise NotImplementedError()

    def transaction(self, name):
        "set a transaction point to which we can rollback to"
        pass

    def rollback(self, name=None):
        "rollback changes, optionally to a previously set transaction point"
        pass

    def close(self):
        "Close the connection"
        pass

    def cursor(self):
        "return an empty Cursor object"
        return Cursor()

    def _fix_environment_vars(self):
        "Fix environment variables (to be redefined in subclasses)"
        pass

    def _read_lob(self, lob):
        "Reads a lob's contents"
        return None

    def is_connected_to(self, backend, host, port, username, password,
                        database, sslmode):
        """
        Check if this database matches the given connection parameters.
        """
        raise NotImplementedError()

    def Date(self, year, month, day):
        "Returns a Date object"
        raise NotImplementedError()

    def DateFromTicks(self, ticks):
        "Returns a Date object"
        raise NotImplementedError()


# Class that we use just as a markup for queries/statements; if the statement
# is available upon import, we can automatically check for the statements'
# correctness
class Statement:

    def __init__(self, statement):
        self.statement = statement

    def __repr__(self):
        return "<%s instance at %s; statement=%s" % (
            self.__class__, id(self), self.statement)

    def __str__(self):
        return self.statement
   070701000001B6000081B40000000000000000000000015FBBE8EE000007B8000000000000000000000000000000000000002B00000000spacewalk-backend/server/rhnSQL/sql_lib.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# A collection of classes and functions for handy data manipulation
# This file includes common classes and functions that are used by
# misc parts of the RHN backend
#
# Before changing any of this stuff, please grep through the sources to
# check how the function/class you are about to modify is used first.
# Or ask gafton.
#

import string


def build_sql_insert(table, hash_name, items):
    """ This statement builds a sql statement for an insert
        of 'items' into "table" indexed by "hash_name"
    """
    sql = "insert into %s ( %s, %s ) values ( :p0, %s )" % (
        table, hash_name,
        ", ".join([a[0] for a in items]),
        ", ".join([":p_%s" % a[0] for a in items]))
    pdict = {"p0": None}  # This must be reset after we return from this call
    list(map(pdict.update, [{"p_%s" % a[0]: a[1]} for a in items]))
    return sql, pdict


def build_sql_update(table, hash_name, items):
    """ This statement builds a sql statement for an update
        of 'items' into "table" indexed by "hash_name"
    """
    sql = "update %s set %s where %s = :p0" % (
        table,
        ", ".join(["%s = :p_%s" % (a, a) for a in [a[0] for a in items]]),
        hash_name)
    pdict = {"p0": None}  # This must be reset after we return from this call
    list(map(pdict.update, [{"p_%s" % a[0]: a[1]} for a in items]))
    return sql, pdict
070701000001B7000081B40000000000000000000000015FBBE8EE0000132E000000000000000000000000000000000000002B00000000spacewalk-backend/server/rhnSQL/sql_row.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# a class used to handle a row of data in a particular table
#

import string

from rhn.UserDictCase import UserDictCase
from spacewalk.common.rhnException import rhnException

from . import sql_base
from . import sql_lib


class Row(UserDictCase):

    """ This class allows one to work with the columns of a particular row in a more
        convenient manner (ie, using a disctionary interface). It allows for the row
        data to be loaded and saved and is generally easier to use than the Table
        class which is really designed for bulk updates and stuff like that.

        The easiest way to separate what these things are for is to remember that
        the Table class indexes by KEY, while the Row class indexes by column
    """

    def __init__(self, db, table, hashname, hashval=None):
        UserDictCase.__init__(self)
        if not isinstance(db, sql_base.Database):
            raise rhnException("Argument db is not a database instance", db)
        self.db = db
        self.table = table
        self.hashname = hashname.lower()

        # and the data dictionary
        self.data = {}
        # is this a real entry (ie, use insert or update)
        self.real = 0
        if hashval is not None:  # if we have to load an entry already...
            self.load(hashval)

    def __repr__(self):
        return "<%s instance at 0x%0x on (%s, %s, %s)>" % (
            self.__class__.__name__, abs(id(self)),
            self.table, self.hashname, self.get(self.hashname))
    __str__ = __repr__

    def __setitem__(self, name, value):
        """ make it work like a dictionary """
        x = name.lower()
        # forbid setting the value of the hash column because of the
        # ambiguity of the operation (is it a "save as new id" or
        # "load from new id"?). We provide interfaces for load, save
        # and create instead.
        if x == self.hashname:
            raise AttributeError("Can not reset the value of the hash key")
        if x not in self.data or self.data[x][0] != value:
            self.data[x] = (value, 1)

    def __getitem__(self, name):
        x = name.lower()
        if x in self.data:
            return self.data[x][0]
        raise KeyError("Key %s not found in the Row dictionary" % name)

    def get(self, name):
        x = name.lower()
        if x in self.data:
            return self.data[x][0]
        return None

    def reset(self, val=0):
        """ reset the changed status for these entries """
        for k, v in list(self.data.items()):
            # tuples do not support item assignement
            self.data[k] = (v[0], val)

    def create(self, hashval):
        """ create it as a new entry """
        self.data[self.hashname] = (hashval, 0)
        self.real = 0
        self.save()

    def load(self, hashval):
        """ load an entry """
        return self.load_sql("%s = :hashval" % self.hashname, {'hashval': hashval})

    def load_sql(self, sql, pdict={}):
        """ load from a sql clause """
        h = self.db.prepare("select * from %s where %s" % (self.table, sql))
        h.execute(**pdict)
        ret = h.fetchone_dict()
        self.data = {}
        if not ret:
            self.real = 0
            return 0
        for k, v in list(ret.items()):
            self.data[k] = (v, 0)
        self.real = 1
        return 1

    def save(self, with_updates=1):
        """ now save an entry """
        if self.hashname not in self.data:
            raise AttributeError("Table does not have a hash `%s' key" % self.hashname)
        # get a list of fields to be set
        items = [(a[0], a[1][0]) for a in [b for b in list(self.data.items()) if b[1][1] == 1]]
        if not items:  # if there is nothing for us to do, avoid doing it.
            return
        # and now build the SQL statements
        if self.real:  # Update
            if not with_updates:
                raise sql_base.ModifiedRowError()
            sql, pdict = sql_lib.build_sql_update(self.table, self.hashname, items)
        else:
            sql, pdict = sql_lib.build_sql_insert(self.table, self.hashname, items)
        h = self.db.prepare(sql)
        pdict["p0"] = self.data[self.hashname][0]
        # and now do it
        h.execute(**pdict)
        self.real = 1
        return
  070701000001B8000081B40000000000000000000000015FBBE8EE00000747000000000000000000000000000000000000003000000000spacewalk-backend/server/rhnSQL/sql_sequence.py   #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# This file implements teh Sequence class
#

from spacewalk.common.rhnException import rhnException

from . import sql_base


# A class to handle sequences
# XXX: this is still Oracle specific, but it shouldn't be
class Sequence:

    def __init__(self, db, seq):
        if not seq or not isinstance(seq, str):
            raise rhnException("First argument needs to be a sequence name", seq)
        self.__seq = seq
        if not isinstance(db, sql_base.Database):
            raise rhnException("Argument db is not a database instance", db)
        self.__db = db

    def next(self):
        sql = "select sequence_nextval('%s') as ID from dual" % self.__seq
        cursor = self.__db.prepare(sql)
        cursor.execute()
        ret = cursor.fetchone_dict()
        if ret is None:  # how the hell can this happen?
            return ret
        return int(ret['id'])

    def next_many(self, n):
        sql = "SELECT sequence_nextval('%s') FROM generate_series(1, %s)" % (self.__seq, n)
        cursor = self.__db.prepare(sql)
        cursor.execute()
        result = cursor.fetchall()
        return [r[0] for r in result]

    def __call__(self):
        return self.next()

    def __del__(self):
        self.__seq = self.__db = None
 070701000001B9000081B40000000000000000000000015FBBE8EE00002455000000000000000000000000000000000000002D00000000spacewalk-backend/server/rhnSQL/sql_table.py  #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# classes definitions for working with a sql table
#
#

import string

from rhn.UserDictCase import UserDictCase
from spacewalk.common.rhnException import rhnException

from . import sql_base
from . import sql_lib


# A class to handle row updates transparently
class RowData(UserDictCase):

    def __init__(self, dict, db, sql, rowid, cache=None):
        UserDictCase.__init__(self, dict)
        if not isinstance(db, sql_base.Database):
            raise TypeError("Second argument needs to be a database handle")
        self.__db = db
        self.__sql = sql
        self.__rowid = rowid
        self.__cache = cache

    # now the real function that supports updating
    def __setitem__(self, key, value):
        sql = self.__sql % key
        h = self.__db.prepare(sql)
        h.execute(new_val=value, row_id=self.__rowid)
        # keep self.data in sync
        self.data[key] = value
        if self.__cache:  # maintain cache consistency
            try:
                self.__cache[self.__rowid][key] = value
            except:
                pass


# A class to handle operations on a table.
#
# While this class allows you to perform queries and updates on a row
# within a table, it is recommended you use the Row class if you ever
# need to touch a single row of data. On the other hand, if you need
# to jump a lot in the table from one row to another this class is
# more efficient because it works as a hash of hashes, if you will...
#
# Some day we'll figure out how to reduce confusion...
class Table:

    def __init__(self, db, table, hashid, cache=False):
        if not table or not isinstance(table, str):
            raise rhnException("First argument needs to be a table name",
                               table)
        self.__table = table
        if not hashid or not isinstance(hashid, str):
            raise rhnException("Second argument needs to be the name of the unique index column",
                               hashid)
        self.__hashid = hashid
        if not isinstance(db, sql_base.Database):
            raise rhnException("Argument db is not a database instance", db)
        self.__db = db
        self.__cache = None
        if cache:
            self.__cache = {}

    def set_cache(self, value):
        if not value:
            self.__cache = None
            return
        if self.__cache is not None:  # already enabled
            return
        self.__cache = {}

    # insert row(s) into the table
    def insert(self, rows):
        # insert a single row into the table
        def insert_row(row, self=self):
            if self.__cache is not None:
                self.__cache[row[self.__hashid]] = row
            return self.__setitem__(None, row)
        if isinstance(rows, dict) or isinstance(rows, UserDictCase):
            return insert_row(rows)
        if isinstance(rows, list):
            for x in rows:
                insert_row(x)
            return None
        raise rhnException("Invalid data %s passed" % type(rows), rows)

    # select from the whole table all the entries that match the
    # valuies of the hash provided (kind of a complex select)
    def select(self, row):
        if not isinstance(row, dict) and not isinstance(row, UserDictCase):
            raise rhnException("Expecting hash argument. %s is invalid" % type(row),
                               row)
        if row == {}:
            raise rhnException("The hash argument is empty", row)
        keys = list(row.keys())
        # Sort the list of keys, to always get the same list of arguments
        keys.sort()
        args = []
        for col in keys:
            if row[col] in (None, ''):
                clause = "%s is null" % col
            else:
                clause = "%s = :%s" % (col, col)
            args.append(clause)
        sql = "select * from %s where " % self.__table
        cursor = self.__db.prepare(sql + " and ".join(args))
        cursor.execute(**row)
        rows = cursor.fetchall_dict()
        if rows is None:
            return None
        # fill up the cache
        if self.__cache is not None:
            for row in rows:
                self.__cache[row[self.__hashid]] = row
        return [UserDictCase(a) for a in rows]

    # print it out
    def __repr__(self):
        return "<%s> instance for table `%s' keyed on `%s'" % (
            self.__class__, self.__table, self.__hashid)

    # make this table look like a dictionary
    def __getitem__(self, key):
        if self.__cache and key in self.__cache:
            return self.__cache[key]
        h = self.__db.prepare("select * from %s where %s = :p1" % (
            self.__table, self.__hashid))
        h.execute(p1=key)
        ret = h.fetchone_dict()
        if ret is None:
            if self.__cache is not None:
                self.__cache[key] = None
            return None
        xret = UserDictCase(ret)
        if self.__cache is not None:
            self.__cache[key] = xret
        return xret

    # this one is pretty much like __getitem__, but returns a nice
    # reference to a RowData instance that allows the returned hash to
    # be modified.
    def get(self, key):
        ret = self.__getitem__(key)
        if self.__cache and key in self.__cache:
            del self.__cache[key]
        sql = "update %s set %%s = :new_val where %s = :row_id" % (
            self.__table, self.__hashid)
        return RowData(ret, self.__db, sql, key, self.__cache)

    # database insertion, dictionary style (pass in the hash with the
    # values for all columns except the one that functions as the
    # primary key identifier
    def __setitem__(self, key, value):
        if not isinstance(value, dict) and not isinstance(value, UserDictCase):
            raise TypeError("Expected value to be a hash")
        if self.__hashid in value:  # we don't need that
            if key is None:
                key = value[self.__hashid]
            del value[self.__hashid]

        if key is None:
            raise KeyError("Can not insert entry with NULL key")
        items = list(value.items())
        if items == []:  # quick check for noop
            return
        sql = None
        if self.has_key(key):
            sql, pdict = sql_lib.build_sql_update(self.__table, self.__hashid, items)
        else:
            sql, pdict = sql_lib.build_sql_insert(self.__table, self.__hashid, items)
        # import the value of the hash key
        pdict["p0"] = key
        h = self.__db.prepare(sql)
        h.execute(**pdict)
        try:
            value[self.__hashid] = key
            self.__cache[key] = value
        except:
            pass

    # length
    def __len__(self):
        h = self.__db.prepare("select count(*) as ID from %s" % self.__table)
        h.execute()
        row = h.fetchone_dict()
        if row is None:
            return 0
        return int(row["id"])

    # delete an entry by the key
    def __delitem__(self, key):
        h = self.__db.prepare("delete from %s where %s = :p1" % (
            self.__table, self.__hashid))
        h.execute(p1=key)
        try:
            del self.__cache[key]
        except:
            pass
        return 0

    # get all keys
    def keys(self):
        h = self.__db.prepare("select %s as NAME from %s" % (
            self.__hashid, self.__table))
        h.execute()
        data = h.fetchall_dict()
        if data is None:
            return []
        return [a["name"] for a in data]

    # has_key
    # if we're caching, fetch the row and cache it; else, fetch the
    # smaller value
    def has_key(self, key):
        if self.__cache is not None:
            h = self.__db.prepare("select * from %s where %s = :p1" %
                                  (self.__table, self.__hashid))
        else:
            h = self.__db.prepare("select %s from %s where %s = :p1" %
                                  (self.__hashid, self.__table, self.__hashid))
        h.execute(p1=key)
        row = h.fetchone_dict()
        if not row:
            return 0
        # stuff it in the cache if we need to do so
        if self.__cache is not None:
            self.__cache[key] = row
        # XXX: can this thing fail in any other way?
        return 1

    # flush the cache. if cache is off, then noop
    def flush(self):
        if self.__cache is not None:  # avoid turning caching on when flushing
            self.__cache = {}

    # passthrough commit
    def commit(self):
        return self.__db.commit()

    # passthrough rollback
    def rollback(self):
        self.flush()
        return self.__db.rollback()

    def printcache(self):
        print(self.__cache)
        return
   070701000001BA000081B40000000000000000000000015FBBE8EE000005B9000000000000000000000000000000000000002D00000000spacewalk-backend/server/rhnSQL/sql_types.py  #
# Copyright (c) 2008--2013 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Database types we support for out variables
#


# Data types
class DatabaseDataType:
    type_name = None

    def __init__(self, value=None, size=None):
        self.size = size or 1
        self.set_value(value)

    def get_value(self):
        return self.value

    def set_value(self, value):
        self.value = value

    def __str__(self):
        return self.type_name


class NUMBER(DatabaseDataType):
    type_name = "NUMBER"


class STRING(DatabaseDataType):
    type_name = "STRING"

    def __init__(self, value=None, size=None):
        DatabaseDataType.__init__(self, value=value, size=size)
        if not size:
            self.size = 4000


class BINARY(DatabaseDataType):
    type_name = "BINARY"


class LONG_BINARY(DatabaseDataType):
    type_name = "LONG_BINARY"

# XXX More data types to be added as we find need for them
   070701000001BB000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002300000000spacewalk-backend/server/rhnServer    070701000001BC000081B40000000000000000000000015FBBE8EE00000177000000000000000000000000000000000000002C00000000spacewalk-backend/server/rhnServer/Makefile   # Makefile for the rhnServer module
#

TOP     = ../..
SUBDIR	= server/rhnServer

SPACEWALK_FILES	= __init__ server_certificate server_hardware \
	  server_packages server_history server_class \
	  server_class server_wrapper server_lib server_route server_token \
          satellite_cert server_kickstart search_notify \
          server_suse

include $(TOP)/Makefile.defs
 070701000001BD000081B40000000000000000000000015FBBE8EE00000962000000000000000000000000000000000000002F00000000spacewalk-backend/server/rhnServer/__init__.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# Module for handling the rhnServer objects.
#


# these are pretty much the only entry points
from uyuni.common.usix import StringType, UnicodeType
from spacewalk.common.rhnException import rhnFault
from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.server import rhnUser

# Local imports
from .server_class import Server
from .server_certificate import Certificate
from .server_token import fetch_token, fetch_org_token


def get(system_id, load_user=1):
    """ retrieve the server with matching certificate from the database """
    log_debug(3, "load_user = %s" % load_user)
    # This has to be a string
    if not isinstance(system_id, (StringType, UnicodeType)):
        return None
    # Try to initialize the certificate object
    cert = Certificate()
    if not cert.reload(system_id) == 0:
        return None
    # if invalid, stop here
    if not cert.valid():
        return None

    # this looks like a real server
    server = Server(None)
    # and load it up
    if not server.loadcert(cert, load_user) == 0:
        return None
    # okay, it is a valid certificate
    return server


def search(server_id, username=None):
    """ search for a server in the database and return the Server object """
    log_debug(3, server_id, username)
    s = Server(None)
    if not s.reload(server_id) == 0:
        log_error("Reloading server id %d failed" % server_id)
        # we can't say that the server is not really found
        raise rhnFault(20)
    # now that it is reloaded, fix up the s.user field
    if username:
        s.user = rhnUser.search(username)
    return s


def search_token(token):
    log_debug(3, token)
    return fetch_token(token)


def search_org_token(org_id):
    log_debug(3, org_id)
    return fetch_org_token(org_id)
  070701000001BE000081B40000000000000000000000015FBBE8EE00001B78000000000000000000000000000000000000003500000000spacewalk-backend/server/rhnServer/satellite_cert.py  #
# Copyright (c) 2008--2013 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# This module exposes the SatelliteCert class, used for parsing a satellite
# certificate
#

import sys
from xml.dom.minidom import parseString
from xml.sax import SAXParseException


class ParseException(Exception):
    pass


# Generic class to represent items (like channel families)
class Item:
    # pylint: disable=R0903

    # Name to be displayed by repr()
    pretty_name = None
    # Attribute name in the parent class
    attribute_name = None
    # Mapping from XML to local storage
    attributes = {}

    def __init__(self, node=None):
        if not node:
            return
        for attr_name, storage_name in list(self.attributes.items()):
            attr = node.getAttribute(attr_name)
            # Make sure we stringify the attribute - it may get out as unicode
            setattr(self, storage_name, attr)

    def __repr__(self):
        return "<%s; %s>" % (self.pretty_name,
                             ', '.join(
                                 ['%s="%s"' % (x, getattr(self, x)) for x in list(self.attributes.values())]
                             ))


class ChannelFamily(Item):
    # pylint: disable=R0903

    pretty_name = "channel family"
    attribute_name = 'channel_families'
    attributes = {'family': 'name', 'quantity': 'quantity', 'flex': 'flex'}


class Slots:
    _db_label = None
    _slot_name = None

    def __init__(self, quantity):
        self.quantity = quantity

    def get_quantity(self):
        return self.quantity

    def get_db_label(self):
        """Returns the label of this type of slot in the database"""
        return self._db_label

    def get_slot_name(self):
        """Returns the name of the slot, used by
        rhn_entitlements.modify_org_service"""
        return self._slot_name


class ManagementSlots(Slots):
    _db_label = 'enterprise_entitled'
    _slot_name = 'enterprise'


class ProvisioningSlots(Slots):
    _db_label = 'provisioning_entitled'
    _slot_name = 'provisioning'

# Slots for virt entitlements support


class VirtualizationSlots(Slots):
    _db_label = 'virtualization_host'
    _slot_name = 'virtualization'


class VirtualizationPlatformSlots(Slots):
    _db_label = 'virtualization_host_platform'
    _slot_name = 'virtualization_platform'

# NonLinux slots are gone - misa 20050527


class MonitoringSlots(Slots):
    _db_label = 'monitoring_entitled'
    _slot_name = 'monitoring'


class SatelliteCert:

    """Satellite certificate class
    Usage:
    c = SatelliteCert()
    c.load('<rhn-cert><rhn-cert-field name="owner">John Doe</rhn-cert-field></rhn-cert>')
    print c.owner
    """

    fields_scalar = ['product', 'owner', 'issued', 'expires', 'slots',
                     'provisioning-slots', 'nonlinux-slots',
                     'monitoring-slots', 'virtualization_host',
                     'virtualization_host_platform', 'satellite-version',
                     'generation', ]
    fields_list = {'channel-families': ChannelFamily}

    # datesFormat_cert = '%a %b %d %H:%M:%S %Y' ## OLD CERT FORMAT
    datesFormat_cert = '%Y-%m-%d %H:%M:%S'
    datesFormat_db = '%Y-%m-%d %H:%M:%S'

    def __init__(self):
        for f in self.fields_scalar:
            setattr(self, f, None)
        for f in list(self.fields_list.values()):
            setattr(self, f.attribute_name, [])
        self.signature = None
        self._slots = {}
        self._root = None

    def load(self, s):
        try:
            self._load(s)
        except SAXParseException:
            raise ParseException(None, sys.exc_info()[2])
        # Now represent the slots in a more meaningful way
        self._slots.clear()
        for slot_name, (slot_attr, factory) in list(self._slot_maps.items()):
            quantity = getattr(self, slot_attr)
            self._slots[slot_name] = factory(quantity)

        return self

    def _load(self, s):
        dom_element = parseString(s)
        certs = dom_element.getElementsByTagName("rhn-cert")
        if not certs:
            self._root = None
        else:
            self._root = certs[0]
        for child in self._root.childNodes:
            if child.nodeType != child.ELEMENT_NODE:
                # Probably white space
                continue
            if child.nodeName == 'rhn-cert-field':
                field_name = child.getAttribute("name")
                if not field_name:
                    # XXX Bogus
                    continue
                if field_name in self.fields_scalar:
                    val = get_text(child)
                    if not val:
                        continue
                    setattr(self, field_name, val)
                    continue
                if field_name in self.fields_list:
                    val = self.fields_list[field_name](child)
                    l = getattr(self, val.attribute_name)
                    l.append(val)
            elif child.nodeName == 'rhn-cert-signature':
                self.signature = get_text(child)
        # Python's docs say: When you are finished with a DOM, you should
        # clean it up. This is necessary because some versions of Python do
        # not support garbage collection of objects that refer to each other
        # in a cycle. Until this restriction is removed from all versions of
        # Python, it is safest to write your code as if cycles would not be
        # cleaned up.
        dom_element.unlink()

    _slot_maps = {
        'management': ('slots', ManagementSlots),
        'provisioning': ('provisioning-slots', ProvisioningSlots),
        'monitoring': ('monitoring-slots', MonitoringSlots),
        'virtualization': ('virtualization_host', VirtualizationSlots),
        'virtualization_platform': ('virtualization_host_platform', VirtualizationPlatformSlots)
    }

    def get_slots(self, slot_type):
        if slot_type not in self._slots:
            raise AttributeError(slot_type)
        return self._slots[slot_type]

    def get_slot_types(self):
        return list(self._slot_maps.keys())

    def lookup_slot_by_db_label(self, db_label):
        # Given a string like 'sw_mgr_entitled', returns a string 'management'
        for label, (_, slot_class) in list(self._slot_maps.items()):
            if slot_class._db_label == db_label:
                return label
        return None


def get_text(node):
    return "".join([x.data for x in node.childNodes if x.nodeType == x.TEXT_NODE])
070701000001BF000081FD0000000000000000000000015FBBE8EE00000602000000000000000000000000000000000000003400000000spacewalk-backend/server/rhnServer/search_notify.py   #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# Sends notification to search-server that it should update server index
#

import sys

try:
    #  python 2
    import xmlrpclib
except ImportError:
    #  python3
    import xmlrpc.client as xmlrpclib
from spacewalk.common.rhnLog import log_error


class SearchNotify:

    def __init__(self, host="127.0.0.1", port="2828"):
        self.addr = "http://%s:%s" % (host, port)

    def notify(self, indexName="server"):
        try:
            client = xmlrpclib.ServerProxy(self.addr)
            result = client.admin.updateIndex(indexName)
        except Exception:
            e = sys.exc_info()[1]
            log_error("Failed to notify search service located at %s to update %s indexes"
                      % (self.addr, indexName), e)
            return False
        return result

if __name__ == "__main__":
    search = SearchNotify()
    result = search.notify()
    print(("search.notify() = %s" % (result)))
  070701000001C0000081B40000000000000000000000015FBBE8EE00001FE3000000000000000000000000000000000000003900000000spacewalk-backend/server/rhnServer/server_certificate.py  #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Classes and functions needed for handling certificates
# The only really exportable item is the Certificate class
#

import sys
import hashlib
import time
import random
import socket
try:
    #  python 2
    import xmlrpclib
except ImportError:
    #  python3
    import xmlrpc.client as xmlrpclib

from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.common.rhnException import rhnFault
from uyuni.common.stringutils import to_string
from .server_lib import getServerSecret
from .server_lib import check_entitlement_by_machine_id

def gen_secret():
    """ Generate a secret """
    seed = repr(time.time())
    sum = hashlib.new('sha256', seed.encode())
    # feed some random numbers
    for k in range(1, random.randint(5, 15)):
        sum.update(repr(random.random()).encode())
    sum.update(socket.gethostname().encode())
    ret = sum.hexdigest()
    del sum
    return ret


class Checksum:

    """ Functions for handling system_id strings """

    def __init__(self, secret, *args, **kwargs):
        algo = 'sha256'
        if 'algo' in kwargs:
            algo = kwargs['algo']
        self.sum = hashlib.new(algo, secret.encode())
        if len(args) > 0:
            self.feed(*args)

    def feed(self, arg):
        #sys.stderr.write("arg = %s, type = %s\n" % (arg, type(arg)))
        if type(arg) == type(()) or type(arg) == type([]):
            for s in arg:
                self.sum.update(s.encode())
        else:
            if type(arg) == type(0):
                arg = str(arg)
            self.sum.update(to_string(arg).encode())

    def __repr__(self):
        t = self.sum.hexdigest()
        return t
    __str__ = __repr__


class Certificate:

    """ Main certificate class """
    CheckSumFields = ["username", "os_release", "operating_system",
                      "architecture", "system_id", "type"]

    def __init__(self):
        """ init data
            normally we include in the attrs:
            username, os_release, os, arch, system_id and fields
        """
        self.attrs = {}
        for k in Certificate.CheckSumFields:
            self.attrs[k] = None
        self.__fields = []
        self.__secret = None
        self.__checksum = None

    def __getitem__(self, key):
        """ function that make it look like a dictionary for easy access """
        return self.attrs.get(key)

    def __setitem__(self, name, value):
        """ function that make it look like a dictionary for easy access
            updates the values of the attributes list with new values
        """
        self.attrs[name] = value
        if name in Certificate.CheckSumFields:
            if name not in self.__fields:
                self.__fields.append(name)
        else:  # non essential, take None values as ""
            if value is None:
                self.attrs[name] = ""
        return 0

    def __repr__(self):
        """ string format """
        return "<Certificate instance>: Attrs: %s, Fields: %s, Secret: %s, Checksum: %s" % (
            self.attrs, self.__fields, self.__secret, self.__checksum)
    __str__ = __repr__

    def certificate(self):
        """ convert to XML """
        dump = self.attrs
        dump["checksum"] = self.__checksum
        dump["fields"] = self.__fields
        try:
            x = xmlrpclib.dumps((dump,))
        except TypeError:
            e = sys.exc_info()[1]
            log_error("Could not marshall certificate for %s" % dump)
            e.args = e.args + (dump,)  # Carry on the information for the exception reporting
            raise
        return '<?xml version="1.0"?>\n%s' % x

    def compute_checksum(self, secret, algo='sha256'):
        """ Update the checksum """
        log_debug(4, secret, self.attrs)
        csum = Checksum(secret, algo=algo)
        for f in self.__fields:
            csum.feed(self.attrs[f])
        # feed the fields list last
        csum.feed(self.__fields)
        return str(csum)

    def set_secret(self, secret):
        """ set the secret of the entry and recompute the checksum """
        log_debug(4, "secret", secret)
        self.__secret = secret
        self.__checksum = self.compute_checksum(secret)

    def reload(self, text):
        """ load data from a text certificate passed on by a client """
        log_debug(4)
        text_id = text.strip()
        if not text_id:
            return -1
        # Now decode this certificate
        try:
            sysid, junk = xmlrpclib.loads(to_string(text_id))
        except:
            return -1
        else:
            s = sysid[0]
            del junk
        if "system_id" not in s or "fields" not in s:
            log_error("Got certificate with missing entries: %s" % s)
            return -1
        # check the certificate some more
        for k in s["fields"]:
            if k not in s:
                log_error("Certificate lists unknown %s as a checksum field" % k,
                          "cert data: %s" % s)
                return -1

        # clear out the state
        self.__init__()

        # at this point we know the certificate is sane enough for the
        # following processing
        for k in list(s.keys()):
            if k == "fields":
                self.__fields = s[k]
                continue
            if k == "checksum":
                self.__checksum = s[k]
                continue
            self.attrs[k] = s[k]
        # okay, the certificate is now loaded
        return 0

    def __validate_checksum(self, secret):
        """ compute the current checksum against a secret and check it against
            the current checksum
        """
        if len(self.__checksum) == 64:
            csum = self.compute_checksum(secret, algo='sha256')
        elif len(self.__checksum) == 32:
            csum = self.compute_checksum(secret, algo='md5')
        if not csum == self.__checksum:
            # fail, current checksum does not match
            log_error("Checksum check failed: %s != %s" % (csum, self.__checksum),
                      "fields = %s" % str(self.__fields), "attrs = %s" % str(self.attrs))
            return 0
        return 1

    def valid(self):
        log_debug(4)
        # check for anonymous

        if self.attrs.get('machine_id'):
            entitlements = check_entitlement_by_machine_id(self.attrs.get('machine_id'))
            log_debug(4, "found entitlements for machine_id", self.attrs.get('machine_id'), entitlements)
            if 'salt_entitled' in entitlements:
                raise rhnFault(48, """
    This system is already registered as a Salt Minion. If you want to register it as a traditional client
    please delete it first via the web UI or API and then register it using the traditional tools.
                """)

        if 'type' in self.attrs and self.attrs['type'] \
                and self.attrs['type'].upper() == "ANONYMOUS":
            raise rhnFault(28, """
            You need to re-register your system with SUSE Manager.
            Previously you have chosen to skip the creation of a system profile
            with SUSE Manager and this trial feature is no longer available now.
            """) # we don't support anonymous anymore
        # now we have a real server. Get its secret
        sid = self.attrs["system_id"]
        secret = getServerSecret(sid)
        if secret is None:
            # no secret, can't validate
            log_debug(1, "Server id %s not found in database" % sid)
            return 0
        return self.__validate_checksum(secret)
 070701000001C1000081B40000000000000000000000015FBBE8EE00008281000000000000000000000000000000000000003300000000spacewalk-backend/server/rhnServer/server_class.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# Stuff for handling Servers
#

# system modules
import sys

from uyuni.common.usix import raise_with_tb
from spacewalk.common import rhnFlags
from spacewalk.common.rhnConfig import CFG
from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.common.rhnException import rhnFault, rhnException
from spacewalk.common.rhnTranslate import _
from spacewalk.server import rhnChannel, rhnUser, rhnSQL, rhnLib, rhnAction, \
    rhnVirtualization
from .search_notify import SearchNotify

# Local Modules
from . import server_kickstart
from . import server_lib
from . import server_token
from .server_certificate import Certificate, gen_secret
from .server_wrapper import ServerWrapper


class Server(ServerWrapper):

    """ Main Server class """

    def __init__(self, user, arch=None, org_id=None):
        ServerWrapper.__init__(self)
        self.user = user
        # Use the handy TableRow
        self.server = rhnSQL.Row("rhnServer", "id")
        self.server["release"] = ""
        self.server["os"] = "SUSE Linux"
        self.addr = {}
        self.is_rpm_managed = 0
        self.set_arch(arch)
        # We only get this passed in when we create a new
        # entry. Usually a reload will create a dummy entry first and
        # then call self.loadcert()
        if user:
            self.server["org_id"] = user.customer["id"]
        elif org_id:
            self.server["org_id"] = org_id
        self.cert = None
        # Also, at this point we know that this is a real server
        self.type = "REAL"
        self.default_description()

        # custom info values
        self.custom_info = None

        # uuid
        self.uuid = None
        self.virt_uuid = None
        self.registration_number = None

    _query_lookup_arch = rhnSQL.Statement("""
        select sa.id,
               case when at.label = 'rpm' then 1 else 0 end is_rpm_managed
          from rhnServerArch sa,
               rhnArchType at
         where sa.label = :archname
           and sa.arch_type_id = at.id
    """)

    def set_arch(self, arch):
        self.archname = arch
        # try to detect the archid
        if arch is None:
            return

        arch = rhnLib.normalize_server_arch(arch)
        h = rhnSQL.prepare(self._query_lookup_arch)
        h.execute(archname=arch)
        data = h.fetchone_dict()
        if not data:
            # Log it to disk, it may show interesting things
            log_error("Attempt to create server with invalid arch `%s'" %
                      arch)
            raise rhnFault(24,
                           _("Architecture `%s' is not supported") % arch)
        self.server["server_arch_id"] = data["id"]
        self.is_rpm_managed = data['is_rpm_managed']

    # set the default description...
    def default_description(self):
        self.server["description"] = "Initial Registration Parameters:\n"\
                                     "OS: %s\n"\
                                     "Release: %s\n"\
                                     "CPU Arch: %s" % (
            self.server["os"], self.server["release"],
            self.archname)

    def __repr__(self):
        # misa: looks like id can return negative numbers, so use %d
        # instead of %x
        # For the gory details,
        # http://mail.python.org/pipermail/python-dev/2005-February/051559.html
        return "<Server Class at %d: %s>\n" % (
            id(self), {
                "self.cert": self.cert,
                "self.server": self.server.data,
            })
    __str__ = __repr__

    def _get_active_org_admins(self, org_id):
        h = rhnSQL.prepare("""
            SELECT login
            FROM web_contact
            WHERE id in (
                SELECT ugm.user_id
                FROM rhnUserGroupMembers ugm
                WHERE ugm.user_group_id = (SELECT id
                                           FROM rhnUserGroup
                                           WHERE org_id = :org_id
                                           AND group_type = (SELECT id FROM
                                     rhnUserGroupType WHERE label = 'org_admin'))
                AND exists (select wc.id
                            from rhnwebcontactenabled wc
                            where wc.id = ugm.user_id)
                ORDER BY ugm.user_id);
        """)
        h.execute(org_id=org_id)
        rows = h.fetchall_dict()
        return rows

    # Return a Digital Certificate that can be placed in a file on the
    # client side.
    def system_id(self):
        log_debug(3, self.server, self.cert)
        if self.cert is None:
            # need to instantiate it
            cert = Certificate()
            cert["system_id"] = self.server["digital_server_id"]
            cert["os_release"] = self.server["release"]
            cert["operating_system"] = self.server["os"]
            cert["architecture"] = self.archname
            cert["profile_name"] = self.server["name"]
            cert["description"] = self.server["description"]
            if not self.user:
                log_debug(1, "The username is not available. Taking an active " \
                             "administrator from the same organization")
                self.user = rhnUser.search(self._get_active_org_admins(
                    self.server["org_id"])[0]["login"])
            cert["username"] = self.user.contact["login"]
            cert["type"] = self.type
            cert.set_secret(self.server["secret"])
            self.cert = cert
        return self.cert.certificate()

    # return the id of this system
    def getid(self):
        if not self.server.has_key("id"):
            sysid = rhnSQL.Sequence("rhn_server_id_seq")()
            self.server["digital_server_id"] = "ID-%09d" % sysid
            # we can't reset the id column, so we need to poke into
            # internals. kind of illegal, but it works...
            self.server.data["id"] = (sysid, 0)
        else:
            sysid = self.server["id"]
        return sysid

    # change the base channel of a server
    def change_base_channel(self, new_rel, suse_products=None):
        log_debug(3, self.server["id"], new_rel)
        old_rel = self.server["release"]
        current_channels = rhnChannel.channels_for_server(self.server["id"])
        # Extract the base channel off of
        old_base = [x for x in current_channels if not x['parent_channel']]

        # Quick sanity check
        base_channels_count = len(old_base)
        if base_channels_count == 1:
            old_base = old_base[0]
        elif base_channels_count == 0:
            old_base = None
        else:
            raise rhnException("Server %s subscribed to multiple base channels"
                               % (self.server["id"], ))

        # bz 442355
        # Leave custom base channels alone, don't alter any of the channel subscriptions
        if not CFG.RESET_BASE_CHANNEL and old_base and rhnChannel.isCustomChannel(old_base["id"]):
            log_debug(3,
                      "Custom base channel detected, will not alter channel subscriptions")
            self.server["release"] = new_rel
            self.server.save()
            msg = """The SUSE Manager Update Agent has detected a
            change in the base version of the operating system running
            on your system, additionally you are subscribed to a custom
            channel as your base channel.  Due to this configuration
            your channel subscriptions will not be altered.
            """
            self.add_history("Updated system release from %s to %s" % (
                old_rel, new_rel), msg)
            self.save_history_byid(self.server["id"])
            return 1

        s = rhnChannel.LiteServer().init_from_server(self)
        s.release = new_rel
        s.arch = self.archname
        if suse_products:
            s.add_suse_products(suse_products)
        # Let get_server_channels deal with the errors and raise rhnFault
        target_channels = rhnChannel.guess_channels_for_server(s, none_ok=True)
        if target_channels:
            target_base = [x for x in target_channels if not x['parent_channel']][0]
        else:
            target_base = None

        channels_to_subscribe = []
        channels_to_unsubscribe = []
        if old_base and target_base and old_base['id'] == target_base['id']:
            # Same base channel. Preserve the currently subscribed child
            # channels, just add the ones that are missing
            hash = {}
            for c in current_channels:
                hash[c['id']] = c

            for c in target_channels:
                channel_id = c['id']
                if channel_id in hash:
                    # Already subscribed to this one
                    del hash[channel_id]
                    continue
                # Have to subscribe to this one
                channels_to_subscribe.append(c)

            # We don't want to lose subscriptions to prior channels, so don't
            # do anything with hash.values()
        else:
            # Different base channel
            channels_to_unsubscribe = current_channels
            channels_to_subscribe = target_channels

        rhnSQL.transaction("change_base_channel")
        self.server["release"] = new_rel
        self.server.save()
        if not (channels_to_subscribe or channels_to_unsubscribe):
            # Nothing to do, just add the history entry
            self.add_history("Updated system release from %s to %s" % (
                old_rel, new_rel))
            self.save_history_byid(self.server["id"])
            return 1

        # XXX: need a way to preserve existing subscriptions to
        # families so we can restore access to non-public ones.

        rhnChannel.unsubscribe_channels(self.server["id"],
                                        channels_to_unsubscribe)
        rhnChannel.subscribe_channels(self.server["id"],
                                      channels_to_subscribe)
        # now that we changed, recompute the errata cache for this one
        rhnSQL.Procedure("queue_server")(self.server["id"])
        # Make a history note
        sub_channels = rhnChannel.channels_for_server(self.server["id"])
        if sub_channels:
            channel_list = [a["name"] for a in sub_channels]
            msg = """The SUSE Manager Update Agent has detected a
            change in the base version of the operating system running
            on your system and has updated your channel subscriptions
            to reflect that.
            Your server has been automatically subscribed to the following
            channels:\n%s\n""" % ("\n".join(channel_list),)
        else:
            msg = """*** ERROR: ***
            While trying to subscribe this server to software channels:
            There are no channels serving release %s""" % new_rel
        self.add_history("Updated system release from %s to %s" % (
            old_rel, new_rel), msg)
        self.save_history_byid(self.server["id"])
        return 1

    def take_snapshot(self, reason):
        return server_lib.snapshot_server(self.server['id'], reason)

    # returns true iff the base channel assigned to this system
    # has been end-of-life'd
    def base_channel_is_eol(self):
        h = rhnSQL.prepare("""
        select 1
        from rhnChannel c, rhnServerChannel sc
        where sc.server_id = :server_id
          and sc.channel_id = c.id
          and c.parent_channel IS NULL
          and current_timestamp - c.end_of_life > 0
        """)
        h.execute(server_id=self.getid())
        ret = h.fetchone_dict()
        if ret:
            return 1

        return None

    _query_server_custom_info = rhnSQL.Statement("""
    select cdk.label,
           scdv.value
      from rhnCustomDataKey cdk,
           rhnServerCustomDataValue scdv
     where scdv.server_id = :server_id
       and scdv.key_id = cdk.id
    """)

    def load_custom_info(self):
        self.custom_info = {}

        h = rhnSQL.prepare(self._query_server_custom_info)
        h.execute(server_id=self.getid())
        rows = h.fetchall_dict()

        if not rows:
            log_debug(4, "no custom info values")
            return

        for row in rows:
            self.custom_info[row['label']] = row['value']

    # load additional server information from the token definition
    def load_token(self):
        # Fetch token
        tokens_obj = rhnFlags.get("registration_token")
        if not tokens_obj:
            # No tokens present
            return 0

        # make sure we have reserved a server_id. most likely if this
        # is a new server object (just created from
        # registration.new_system) then we have no associated a
        # server["id"] yet -- and getid() will reserve that for us.
        self.getid()
        # pull in the extra information needed to fill in the
        # required registration fields using tokens

        user_id = tokens_obj.get_user_id()
        org_id = tokens_obj.get_org_id()

        self.user = rhnUser.User("", "")
        if user_id is not None:
            self.user.reload(user_id)
        self.server["creator_id"] = user_id
        self.server["org_id"] = org_id
        self.server["contact_method_id"] = tokens_obj.get_contact_method_id()
        return 0

    # perform the actions required by the token (subscribing to
    # channels, server groups, etc)
    def use_token(self):
        # Fetch token
        tokens_obj = rhnFlags.get("registration_token")
        if not tokens_obj:
            # No token present
            return 0

        is_rereg_token = tokens_obj.is_rereg_token

        # We get back a history of what is being done in the
        # registration process
        history = server_token.process_token(self.server, self.archname,
                                             tokens_obj, self.virt_type)

        if is_rereg_token:
            event_name = "Reactivation via Token"
            event_text = "System reactivated"
        else:
            event_name = "Subscription via Token"
            event_text = "System created"

        token_name = tokens_obj.get_names()
        # now record that history nicely
        self.add_history(event_name,
                         "%s with token <strong>%s</strong><br />\n%s" %
                         (event_text, token_name, history))
        self.save_history_byid(self.server["id"])

        # 6/23/05 wregglej 157262, use get_kickstart session_id() to see if we're in the middle of a kickstart.
        ks_id = tokens_obj.get_kickstart_session_id()

        # 4/5/05 wregglej, Added for bugzilla: 149932. Actions need to be flushed on reregistration.
        # 6/23/05 wregglej 157262, don't call flush_actions() if we're in the middle of a kickstart.
        #   It would cause all of the remaining kickstart actions to get flushed, which is bad.
        if is_rereg_token and ks_id is None:
            self.flush_actions()

        # XXX: will need to call self.save() later to commit all that
        return 0

    def disable_token(self):
        tokens_obj = rhnFlags.get('registration_token')
        if not tokens_obj:
            # Nothing to do
            return
        if not tokens_obj.is_rereg_token:
            # Not a re-registration token - nothing to do
            return

        # Re-registration token - we know for sure there is only one
        token_server_id = tokens_obj.get_server_id()
        if token_server_id != self.getid():
            # Token is not associated with this server (it may actually not be
            # associated with any server)
            return
        server_token.disable_token(tokens_obj)
        # save() will commit this

    # Auto-entitlement: attempt to entitle this server to the highest
    # entitlement that is available
    def autoentitle(self):
        entitlement_hierarchy = ['enterprise_entitled']

        any_base_entitlements = 0

        for entitlement in entitlement_hierarchy:
            try:
                self._entitle(entitlement)
                any_base_entitlements = 1
            except rhnSQL.SQLSchemaError:
                e = sys.exc_info()[1]
                if e.errno == 20287:
                    # ORA-20287: (invalid_entitlement) - The server can not be
                    # entitled to the specified level
                    #
                    # ignore for now, since any_base_entitlements will throw
                    # an error at the end if not set
                    continue

                # Should not normally happen
                log_error("Failed to entitle", self.server["id"], entitlement,
                          e.errmsg)
                raise_with_tb(server_lib.rhnSystemEntitlementException("Unable to entitle"), sys.exc_info()[2])
            except rhnSQL.SQLError:
                e = sys.exc_info()[1]
                log_error("Failed to entitle", self.server["id"], entitlement,
                          str(e))
                raise_with_tb(server_lib.rhnSystemEntitlementException("Unable to entitle"), sys.exc_info()[2])
            else:
                if any_base_entitlements:
                    # All is fine
                    return
                else:
                    raise_with_tb(server_lib.rhnNoSystemEntitlementsException, sys.exc_info()[2])

    def _entitle(self, entitlement):
        system_entitlements = server_lib.check_entitlement(self.server["id"])
        system_entitlements = list(system_entitlements.keys())

        if entitlement not in system_entitlements:
            entitle_server = rhnSQL.Procedure("rhn_entitlements.entitle_server")
            entitle_server(self.server['id'], entitlement)

    def create_perm_cache(self):
        log_debug(4)
        create_perms = rhnSQL.Procedure("rhn_cache.update_perms_for_server")
        create_perms(self.server['id'])

    def gen_secret(self):
        # Running this invalidates the cert
        self.cert = None
        self.server["secret"] = gen_secret()

    _query_update_uuid = rhnSQL.Statement("""
        update rhnServerUuid set uuid = :uuid
         where server_id = :server_id
    """)
    _query_insert_uuid = rhnSQL.Statement("""
        insert into rhnServerUuid (server_id, uuid)
        values (:server_id, :uuid)
    """)

    def update_uuid(self, uuid, commit=1):
        log_debug(3, uuid)
        # XXX Should determine a way to do this dinamically
        uuid_col_length = 36
        if uuid is not None:
            uuid = str(uuid)
        if not uuid:
            log_debug(3, 'Nothing to do')
            return

        uuid = uuid[:uuid_col_length]
        server_id = self.server['id']
        log_debug(4, "Trimmed uuid", uuid, server_id)

        # Update this server's UUID (unique client identifier)
        h = rhnSQL.prepare(self._query_update_uuid)
        ret = h.execute(server_id=server_id, uuid=uuid)
        log_debug(4, "execute returned", ret)

        if ret != 1:
            # Row does not exist, have to create it
            h = rhnSQL.prepare(self._query_insert_uuid)
            h.execute(server_id=server_id, uuid=uuid)

        if commit:
            rhnSQL.commit()

    def handle_virtual_guest(self):
        # Handle virtualization specific bits
        if self.virt_uuid and self.virt_type:
            rhnVirtualization._notify_guest(self.getid(),
                                            self.virt_uuid, self.virt_type)

    # Save this record in the database
    def __save(self, channel):
        tokens_obj = rhnFlags.get("registration_token")

        if self.server.real:
            server_id = self.server["id"]
            self.server.save()
        else:  # create new entry
            self.gen_secret()
            server_id = self.getid()
            org_id = self.server["org_id"]

            if self.user:
                user_id = self.user.getid()
            else:
                user_id = None

            # some more default values
            self.server["auto_update"] = "N"
            if self.user and not self.server.has_key("creator_id"):
                # save the link to the user that created it if we have
                # that information
                self.server["creator_id"] = self.user.getid()
            # and create the server entry
            self.server.create(server_id)
            server_lib.create_server_setup(server_id, org_id)

            self.handle_virtual_guest()

            # if we're using a token, then the following channel
            # subscription request can allow no matches since the
            # token code will fix up or fail miserably later.
            # subscribe the server to applicable channels

            # bretm 02/17/2007 -- TODO:  refactor activation key codepaths
            # to allow us to not have to pass in none_ok=1 in any case
            #
            # This can now throw exceptions which will be caught at a higher level
            if channel is not None:
                channel_info = dict(rhnChannel.channel_info(channel))
                log_debug(4, "eus channel id %s" % str(channel_info))
                rhnChannel.subscribe_sql(server_id, channel_info['id'])
            else:
                rhnChannel.subscribe_server_channels(self,
                                                     none_ok=tokens_obj,
                                                     user_id=user_id)

            if not tokens_obj:
                # Attempt to auto-entitle, can throw the following exceptions:
                #   rhnSystemEntitlementException
                #   rhnNoSystemEntitlementsException
                self.autoentitle()

                # If a new server that was registered by an user (i.e. not
                # with a registration token), look for this user's default
                # groups
                self.join_groups()

            server_lib.join_rhn(org_id)

        # Update virtual guest attributes on re-registration
        if getattr(tokens_obj, "is_rereg_token", False):
            self.handle_virtual_guest()

        # Update the uuid - but don't commit yet
        self.update_uuid(self.uuid, commit=0)

        self.create_perm_cache()
        # And save the extra profile data...
        self.save_suse_products_byid(server_id)
        self.save_packages_byid(server_id, schedule=1)
        self.save_hardware_byid(server_id)
        self.save_history_byid(server_id)
        return 0

    # This is a wrapper for the above class that allows us to rollback
    # any changes in case we don't succeed completely
    def save(self, commit=1, channel=None):
        log_debug(3)
        # attempt to preserve pending changes before we were called,
        # so we set up our own transaction checkpoint
        rhnSQL.transaction("save_server")
        try:
            self.__save(channel)
        except:  # roll back to what we have before and raise again
            rhnSQL.rollback("save_server")
            # shoot the exception up the chain
            raise
        else:  # if we want to commit, commit all pending changes
            if commit:
                rhnSQL.commit()
                try:
                    search = SearchNotify()
                    search.notify()
                except Exception:
                    e = sys.exc_info()[1]
                    log_error("Exception caught from SearchNotify.notify().", e)
        return 0

    # Reload the current configuration from database using a server id.
    def reload(self, server, reload_all=0):
        log_debug(4, server, "reload_all = %d" % reload_all)

        if not self.server.load(int(server)):
            log_error("Could not find server record for reload", server)
            raise rhnFault(29, "Could not find server record in the database")
        self.cert = None
        # it is lame that we have to do this
        h = rhnSQL.prepare("""
        select label from rhnServerArch where id = :archid
        """)
        h.execute(archid=self.server["server_arch_id"])
        data = h.fetchone_dict()
        if not data:
            raise rhnException("Found server with invalid numeric "
                               "architecture reference",
                               self.server.data)
        self.archname = data['label']
        # we don't know this one anymore (well, we could look for, but
        # why would we do that?)
        self.user = None

        self.addr.update(self.fetch_addr())

        # XXX: Fix me
        if reload_all:
            if not self.reload_packages_byid(self.server["id"]) == 0:
                return -1
            if not self.reload_hardware_byid(self.server["id"]) == 0:
                return -1
        return 0

    # Reload primary IP information from database
    def fetch_addr(self):

        server = self.getid()
        ret = {}

        h = rhnSQL.prepare("""
        select address as ipaddr
        from rhnservernetinterface rsni
        join rhnservernetaddress4 rsna4 on rsna4.interface_id = rsni.id
        where is_primary = 'Y' and server_id = :serverid
        """)

        h.execute(serverid=server)
        data = h.fetchone_dict()
        if data:
            ret.update(data)

        h = rhnSQL.prepare("""
        select address as ip6addr
        from rhnservernetinterface rsni
        join rhnservernetaddress6 rsna4 on rsna4.interface_id = rsni.id
        where is_primary = 'Y' and server_id = :serverid
        """)

        h.execute(serverid=server)
        data = h.fetchone_dict()
        if data:
            ret.update(data)

        return ret

    # Use the values we find in the cert to cause a reload of this
    # server from the database.
    def loadcert(self, cert, load_user=1):
        log_debug(4, cert)
        # certificate is presumed to be already verified
        if not isinstance(cert, Certificate):
            return -1
        # reload the whole thing based on the cert data
        server = cert["system_id"]
        row = server_lib.getServerID(server)
        if row is None:
            return -1
        sid = row["id"]
        # standard reload based on an ID
        ret = self.reload(sid)
        if not ret == 0:
            return ret

        # the reload() will never be able to fill in the username.  It
        # would require from the database standpoint insuring that for
        # a given server we can have only one owner at any given time.
        # cert includes it and it's valid because it has been verified
        # through checksuming before we got here

        self.user = None

        # Load the user if at all possible. If it's not possible,
        # self.user will be None, which should be a handled case wherever
        # self.user is used.
        if load_user:
            # Load up the username associated with this profile
            self.user = rhnUser.search(cert["username"])

        # 4/27/05 wregglej - Commented out this block because it was causing problems
        # with rhn_check/up2date when the user that registered the system was deleted.
        #    if not self.user:
        #        log_error("Invalid username for server id",
        #                  cert["username"], server, cert["profile_name"])
        #        raise rhnFault(9, "Invalid username '%s' for server id %s" %(
        #            cert["username"], server))

        # XXX: make sure that the database thinks that the server
        # registrnt is the same as this certificate thinks. The
        # certificate passed checksum checks, but it never hurts to be
        # too careful now with satellites and all.
        return 0

    # Is this server entitled?
    def check_entitlement(self):
        if not self.server.has_key("id"):
            return None
        log_debug(3, self.server["id"])

        return server_lib.check_entitlement(self.server['id'])

    def checkin(self, commit=1):
        """ convenient wrapper for these thing until we clean the code up """
        if not self.server.has_key("id"):
            return 0  # meaningless if rhnFault not raised
        return server_lib.checkin(self.server["id"], commit)

    def throttle(self):
        """ convenient wrapper for these thing until we clean the code up """
        if not self.server.has_key("id"):
            return 1  # meaningless if rhnFault not raised
        return server_lib.throttle(self.server)

    def set_qos(self):
        """ convenient wrapper for these thing until we clean the code up """
        if not self.server.has_key("id"):
            return 1  # meaningless if rhnFault not raised
        return server_lib.set_qos(self.server["id"])

    def join_groups(self):
        """ For a new server, join server groups """

        # Sanity check - we should always have a user
        if not self.user:
            raise rhnException("User not specified")

        server_id = self.getid()
        user_id = self.user.getid()

        h = rhnSQL.prepare("""
            select system_group_id
            from rhnUserDefaultSystemGroups
            where user_id = :user_id
        """)
        h.execute(user_id=user_id)
        while 1:
            row = h.fetchone_dict()
            if not row:
                break
            server_group_id = row['system_group_id']
            log_debug(5, "Subscribing server to group %s" % server_group_id)

            server_lib.join_server_group(server_id, server_group_id)

    def fetch_registration_message(self):
        return rhnChannel.system_reg_message(self)

    def process_kickstart_info(self):
        log_debug(4)
        tokens_obj = rhnFlags.get("registration_token")
        if not tokens_obj:
            log_debug(4, "no registration token found")
            # Nothing to do here
            return

        # If there are kickstart sessions associated with this system (other
        # than, possibly, the current one), mark them as failed
        history = server_kickstart.terminate_kickstart_sessions(self.getid())
        for k, v in history:
            self.add_history(k, v)

        kickstart_session_id = tokens_obj.get_kickstart_session_id()
        if kickstart_session_id is None:
            log_debug(4, "No kickstart_session_id associated with token %s (%s)"
                      % (tokens_obj.get_names(), tokens_obj.tokens))

            # Nothing to do here
            return

        # Flush server actions
        self.flush_actions()

        server_id = self.getid()
        action_id = server_kickstart.schedule_kickstart_sync(server_id,
                                                             kickstart_session_id)

        server_kickstart.subscribe_to_tools_channel(server_id,
                                                    kickstart_session_id)

        server_kickstart.schedule_virt_pkg_install(server_id,
                                                   kickstart_session_id)

        # Update the next action to the newly inserted one
        server_kickstart.update_ks_session_table(kickstart_session_id,
                                                 'registered', action_id, server_id)

    def flush_actions(self):
        server_id = self.getid()
        h = rhnSQL.prepare("""
            select action_id
              from rhnServerAction
             where server_id = :server_id
               and status in (0, 1) -- Queued or Picked Up
        """)
        h.execute(server_id=server_id)
        while 1:
            row = h.fetchone_dict()
            if not row:
                break
            action_id = row['action_id']
            rhnAction.update_server_action(server_id=server_id,
                                           action_id=action_id, status=3, result_code=-100,
                                           result_message="Action canceled: system kickstarted or reregistered")  # 4/6/05 wregglej, added the "or reregistered" part.

    def server_locked(self):
        """ Returns true is the server is locked (for actions that are blocked) """
        server_id = self.getid()
        h = rhnSQL.prepare("""
            select 1
              from rhnServerLock
             where server_id = :server_id
        """)
        h.execute(server_id=server_id)
        row = h.fetchone_dict()
        if row:
            return 1
        return 0

    def register_push_client(self):
        """ insert or update rhnPushClient for this server_id """
        server_id = self.getid()
        ret = server_lib.update_push_client_registration(server_id)
        return ret

    def register_push_client_jid(self, jid):
        """ update the JID in the corresponing entry from rhnPushClient """
        server_id = self.getid()
        ret = server_lib.update_push_client_jid(server_id, jid)
        return ret
   070701000001C2000081B40000000000000000000000015FBBE8EE0000A43C000000000000000000000000000000000000003600000000spacewalk-backend/server/rhnServer/server_hardware.py #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# This file contains all the logic necessary to manipulate Hardware
# items - load, reload, instanciate and save
#

import socket
import sys
import time
import uuid

from rhn.UserDictCase import UserDictCase
from uyuni.common.usix import raise_with_tb
from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.common.rhnConfig import CFG, isUyuni
from spacewalk.common.rhnException import rhnFault
from spacewalk.common.rhnTB import Traceback
from spacewalk.common import rhnMail
from spacewalk.common import rhnFlags
from spacewalk.server import rhnSQL, rhnVirtualization, rhnUser

# Local imports
from spacewalk.server.rhnServer import server_class

def kudzu_mapping(dict=None):
    """ this is a class we use to get the mapping for a kudzu entry """
    # This is the generic mapping we need
    mapping = {
        'desc': 'description',
    }
    # error handling if we get passed weird stuff.
    if not dict:
        return mapping
    if not type(dict) == type({}) and not isinstance(dict, UserDictCase):
        return mapping
    hw_bus = dict.get("bus")
    # we need to have a bus type to be able to continue
    if not hw_bus:
        return mapping
    hw_bus = hw_bus.lower()
    extra = {}
    if hw_bus == "ddc":
        extra = {
            "id": None,
            "horizsyncmin": "prop1",
            "horizsyncmax": "prop2",
            "vertrefreshmin": "prop3",
            "vertrefreshmax": "prop4",
            "modes": None,
            "mem": None,
        }
    elif hw_bus == "ide":
        extra = {
            "physical": "prop1",
            "logical": "prop2",
        }
    elif hw_bus in ["isapnp", "isa"]:
        extra = {
            "pdeviceid": "prop1",
            "deviceid": "prop2",
            "compat": "prop3",
            "native": None,
            "active": None,
            "cardnum": None,  # XXX: fix me
            "logdev": "prop4",
            "io": "prop2",
            "irq": "prop1",
            "dma": "prop3",
            "mem": "prop4",
        }
    elif hw_bus == "keyboard":
        extra = {}
    elif hw_bus == "psaux":
        extra = {}
    elif hw_bus == "parallel":
        extra = {
            'pnpmfr': 'prop1',
            'pnpdesc': 'prop2',
            'pnpmodel': 'prop3',
            'pnpmodes': 'prop4',
            'pinfo': None,
            'pinfo.xres': None,
            'pinfo.yres': None,
            'pinfo.color': None,
            'pinfo.ascii': None,
        }
    elif hw_bus == "pci":
        extra = {
            'vendorid': 'prop1',
            'deviceid': 'prop2',
            'subvendorid': 'prop3',
            'subdeviceid': 'prop4',
            'network.hwaddr': None,
            'pcibus': None,
            'pcidev': None,
            'pcifn': None,
            'pcidom': None,
        }
    elif hw_bus == "sbus":
        extra = {
            "monitor": "prop1",
            "width": "prop2",
            "height": "prop3",
            "freq": "prop4",
        }
    elif hw_bus == "scsi":
        extra = {
            'host': 'prop1',
            'id': 'prop2',
            'channel': 'prop3',
            'lun': 'prop4',
            'generic': None,
        }
    elif hw_bus == "serial":
        extra = {
            'pnpmfr': 'prop1',
            'pnpdesc': 'prop2',
            'pnpmodel': 'prop3',
            'pnpcompat': "prop4",
        }
    elif hw_bus == "usb":
        extra = {
            "vendorid": "prop1",
            "deviceid": "prop2",
            "usbclass": "prop3",
            "usbbus": "prop4",
            "usblevel": "pciType",
            "usbdev": None,
            "usbprod": None,
            "usbsubclass": None,
            "usbprotocol": None,
            "usbport": None,
            "usbmfr": None,
            "productname": None,
            "productrevision": None,
            'network.hwaddr': None,
        }
    elif hw_bus == "firewire":
        extra = {
            'vendorid': 'prop1',
            'deviceid': 'prop2',
            'subvendorid': 'prop3',
            'subdeviceid': 'prop4',
        }
    elif hw_bus == 'pcmcia':
        extra = {
            'vendorid': 'prop1',
            'deviceid': 'prop2',
            'function': 'prop3',
            'slot': 'prop4',
            'network.hwaddr': None,
        }
    mapping.update(extra)
    return mapping


def cleanse_ip_addr(ip_addr):
    """ Cleans up things like 127.00.00.01 """
    if ip_addr is None:
        return None
    # Make sure it's a string
    ip_addr = str(ip_addr)
    # If the ipaddr is empty, jus return empty str
    if not len(ip_addr):
        return ''
    arr = ip_addr.split('.')
    # lstrip will remove all leading zeros; if multiple zeros are present, it
    # would remove too much, hence the or '0' here.
    return '.'.join([x.lstrip('0') or '0' for x in arr])


class GenericDevice:

    """ A generic device class """
    table = "override-GenericDevice"

    def __init__(self):
        self.id = 0
        self.status = 1  # just added
        self.data = {}
        # default to the hardware seq...
        self.sequence = "rhn_hw_dev_id_seq"
        self._autonull = ("description", "board")

    def getid(self):
        if self.id == 0:
            self.id = rhnSQL.Sequence(self.sequence)()
        return self.id

    def must_save(self):
        if self.id == 0 and self.status == 2:  # deleted new item
            return 0
        if self.status == 0:  # original item, unchanged
            return 0
        return 1

    def save(self, sysid):
        """ save data in the rhnDevice table """
        log_debug(4, self.table, self.status, self.data)
        if not self.must_save():
            return 0
        t = rhnSQL.Table(self.table, "id")
        # check if we have to delete
        if self.status == 2 and self.id:
            # delete the entry
            del t[self.id]
            return 0
        # set description to null if empty
        self._null_columns([self.data], self._autonull)
        # make sure we have a device id
        devid = self.getid()
        for k in list(self.data.keys()):
            if self.data[k] is None:
                del self.data[k]
        self.data["server_id"] = sysid
        t[devid] = self.data
        self.status = 0  # now it is saved
        return 0

    def reload(self, devid):
        """ reload from rhnDevice table based on devid """
        if not devid:
            return -1
        t = rhnSQL.Table(self.table, "id")
        self.data = t[devid]
        # clean up fields we don't want
        if self.data:
            for k in ["created", "modified"]:
                if self.data.has_key(k):
                    del self.data[k]
        self.id = devid
        self.status = 0
        return 0

    def _null_columns(self, params, names=()):
        """ Method searches for empty string in params dict with names
            defined in names list and replaces them with None value which
            is translated to NULL in SQL.

            We do not allow empty strings in database for compatibility
            reasons between Oracle and PostgreSQL.
        """
        # list of dicts
        for param in params:
            for name in names:
                if name in param and param[name] == '':
                    param[name] = None


class Device(GenericDevice):

    """ This is the base Device class that supports instantiation from a
        dictionarry. the __init__ takes the dictionary as its argument,
        together with a list of valid fields to recognize and with a mapping
        for dictionary keys into valid field names for self.data

        The fields are required to know what fields we have in the
        table. The mapping allows transformation from whatever comes in to
        valid fields in the table Looks complicated but it isn't -- gafton
    """

    def __init__(self, fields, dict=None, mapping=None):
        GenericDevice.__init__(self)
        x = {}
        for k in fields:
            x[k] = None
        self.data = UserDictCase(x)
        if not dict:
            return
        # make sure we get a UserDictCase to work with
        if type(dict) == type({}):
            dict = UserDictCase(dict)
        if mapping is None or type(mapping) == type({}):
            mapping = UserDictCase(mapping)
        if not isinstance(dict, UserDictCase) or \
           not isinstance(mapping, UserDictCase):
            log_error("Argument passed is not a dictionary", dict, mapping)
            raise TypeError("Argument passed is not a dictionary",
                            dict, mapping)
        # make sure we have a platform
        for k in list(dict.keys()):
            if dict[k] == '':
                dict[k] = None
            if self.data.has_key(k):
                self.data[k] = dict[k]
                continue
            if mapping.has_key(k):
                # the mapping dict might tell us to lose some fields
                if mapping[k] is not None:
                    self.data[mapping[k]] = dict[k]
            else:
                log_error("Unknown HW key =`%s'" % k,
                          dict.dict(), mapping.dict())
                # The try-except is added just so that we can send e-mails
                try:
                    raise KeyError("Don't know how to parse key `%s''" % k,
                                   dict.dict())
                except:
                    Traceback(mail=1)
                    # Ignore this key
                    continue
        # clean up this data
        try:
            for k in list(self.data.keys()):
                if type(self.data[k]) == type("") and len(self.data[k]):
                    self.data[k] = self.data[k].strip()
                    if not len(self.data[k]):
                        continue
                    if self.data[k][0] == '"' and self.data[k][-1] == '"':
                        self.data[k] = self.data[k][1:-1]
        except IndexError:
            raise_with_tb(IndexError("Can not process data = %s, key = %s" % (
                repr(self.data), k)), sys.exc_info()[2])


class HardwareDevice(Device):

    """ A more specific device based on the Device class """
    table = "rhnDevice"

    def __init__(self, dict=None):
        fields = ['class', 'bus', 'device', 'driver', 'detached',
                  'description', 'pcitype', 'prop1', 'prop2',
                  'prop3', 'prop4']
        # get a processed mapping
        mapping = kudzu_mapping(dict)
        # ... and do little to no work
        Device.__init__(self, fields, dict, mapping)
        # use the hardware id sequencer
        self.sequence = "rhn_hw_dev_id_seq"


class CPUDevice(Device):

    """ A class for handling CPU - mirrors the rhnCPU structure """
    table = "rhnCPU"

    def __init__(self, dict=None):
        fields = ['cpu_arch_id',  'architecture', 'bogomips', 'cache',
                  'family', 'mhz', 'stepping', 'flags', 'model',
                  'version', 'vendor', 'nrcpu', 'acpiVersion',
                  'apic', 'apmVersion', 'chipset', 'nrsocket']
        mapping = {
            "bogomips": "bogomips",
            "cache": "cache",
            "model": "model",
            "platform": "architecture",
            "type": "vendor",
            "model_rev": "stepping",
            "model_number": "family",
            "model_ver": "version",
            "model_version": "version",
            "speed": "mhz",
            "count": "nrcpu",
            "socket_count": "nrsocket",
            "other": "flags",
            "desc": None,
            'class': None,
        }
        # now instantiate this class
        Device.__init__(self, fields, dict, mapping)
        self.sequence = "rhn_cpu_id_seq"
        if not dict:
            return
        if self.data.get("cpu_arch_id") is not None:
            return  # all fine, we have the arch
        # if we don't have an architecture, guess it
        if not self.data.has_key("architecture"):
            log_error("hash does not have a platform member: %s" % dict)
            raise AttributeError("Expected a hash value for member `platform'")
        # now extract the arch field, which has to come out of rhnCpuArch
        arch = self.data["architecture"]
        row = rhnSQL.Table("rhnCpuArch", "label")[arch]
        if row is None or not row.has_key("id"):
            log_error("Can not find arch %s in rhnCpuArch" % arch)
            raise AttributeError("Invalid architecture for CPU: `%s'" % arch)
        self.data["cpu_arch_id"] = row["id"]
        del self.data["architecture"]
        if self.data.has_key("nrcpu"):  # make sure this is a number
            try:
                self.data["nrcpu"] = int(self.data["nrcpu"])
            except:
                self.data["nrcpu"] = 1
            if self.data["nrcpu"] == 0:
                self.data["nrcpu"] = 1

class NetIfaceInformation(Device):
    key_mapping = {
        'hwaddr': 'hw_addr',
        'module': 'module',
    }

    def __init__(self, dict=None):
        log_debug(4, dict)
        self.ifaces = {}
        self.db_ifaces = []
        # parameters which are not allowed to be empty and set to NULL
        self._autonull = ('hw_addr', 'module')
        if not dict:
            return
        for name, info in list(dict.items()):
            if name == 'class':
                # Ignore it
                continue
            if not isinstance(info, type({})):
                raise rhnFault(53, "Unexpected format for interface %s" %
                               name)
            vdict = {}
            for key, mapping in list(self.key_mapping.items()):
                # Look at the mapping first; if not found, look for the key
                if mapping in info:
                    k = mapping
                else:
                    k = key
                if k not in info:
                    raise rhnFault(53, "Unable to find required field %s"
                                   % key)
                val = info[k]
                vdict[mapping] = val
            if 'ipaddr' in info and info['ipaddr']:
                vdict['ipv4'] = NetIfaceAddress4(
                    [{'ipaddr': info['ipaddr'], 'broadcast': info['broadcast'], 'netmask': info['netmask']}])
            if 'ipv6' in info and info['ipv6']:
                vdict['ipv6'] = NetIfaceAddress6(info["ipv6"])
            self.ifaces[name] = vdict

    def __str__(self):
        return "<%s Class at %d: %s>\n" % (
            self.__class__.__name__,
            id(self), {
                "self.ifaces": self.ifaces,
                "self.db_ifaces": self.db_ifaces,
            })
    __repr__ = __str__

    def save(self, server_id):
        log_debug(4, self.ifaces)
        self.reload(server_id)
        log_debug(4, "Interfaces in DB", self.db_ifaces)

        # Compute updates, deletes and inserts
        inserts = []
        updates = []
        deletes = []

        ifaces = self.ifaces.copy()
        for iface in self.db_ifaces:
            name = iface['name']
            if name not in self.ifaces:
                # To be deleted
                deletes.append({'server_id': server_id, 'name': name})
                continue

            uploaded_iface = ifaces[name].copy()
            del ifaces[name]
            if _hash_eq(uploaded_iface, iface):
                # Same value
                continue
            uploaded_iface.update({'name': name, 'server_id': server_id})
            if 'ipv4' in uploaded_iface:
                del(uploaded_iface['ipv4'])
            if 'ipv6' in uploaded_iface:
                del(uploaded_iface['ipv6'])
            updates.append(uploaded_iface)

        # Everything else in self.ifaces has to be inserted
        for name, info in list(ifaces.items()):
            iface = {}
            iface['name'] = name
            iface['server_id'] = server_id
            iface['hw_addr'] = info['hw_addr']
            iface['module'] = info['module']
            inserts.append(iface)

        log_debug(4, "Deletes", deletes)
        log_debug(4, "Updates", updates)
        log_debug(4, "Inserts", inserts)

        self._update(updates)
        self._insert(inserts)
        ifaces = self.ifaces.copy()
        for name, info in list(ifaces.items()):
            if not 'ipv6' in info:
                info['ipv6'] = NetIfaceAddress6()
            info['ipv6'].save(self.get_server_id(server_id, name))
            if not 'ipv4' in info:
                info['ipv4'] = NetIfaceAddress4()
            info['ipv4'].save(self.get_server_id(server_id, name))
        # delete address (if any) of deleted interaces
        for d in deletes:
            interface = NetIfaceAddress6()
            interface.save(self.get_server_id(server_id, d['name']))
            interface = NetIfaceAddress4()
            interface.save(self.get_server_id(server_id, d['name']))
        self._delete(deletes)
        return 0

    def get_server_id(self, server_id, name):
        """ retrieve id for given server_id and name """
        h = rhnSQL.prepare("select id from rhnServerNetInterface where server_id=:server_id and name=:name")
        h.execute(server_id=server_id, name=name)
        row = h.fetchone_dict()
        if row:
            return row['id']
        else:
            return None

    def _insert(self, params):
        q = """insert into rhnServerNetInterface
            (%s) values (%s)"""
        self._null_columns(params, self._autonull)

        columns = list(self.key_mapping.values()) + ['server_id', 'name']
        columns.sort()
        bind_params = ", ".join([':' + x for x in columns])
        h = rhnSQL.prepare(q % (", ".join(columns), bind_params))
        _dml(h, params)

    def _delete(self, params):
        q = """delete from rhnServerNetInterface
            where %s"""

        columns = ['server_id', 'name']
        wheres = ['%s = :%s' % (x, x) for x in columns]
        h = rhnSQL.prepare(q % " and ".join(wheres))
        _dml(h, params)

    def _update(self, params):
        q = """update rhnServerNetInterface
            set %s
            where %s"""
        self._null_columns(params, self._autonull)

        wheres = ['server_id', 'name']
        wheres = ['%s = :%s' % (x, x) for x in wheres]
        wheres = " and ".join(wheres)

        updates = list(self.key_mapping.values())
        updates.sort()
        updates = ['%s = :%s' % (x, x) for x in updates]
        updates = ", ".join(updates)

        h = rhnSQL.prepare(q % (updates, wheres))
        _dml(h, params)

    def reload(self, server_id):
        h = rhnSQL.prepare("""
            select *
            from rhnServerNetInterface
            where server_id = :server_id
        """)
        h.execute(server_id=server_id)
        self.db_ifaces = []
        while 1:
            row = h.fetchone_dict()
            if not row:
                break
            hval = {'primary_id': row['id'], 'name': row['name'], 'server_id': server_id}
            for key in list(self.key_mapping.values()):
                hval[key] = row[key]
            hval['ipv4'] = NetIfaceAddress4()
            hval['ipv4'].reload(hval['primary_id'])
            hval['ipv6'] = NetIfaceAddress6()
            hval['ipv6'].reload(hval['primary_id'])
            self.db_ifaces.append(hval)

        self.status = 0
        return 0

class FQDNInformation(Device):
    """ This is a wrapper class for the FQDN information (rhnServerFQDN) """
    table = "rhnServerFQDN"

    def __init__(self, dict=None):
        fields = ["name"]
        unique = ["name"]
        mapping = {'class': None}
        Device.__init__(self, fields, dict, mapping)
        self._autonull = ('name')
        self.sequence = "rhn_serverfqdn_id_seq"

class NetIfaceAddress(Device):
    key_mapping = {
        'netmask': 'netmask',
        'address': 'address',
    }
    unique = ['address']  # to be overriden by child
    table = 'rhnServerNetAddress'  # to be overriden by child

    def __init__(self, list_ifaces=None):
        log_debug(4, list_ifaces)
        self.ifaces = {}
        self.db_ifaces = []
        # parameters which are not allowed to be empty and set to NULL
        self._autonull = ('address', 'netmask')
        self.sequence = "rhn_srv_net_iface_id_seq"
        if not list_ifaces:
            return
        for info in list_ifaces:
            if not isinstance(info, type({})):
                raise rhnFault(53, "Unexpected format for interface %s" %
                               info)
            vdict = {}
            for key, mapping in list(self.key_mapping.items()):
                # Look at the mapping first; if not found, look for the key
                if mapping in info:
                    k = mapping
                else:
                    k = key
                if k not in info:
                    raise rhnFault(53, "Unable to find required field %s"
                                   % (key))
                val = info[k]
                if mapping in ['ip_addr', 'netmask', 'broadcast', 'address']:
                    # bugzilla: 129840 kudzu (rhpl) will sometimes pad octets
                    # with leading zeros, causing confusion; clean those up
                    val = self.cleanse_ip_addr(val)
                vdict[mapping] = val
            self.ifaces[vdict['address']] = vdict

    def __str__(self):
        return "<%s Class at %d: %s>\n" % (
            self.__class__.__name__,
            id(self), {
                "self.ifaces": self.ifaces,
                "self.db_ifaces": self.db_ifaces,
            })
    __repr__ = __str__

    def cleanse_ip_addr(self, val):
        """ to be overriden by child """
        return val

    def save(self, interface_id):
        log_debug(4, self.ifaces)
        self.reload(interface_id)
        log_debug(4, "Net addresses in DB", self.db_ifaces)

        # Compute updates, deletes and inserts
        inserts = []
        updates = []
        deletes = []
        ifaces = self.ifaces.copy()
        for iface in self.db_ifaces:
            address = iface['address']
            if iface['address'] not in self.ifaces:
                # To be deleted
                # filter out params, which are not used in query
                iface = dict((column, iface[column]) for column in self.unique)
                deletes.append(iface)
                continue
            uploaded_iface = ifaces[address]
            del ifaces[address]
            # FIXME this is inefficient for IPv4 as it row is present it will be always update
            if _hash_eq(uploaded_iface, iface):
                # Same value
                continue
            uploaded_iface.update({'interface_id': interface_id})
            updates.append(uploaded_iface)

        # Everything else in self.ifaces has to be inserted
        for name, iface in list(ifaces.items()):
            iface['address'] = iface['address']
            iface['interface_id'] = interface_id
            inserts.append(iface)

        log_debug(4, "Deletes", deletes)
        log_debug(4, "Updates", updates)
        log_debug(4, "Inserts", inserts)

        self._delete(deletes)
        self._update(updates)
        self._insert(inserts)

    def _insert(self, params):
        q = """insert into %s
            (%s) values (%s)"""
        self._null_columns(params, self._autonull)

        columns = list(self.key_mapping.values()) + ['interface_id']
        columns.sort()
        bind_params = ", ".join([':' + x for x in columns])
        h = rhnSQL.prepare(q % (self.table, ", ".join(columns), bind_params))
        _dml(h, params)

    def _delete(self, params):
        q = """delete from %s
            where %s"""

        columns = self.unique
        wheres = ['%s = :%s' % (x, x) for x in columns]
        h = rhnSQL.prepare(q % (self.table, " and ".join(wheres)))
        _dml(h, params)

    def _update(self, params):
        q = """update %s
            set %s
            where %s"""
        self._null_columns(params, self._autonull)

        wheres = self.unique
        wheres = ['%s = :%s' % (x, x) for x in wheres]
        wheres = " and ".join(wheres)

        updates = list(self.key_mapping.values())
        updates.sort()
        updates = ['%s = :%s' % (x, x) for x in updates]
        updates = ", ".join(updates)

        h = rhnSQL.prepare(q % (self.table, updates, wheres))
        _dml(h, params)

    def reload(self, interface_id):
        h = rhnSQL.prepare("""
            select *
            from %s
            where interface_id = :interface_id
            order by interface_id
        """ % self.table)
        h.execute(interface_id=interface_id)
        self.db_ifaces = []
        while 1:
            row = h.fetchone_dict()
            if not row:
                break
            hval = {'interface_id': row['interface_id']}
            for key in list(self.key_mapping.values()):
                hval[key] = row[key]
            self.db_ifaces.append(hval)

        self.status = 0
        return 0


class NetIfaceAddress6(NetIfaceAddress):

    """ IPv6 Network interface """
    key_mapping = {
        'netmask': 'netmask',
        'addr': 'address',
        'scope': 'scope',
    }
    table = 'rhnServerNetAddress6'
    unique = ['interface_id', 'address', 'scope']

    def __init__(self, addr_dict=None):
        NetIfaceAddress.__init__(self, addr_dict)
        self._autonull = ('address', 'netmask', 'scope')


class NetIfaceAddress4(NetIfaceAddress):

    """ IPv4 Network interface """
    key_mapping = {
        'netmask': 'netmask',
        'ipaddr': 'address',
        'broadcast': 'broadcast',
    }
    table = 'rhnServerNetAddress4'
    unique = ['interface_id']

    def __init__(self, addr_dict=None):
        NetIfaceAddress.__init__(self, addr_dict)
        self._autonull = ('address', 'netmask', 'broadcast')

    def cleanse_ip_addr(self, val):
        return cleanse_ip_addr(val)


def _hash_eq(h1, h2):
    """ Compares two hashes and return 1 if the first is a subset of the second """
    log_debug(5, h1, h2)
    for k, v in list(h1.items()):
        if k not in h2:
            return 0
        if h2[k] != v:
            return 0
    return 1


def _dml(statement, params):
    log_debug(5, params)
    if not params:
        return 0
    params = _transpose(params)
    statement.executemany(**params)

def _transpose(hasharr):
    """ Transpose the array of hashes into a hash of arrays """
    if not hasharr:
        return {}
    keys = list(hasharr[0].keys())
    result = {}
    for k in keys:
        result[k] = []

    for hval in hasharr:
        for k in keys:
            if k in hval:
                result[k].append(hval[k])
            else:
                result[k].append(None)

    return result


class MemoryInformation(Device):

    """ Memory information """
    table = "rhnRAM"

    def __init__(self, dict=None):
        fields = ["ram", "swap"]
        mapping = {"class": None}
        Device.__init__(self, fields, dict, mapping)
        # use our own sequence
        self.sequence = "rhn_ram_id_seq"
        if not dict:
            return
        # Sometimes we get sent a NNNNL number and we need to strip the L
        for k in fields:
            if not self.data.has_key(k):
                continue
            if self.data[k] in [None, "None", ""]:
                self.data[k] = -1
            self.data[k] = str(self.data[k])
            if self.data[k][-1] == 'L':
                self.data[k] = self.data[k][:-1]


class DMIInformation(Device):

    """ DMI information """
    table = "rhnServerDMI"

    def __init__(self, dict=None):
        fields = ["vendor", "system", "product", "asset", "board",
                  "bios_vendor", "bios_version", "bios_release"]
        mapping = {"class": None}
        Device.__init__(self, fields, dict, mapping)
        # use our own sequence
        self.sequence = "rhn_server_dmi_id_seq"
        self._autonull = ("vendor", "system", "product", "asset", "board",
                          "bios_vendor", "bios_version", "bios_release")
        if not dict:
            return

        # deal with hardware with insanely long dmi strings...
        for key, value in list(self.data.items()):
            # Some of the values may be None
            if value and isinstance(value, type("")):
                self.data[key] = value[:256]


class InstallInformation(Device):

    """ Install information """
    table = "rhnServerInstallInfo"

    def __init__(self, dict=None):
        fields = ['install_method', 'iso_status', 'mediasum']
        mapping = {
            'class': None,
            'installmethod': 'install_method',
            'isostatus': 'iso_status',
            'mediasum': 'mediasum',
        }
        Device.__init__(self, fields, dict, mapping)
        self.sequence = 'rhn_server_install_info_id_seq'

class SystemInformation():
    def __init__(self, hw=None, guest=None):
        log_debug(4, hw, guest)
        if not hw or "identifier" not in hw or not guest:
            # incomplete data
            log_debug(1, "incomplete data")
            return
        host = rhnSQL.Row("rhnServer", "digital_server_id")
        host.load(hw['identifier'])
        hid = host.get('id')
        guest.user = rhnUser.User("", "")
        guest.user.reload(guest.server['creator_id'])
        guestid = guest.getid()
        if not hid:
            # create a new host entry
            host = server_class.Server(guest.user, hw.get('arch'))
            host.server["name"] = hw.get('name')
            host.server["os"] = hw.get('os')
            host.server["release"] = hw.get('type')
            host.server["last_boot"] = time.time()
            host.default_description()
            host.virt_type = rhnVirtualization.VirtualizationType.FULLY
            host.virt_uuid = None
            fake_token = False
            if not rhnFlags.test("registration_token"):
                # we need to fake it
                rhnFlags.set("registration_token", 'fake')
                fake_token = True
            host.save(1, None)
            host.server["digital_server_id"] = hw['identifier']
            entitle_server = rhnSQL.Procedure("rhn_entitlements.entitle_server")
            entitle_server(host.getid(), 'foreign_entitled')
            host.save(1, None)
            if fake_token:
                rhnFlags.set("registration_token", None)

            hid = host.getid()
            host.reload(hid)
            log_debug(4, "New host created: ", host)
        else:
            host = server_class.Server(None)
            host.reload(hid)
            host.checkin(commit=0)
            log_debug(4, "Found host: ", host)
        host.reload_hardware()
        hostcpu = host.hardware_by_class(CPUDevice)
        if hostcpu and len(hostcpu) > 0:
            hostcpu = hostcpu[0].data
        else:
            hostcpu = None
        if not hostcpu or str(hostcpu.get('nrsocket')) != hw.get('total_ifls'):
            # update only if the number has changed
            log_debug(1, "update host cpu:", hw.get('total_ifls'))
            cpu = {
                'class' : 'CPU',
                'desc' : 'Processor',
                'count' : hw.get('total_ifls'),
                'model_ver' : '',
                'speed' : '0',
                'cache' : '',
                'model_number' : '',
                'bogomips' : '',
                'socket_count' : hw.get('total_ifls'),
                'platform' : hw.get('arch'),
                'other' : '',
                'model_rev' : '',
                'model' : hw.get('arch'),
                'type' : hw.get('type')}
            host.delete_hardware()
            host.add_hardware(cpu)
            host.save_hardware()

        h = rhnSQL.prepare("""
            select host_system_id
              from rhnVirtualInstance
             where virtual_system_id = :guestid""")
        h.execute(guestid=guestid)
        row = h.fetchone_dict()
        if not row or not row['host_system_id']:
            self._insert_virtual_instance(hid, None, fakeuuid=False)
            self._insert_virtual_instance(hid, guestid, fakeuuid=True)
        elif row['host_system_id'] != hid:
            log_debug(4, "update_virtual_instance", hid, guestid)
            q_update = rhnSQL.prepare("""
                UPDATE rhnVirtualInstance
                   SET host_system_id = :host_id
                 WHERE virtual_system_id = :guest_id
                   AND host_system_id = :old_host_id
            """)
            q_update.execute(host_id=hid, guest_id=guestid, old_host_id=row['host_system_id'])


    def _insert_virtual_instance(self, hostid, guestid, fakeuuid=True):
        log_debug(4, hostid, guestid, fakeuuid)
        viid = rhnSQL.Sequence('rhn_vi_id_seq')()
        q_insert = rhnSQL.prepare("""
            INSERT INTO rhnVirtualInstance
                (id, host_system_id, virtual_system_id, uuid, confirmed)
            VALUES
                (:viid, :host_id, :guest_id, :uuid, 1)
        """)
        fake_uuid = None
        if fakeuuid:
            fake_uuid = str(uuid.uuid4())
            fake_uuid = fake_uuid.replace('-', '').strip()
        q_insert.execute(viid=viid, host_id=hostid, guest_id=guestid, uuid=fake_uuid)

        q_insert = rhnSQL.prepare("""
            INSERT INTO rhnVirtualInstanceInfo
                (instance_id, state, instance_type)
            VALUES
                (:viid,
                 (
                     SELECT rvis.id
                     FROM rhnVirtualInstanceState rvis
                     WHERE rvis.label = 'unknown'
                 ),
                 (
                     SELECT rvit.id
                     FROM rhnVirtualInstanceType rvit
                     WHERE rvit.label = :virt_type
                 ))
        """)
        q_insert.execute(viid=viid, virt_type='fully_virtualized')


class MachineInformation:

    def __init__(self, sysid, name=None, data=None):
        machine_id = data.get("machine_id") if data and "machine_id" in data else None
        if not name:
            name = "unknown"
        log_debug(4, "updating machine_id", sysid, name, machine_id)
        existing_srv_id = self.__check_if_machine_id_exists(machine_id)
        if not existing_srv_id or existing_srv_id == sysid:
            s_update = rhnSQL.prepare("""
                        UPDATE rhnServer
                           SET machine_id = :machine_id
                        WHERE id = :server_id
                        """)
            s_update.execute(machine_id=machine_id, server_id=sysid)
        else:
            # this indicate a forced re-registration and we need to remove the old rhnServer
            log_debug(0, "Found duplicate server. Re-registration expected. Deleting existing: ", existing_srv_id)
            delete_server = rhnSQL.Procedure("delete_server")
            try:
                delete_server(existing_srv_id)
            except rhnSQL.SQLError:
                log_error("Error deleting server: %s" % existing_srv_id)

    def __check_if_machine_id_exists(self, machine_id):
        if machine_id:
            h = rhnSQL.prepare('SELECT id FROM rhnServer WHERE machine_id = :machine_id')
            h.execute(machine_id=machine_id)
            d = h.fetchone_dict()
            if d:
                return d['id']
        return None


class Hardware:

    """ Support for the hardware items """

    def __init__(self):
        self.__hardware = {}
        self.__loaded = 0
        self.__changed = 0

    def hardware_by_class(self, device_class):
        return self.__hardware[device_class]

    def add_hardware(self, hardware):
        """ add new hardware """
        log_debug(4, hardware)
        if not hardware:
            return -1
        if type(hardware) == type({}):
            hardware = UserDictCase(hardware)
        if not isinstance(hardware, UserDictCase):
            log_error("argument type is not  hash: %s" % hardware)
            raise TypeError("This function requires a hash as an argument")
        # validation is important
        hw_class = hardware.get("class")
        if hw_class is None:
            return -1
        hw_class = hw_class.lower()

        class_type = None

        if hw_class in ["video", "audio", "audio_hd", "usb", "other", "hd", "floppy",
                        "mouse", "modem", "network", "cdrom", "scsi",
                        "unspec", "scanner", "tape", "capture", "raid",
                        "socket", "keyboard", "printer", "firewire", "ide"]:
            class_type = HardwareDevice
        elif hw_class == "cpu":
            class_type = CPUDevice
        elif hw_class == "memory":
            class_type = MemoryInformation
        elif hw_class == "dmi":
            class_type = DMIInformation
        elif hw_class == "installinfo":
            class_type = InstallInformation
        elif hw_class == "netinterfaces":
            class_type = NetIfaceInformation
        elif hw_class == "fqdn":
            class_type = FQDNInformation
        elif hw_class == "sysinfo":
            # special case: we got info about a virtual host
            # where this system is running on
            SystemInformation(hardware, self)
            return 0
        elif hw_class == "machineinfo":
            MachineInformation(self.server["id"], self.server["name"], hardware)
            return 0
        else:
            log_error("UNKNOWN CLASS TYPE `%s'" % hw_class)
            # Same trick: try-except and raise the exception so that Traceback
            # can send the e-mail
            try:
                raise KeyError("Unknown class type `%s' for hardware '%s'" % (
                    hw_class, hardware))
            except:
                Traceback(mail=1)
                return

        # create the new device
        new_dev = class_type(hardware)

        if class_type in self.__hardware:
            _l = self.__hardware[class_type]
        else:
            _l = self.__hardware[class_type] = []
        _l.append(new_dev)
        self.__changed = 1
        return 0

    def delete_hardware(self, sysid=None):
        """ This function deletes all hardware. """
        log_debug(4, sysid)
        if not self.__loaded:
            self.reload_hardware_byid(sysid)
        hardware = self.__hardware
        if hardware == {}:
            # nothing to delete
            return 0
        self.__changed = 1

        self.__reset_machine_id(sysid)

        for device_type in list(hardware.keys()):
            for hw in hardware[device_type]:
                hw.status = 2  # deleted

            # filter out the hardware that was just added and then
            # deleted before saving
            hardware[device_type] = [a for a in hardware[device_type] if not (a.status == 2 and hasattr(a, "id") and a.id == 0)]
        return 0

    def __reset_machine_id(self, sysid):
        """ Sets rhnServer.machine_id to null """
        MachineInformation(sysid)

    def save_hardware_byid(self, sysid):
        """Save the hardware list """
        log_debug(3, sysid, "changed = %s" % self.__changed)
        hardware = self.__hardware
        if hardware == {}:  # nothing loaded
            return 0
        if not self.__changed:
            return 0
        for device_type, hw_list in list(hardware.items()):
            for hw in hw_list:
                hw.save(sysid)
        self.__changed = 0
        return 0

    def __load_from_db(self, DevClass, sysid):
        """ Load a certain hardware class from the database """
        if DevClass not in self.__hardware:
            self.__hardware[DevClass] = []

        h = rhnSQL.prepare("select id from %s where server_id = :sysid" % DevClass.table)
        h.execute(sysid=sysid)
        rows = h.fetchall_dict() or []

        for device in rows:
            dev_id = device['id']
            dev = DevClass()
            dev.reload(dev_id)
            self.__hardware[DevClass].append(dev)

    def reload_hardware_byid(self, sysid):
        """ load all hardware devices for a server """
        log_debug(4, sysid)
        if not sysid:
            return -1
        self.__hardware = {}  # discard what was already loaded
        # load from all hardware databases
        self.__load_from_db(HardwareDevice, sysid)
        self.__load_from_db(CPUDevice, sysid)
        self.__load_from_db(DMIInformation, sysid)
        self.__load_from_db(MemoryInformation, sysid)
        self.__load_from_db(InstallInformation, sysid)
        self.__load_from_db(FQDNInformation, sysid)

        net_iface_info = NetIfaceInformation()
        net_iface_info.reload(sysid)
        self.__hardware[NetIfaceInformation] = [net_iface_info]

        # now set the flag
        self.__changed = 0
        self.__loaded = 1
        return 0


MACHINE_ID_EMAIL_TEMPLATE = """A non-unique machine_id has been detected: "{0}"

This is expected behavior when using cloned images of systems.
Solution: Generate a new machine_id for system "{2} ({1})"

For SLES12+ and RHEL7:
  # rm -f /var/lib/dbus/machine-id
  # rm -f /etc/machine-id
  # dbus-uuidgen --ensure
  # systemd-machine-id-setup
  # rhn-profile-sync


For SLES11 and RHEL5/RHEL6:
  # rm /var/lib/dbus/machine-id
  # dbus-uuidgen --ensure
  # rhn-profile-sync


For more information on generating a new machine_id for traditional systems refer to:
{3}
"""
070701000001C3000081B40000000000000000000000015FBBE8EE000007E0000000000000000000000000000000000000003500000000spacewalk-backend/server/rhnServer/server_history.py  #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# Class for handling and updating the server history.
#

from spacewalk.common.rhnLog import log_debug
from spacewalk.server import rhnSQL

# these are kind of out there...
MAX_SUMMARY = 128
MAX_DETAILS = 4000


class History:

    def __init__(self):
        self.__h = []

    def add_history(self, summary, details=""):
        """ Add a history event to the server. """
        log_debug(4, summary)
        if details == '':
            self.__h.append((summary[:MAX_SUMMARY], None))
        else:
            self.__h.append((summary[:MAX_SUMMARY], details[:MAX_DETAILS]))

    def save_history_byid(self, server_id):
        log_debug(3, server_id, "%d history events" % len(self.__h))
        if not self.__h:
            return 0
        hist = rhnSQL.prepare("""
            insert into rhnServerHistory
                (id,
                 server_id,
                 summary,
                 details)
            values
                (sequence_nextval('rhn_event_id_seq'),
                 :server_id,
                 :summary,
                 :details)
        """)
        summaries = [x[0] for x in self.__h]
        details = [x[1] for x in self.__h]
        server_ids = [server_id] * len(self.__h)
        hist.executemany(server_id=server_ids, summary=summaries,
                         details=details)
        # Clear the history cache
        self.__h = []
        return 0
070701000001C4000081B40000000000000000000000015FBBE8EE00006F1A000000000000000000000000000000000000003700000000spacewalk-backend/server/rhnServer/server_kickstart.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Kickstart-related operations
#

import sys

from spacewalk.common import rhnFlags
from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.common.rhnException import rhnException
from spacewalk.server import rhnSQL, rhnAction, rhnLib, rhnChannel


def update_kickstart_session(server_id, action_id, action_status,
                             kickstart_state, next_action_type):
    log_debug(3, server_id, action_id, action_status, kickstart_state, next_action_type)

    # Is this a kickstart-related action?
    ks_session_id = get_kickstart_session_id(server_id, action_id)
    if ks_session_id is None:
        # Nothing more to do
        log_debug(4, "Kickstart session not found")
        return None

    # Check the current action state
    if action_status == 2:
        # Completed
        ks_status = kickstart_state
        # Get the next action - it has to be of the right type
        next_action_id = get_next_action_id(action_id, next_action_type)
    elif action_status == 3:
        # Failed
        ks_status = 'failed'
        next_action_id = None
    else:
        raise rhnException("Invalid action state %s" % action_status)

    update_ks_session_table(ks_session_id, ks_status, next_action_id,
                            server_id)
    return ks_session_id

_query_update_ks_session_table = rhnSQL.Statement("""
    update rhnKickstartSession
       set action_id = :action_id,
           state_id = :ks_status_id,
           new_server_id = :server_id
     where id = :ks_session_id
""")


def update_ks_session_table(ks_session_id, ks_status, next_action_id,
                            server_id):
    log_debug(4, ks_session_id, ks_status, next_action_id, server_id)
    ks_table = rhnSQL.Table('rhnKickstartSessionState', 'label')
    ks_status_id = ks_table[ks_status]['id']

    h = rhnSQL.prepare(_query_update_ks_session_table)
    h.execute(ks_session_id=ks_session_id, ks_status_id=ks_status_id,
              action_id=next_action_id, server_id=server_id)

    if ks_status == 'complete':
        delete_guests(server_id)

_query_lookup_guests_for_host = rhnSQL.Statement("""
    select virtual_system_id from rhnVirtualInstance
        where host_system_id = :server_id
""")
_query_delete_virtual_instances = rhnSQL.Statement("""
    delete from rhnVirtualInstance where host_system_id = :server_id
""")


def delete_guests(server_id):
    """
    Callback used after a successful kickstart to remove any guest virtual
    instances, as well as their associated servers.
    """
    # First delete all the guest server objects:
    h = rhnSQL.prepare(_query_lookup_guests_for_host)
    h.execute(server_id=server_id)
    delete_server = rhnSQL.Procedure("delete_server")
    log_debug(4, "Deleting guests")
    while 1:
        row = h.fetchone_dict()
        if not row:
            break
        guest_id = row['virtual_system_id']
        log_debug(4, 'Deleting guest server: %s' % guest_id)
        try:
            if guest_id is not None:
                delete_server(guest_id)
        except rhnSQL.SQLError:
            log_error("Error deleting server: %s" % guest_id)

    # Finally delete all the virtual instances:
    log_debug(4, "Deleting all virtual instances for host")
    h = rhnSQL.prepare(_query_delete_virtual_instances)
    h.execute(server_id=server_id)

    # Commit all changes:
    try:
        rhnSQL.commit()
    except rhnSQL.SQLError:
        e = sys.exc_info()[1]
        log_error("Error committing transaction: %s" % e)
        rhnSQL.rollback()


_query_get_next_action_id = rhnSQL.Statement("""
    select a.id
      from rhnAction a, rhnActionType at
     where a.prerequisite = :action_id
       and a.action_type = at.id
       and at.label = :next_action_type
""")


def get_next_action_id(action_id, next_action_type=None):
    if not next_action_type:
        return None
    h = rhnSQL.prepare(_query_get_next_action_id)
    h.execute(action_id=action_id, next_action_type=next_action_type)
    row = h.fetchone_dict()
    if not row:
        return None
    return row['id']

_query_lookup_kickstart_session_id = rhnSQL.Statement("""
    select ks.id
      from rhnKickstartSession ks
     where (
             (ks.old_server_id = :server_id and ks.new_server_id is NULL)
             or ks.new_server_id = :server_id
             or ks.host_server_id = :server_id
           )
       and ks.action_id = :action_id
""")


def get_kickstart_session_id(server_id, action_id):
    h = rhnSQL.prepare(_query_lookup_kickstart_session_id)
    h.execute(server_id=server_id, action_id=action_id)

    row = h.fetchone_dict()
    if not row:
        # Nothing to do
        return None
    return row['id']


_query_insert_package_delta = rhnSQL.Statement("""
    insert into rhnPackageDelta (id, label)
    values (:package_delta_id, 'ks-delta-' || :package_delta_id)
""")
_query_insert_action_package_delta = rhnSQL.Statement("""
    insert into rhnActionPackageDelta (action_id, package_delta_id)
    values (:action_id, :package_delta_id)
""")
_query_insert_package_delta_element = rhnSQL.Statement("""
    insert into rhnPackageDeltaElement
           (package_delta_id, transaction_package_id)
    values
           (:package_delta_id,
            lookup_transaction_package(:operation, :n, :e, :v, :r, :a))
""")


def schedule_kickstart_delta(server_id, kickstart_session_id,
                             installs, removes):
    log_debug(3, server_id, kickstart_session_id)
    row = get_kickstart_session_info(kickstart_session_id, server_id)
    org_id = row['org_id']
    scheduler = row['scheduler']

    action_id = rhnAction.schedule_server_action(
        server_id,
        action_type='packages.runTransaction', action_name="Package delta",
        delta_time=0, scheduler=scheduler, org_id=org_id,
    )

    package_delta_id = rhnSQL.Sequence('rhn_packagedelta_id_seq').next()

    h = rhnSQL.prepare(_query_insert_package_delta)
    h.execute(package_delta_id=package_delta_id)

    h = rhnSQL.prepare(_query_insert_action_package_delta)
    h.execute(action_id=action_id, package_delta_id=package_delta_id)

    h = rhnSQL.prepare(_query_insert_package_delta_element)
    col_names = ['n', 'v', 'r', 'e']
    __execute_many(h, installs, col_names, operation='insert', a=None,
                   package_delta_id=package_delta_id)
    __execute_many(h, removes, col_names, operation='delete', a=None,
                   package_delta_id=package_delta_id)

    update_ks_session_table(kickstart_session_id, 'package_synch_scheduled',
                            action_id, server_id)

    return action_id


def schedule_kickstart_sync(server_id, kickstart_session_id):
    row = get_kickstart_session_info(kickstart_session_id, server_id)
    org_id = row['org_id']
    scheduler = row['scheduler']

    # Create a new action
    action_id = rhnAction.schedule_server_action(
        server_id,
        action_type='kickstart.schedule_sync',
        action_name="Schedule a package sync",
        delta_time=0, scheduler=scheduler, org_id=org_id,
    )
    return action_id


def _get_ks_virt_type(type_id):
    _query_kickstart_virt_type = rhnSQL.Statement("""
        select  label
        from    rhnKickstartVirtualizationType kvt
        where   kvt.id = :id
    """)
    prepared_query = rhnSQL.prepare(_query_kickstart_virt_type)
    prepared_query.execute(id=type_id)
    row = prepared_query.fetchone_dict()

    # XXX: we should have better constraints on the db so this doesn't happen.
    if not row:
        kstype = 'auto'
    else:
        kstype = row['label']
    log_debug(1, "KS_TYPE: %s" % kstype)
    return kstype


def get_kickstart_session_type(server_id, action_id):
    ks_session_id = get_kickstart_session_id(server_id, action_id)
    ks_session_info = get_kickstart_session_info(ks_session_id, server_id)
    ks_type_id = ks_session_info['virtualization_type']
    ks_type = _get_ks_virt_type(ks_type_id)
    return ks_type


def subscribe_to_tools_channel(server_id, kickstart_session_id):
    log_debug(3)
    row = get_kickstart_session_info(kickstart_session_id, server_id)
    org_id = row['org_id']
    scheduler = row['scheduler']
    ks_type_id = row['virtualization_type']
    ks_type = _get_ks_virt_type(ks_type_id)

    if ks_type == 'para_host':
        action_id = rhnAction.schedule_server_action(
            server_id,
            action_type='kickstart_host.add_tools_channel',
            action_name='Subscribe server to the Tools channel.',
            delta_time=0, scheduler=scheduler, org_id=org_id,
        )
    elif ks_type == 'para_guest':
        action_id = rhnAction.schedule_server_action(
            server_id,
            action_type='kickstart_guest.add_tools_channel',
            action_name='Subscribe guest to the Tools channel.',
            delta_time=0, scheduler=scheduler, org_id=org_id,
        )
    else:
        action_id = None
    return action_id


def schedule_virt_pkg_install(server_id, kickstart_session_id):
    log_debug(3)
    row = get_kickstart_session_info(kickstart_session_id, server_id)
    org_id = row['org_id']
    scheduler = row['scheduler']
    ks_type_id = row['virtualization_type']
    log_debug(1, "VIRTUALIZATION_TYPE: %s" % str(ks_type_id))
    ks_type = _get_ks_virt_type(ks_type_id)
    log_debug(1, "VIRTUALZIATION_TYPE_LABEL: %s" % str(ks_type))

    if ks_type == 'para_host':
        log_debug(1, "SCHEDULING VIRT HOST PACKAGE INSTALL...")
        action_id = rhnAction.schedule_server_action(
            server_id,
            action_type='kickstart_host.schedule_virt_host_pkg_install',
            action_name="Schedule install of mgr-virtualization-host package.",
            delta_time=0, scheduler=scheduler, org_id=org_id,
        )
    elif ks_type == 'para_guest':
        log_debug(1, "SCHEDULING VIRT GUEST PACKAGE INSTALL...")
        action_id = rhnAction.schedule_server_action(
            server_id,
            action_type='kickstart_guest.schedule_virt_guest_pkg_install',
            action_name="Schedule install of mgr-virtualization-guest package.",
            delta_time=0, scheduler=scheduler, org_id=org_id,
        )
    else:
        log_debug(1, "NOT A VIRT KICKSTART")
        action_id = None

    return action_id

_query_ak_deploy_config = rhnSQL.Statement("""
select rt.deploy_configs
  from rhnKickstartSession ks,
       rhnKickstartDefaultRegToken kdrt,
       rhnRegToken rt
 where ks.kickstart_id = kdrt.kickstart_id
   and kdrt.regtoken_id = rt.id
   and ks.id = :session_id
""")
# Make sure the activation keys associated with this kickstart profile
# have enabled deploying config files. Only deploy configs if at least one
# of them has. This is replacing code that didn't work because the
# rhnFlags('registration_token') could not be set during the rhn_check call.


def ks_activation_key_deploy_config(kickstart_session_id):
    h = rhnSQL.prepare(_query_ak_deploy_config)
    h.execute(session_id=kickstart_session_id)
    rows = h.fetchall_dict()
    if rows:
        for row in rows:
            if row['deploy_configs'] and row['deploy_configs'] == 'Y':
                return True
    return False

_query_schedule_config_files = rhnSQL.Statement("""
    insert into rhnActionConfigRevision
           (id, action_id, server_id, config_revision_id)
    select sequence_nextval('rhn_actioncr_id_seq'), :action_id,
           server_id, config_revision_id
      from (
            select distinct scc.server_id,
                   cf.latest_config_revision_id config_revision_id
              from rhnServerConfigChannel scc,
                   rhnConfigChannelType cct,
                   rhnConfigChannel cc,
                   rhnConfigFile cf,
                   rhnConfigFileState cfs
             where scc.server_id = :server_id
               and scc.config_channel_id = cf.config_channel_id
               and cf.config_channel_id = cc.id
               and cc.confchan_type_id = cct.id
               and cct.label in ('normal', 'local_override')
               and cf.latest_config_revision_id is not null
               and cf.state_id = cfs.id
               and cfs.label = 'alive'
            ) X
""")


def schedule_config_deploy(server_id, action_id, kickstart_session_id,
                           server_profile):
    """ schedule a configfiles.deploy action dependent on the current action """
    log_debug(3, server_id, action_id, kickstart_session_id)
    row = get_kickstart_session_info(kickstart_session_id, server_id)
    org_id = row['org_id']
    scheduler = row['scheduler']
    deploy_configs = (row['deploy_configs'] == 'Y'
                      and ks_activation_key_deploy_config(kickstart_session_id))

    if not deploy_configs:
        # Nothing more to do here
        update_ks_session_table(kickstart_session_id, 'complete',
                                next_action_id=None, server_id=server_id)
        return None

    if server_profile:
        # Have to schedule a package deploy action
        aid = schedule_rhncfg_install(server_id, action_id, scheduler,
                                      server_profile)
    else:
        aid = action_id

    next_action_id = rhnAction.schedule_server_action(
        server_id,
        action_type='configfiles.deploy',
        action_name='Deploy config files',
        delta_time=0, scheduler=scheduler, org_id=org_id,
        prerequisite=aid,
    )
    # Deploy all of the config files that are part of this server's config
    # channels
    h = rhnSQL.prepare(_query_schedule_config_files)
    h.execute(server_id=server_id, action_id=next_action_id)
    update_ks_session_table(kickstart_session_id, 'configuration_deploy',
                            next_action_id, server_id)
    return next_action_id


class MissingBaseChannelError(Exception):
    pass


def schedule_rhncfg_install(server_id, action_id, scheduler,
                            server_profile=None):
    capability = 'rhn-config-action'
    try:
        packages = _subscribe_server_to_capable_channels(server_id, scheduler,
                                                         capability)
    except MissingBaseChannelError:
        log_debug(2, "No base channel", server_id)
        return action_id

    if not packages:
        # No channels offer this capability
        log_debug(3, server_id, action_id,
                  "No channels to provide %s found" % capability)
        # No new action needed here
        return action_id

    if not server_profile:
        server_profile = get_server_package_profile(server_id)

    # Make the package profile a hash, for easier checking
    sphash = {}
    for p in server_profile:
        sphash[tuple(p)] = None

    packages_to_install = []
    for p in packages:
        key = (p['name'], p['version'], p['release'], p['epoch'])
        if key not in sphash:
            packages_to_install.append(p['package_id'])

    if not packages_to_install:
        # We already have these packages installed
        log_debug(4, "No packages needed to be installed")
        return action_id

    log_debug(4, "Scheduling package install action")
    new_action_id = schedule_package_install(server_id, action_id, scheduler,
                                             packages_to_install)
    return new_action_id

_query_lookup_subscribed_server_channels = rhnSQL.Statement("""
    select sc.channel_id,
           case when c.parent_channel is not null then 0 else 1 end is_base_channel
      from rhnServerChannel sc, rhnChannel c
     where sc.server_id = :server_id
       and sc.channel_id = c.id
""")
_query_lookup_unsubscribed_server_channels = rhnSQL.Statement("""
select c.id
  from
      -- Get all the channels available to this org
      ( select cfm.channel_id
          from rhnChannelFamilyMembers cfm,
               rhnPrivateChannelFamily pcf
         where pcf.org_id = :org_id
           and pcf.channel_family_id = cfm.channel_family_id
        union
        select cfm.channel_id
          from rhnChannelFamilyMembers cfm,
               rhnPublicChannelFamily pcf
         where pcf.channel_family_id = cfm.channel_family_id) ac,
       rhnChannel c
 where c.parent_channel = :base_channel_id
   and c.id = ac.channel_id
   and  not exists (
        select 1
          from rhnServerChannel
         where server_id = :server_id
         and channel_id = c.id)
""")


def _subscribe_server_to_capable_channels(server_id, scheduler, capability):
    log_debug(4, server_id, scheduler, capability)
    # Look through the channels this server is already subscribed to
    h = rhnSQL.prepare(_query_lookup_subscribed_server_channels)
    h.execute(server_id=server_id)
    base_channel_id = None
    channels = []
    while 1:
        row = h.fetchone_dict()
        if not row:
            break
        channel_id = row['channel_id']
        if row['is_base_channel']:
            base_channel_id = channel_id
        channels.append((channel_id, 1))
    if base_channel_id is None:
        raise MissingBaseChannelError()

    org_id = rhnSQL.Table('rhnServer', 'id')[server_id]['org_id']

    # Get the child channels this system is *not* subscribed to
    h = rhnSQL.prepare(_query_lookup_unsubscribed_server_channels)
    h.execute(server_id=server_id, org_id=org_id,
              base_channel_id=base_channel_id)
    l = [(x['id'], 0) for x in h.fetchall_dict() or []]
    channels.extend(l)
    # We now have a list of channels; look for one that provides the
    # capability
    for channel_id, is_subscribed in channels:
        log_debug(5, "Checking channel:", channel_id, "; subscribed:",
                  is_subscribed)
        packages = _channel_provides_capability(channel_id, capability)
        if packages:
            if is_subscribed:
                log_debug(4, "Already subscribed; found packages", packages)
                return packages

            # Try to subscribe to it
            rhnChannel.subscribe_sql(server_id, channel_id, 0)
            log_debug(4, "Subscribed to", channel_id,
                      "Found packages", packages)
            # We subscribed to this channel - we're done
            return packages

    # No channels provide this capability - we're done
    log_debug(4, "No channels to provide capability", capability)
    return None

_query_channel_provides_capability = rhnSQL.Statement("""
    select distinct pp.package_id, pn.name, pe.version, pe.release, pe.epoch
      from rhnChannelNewestPackage cnp,
           rhnPackageProvides pp,
           rhnPackageCapability pc,
           rhnPackageName pn,
           rhnPackageEVR pe
     where cnp.channel_id = :channel_id
       and cnp.package_id = pp.package_id
       and pp.capability_id = pc.id
       and pc.name = :capability
       and cnp.name_id = pn.id
       and cnp.evr_id = pe.id
""")


def _channel_provides_capability(channel_id, capability):
    log_debug(4, channel_id, capability)
    h = rhnSQL.prepare(_query_channel_provides_capability)
    h.execute(channel_id=channel_id, capability=capability)
    ret = h.fetchall_dict()
    if not ret:
        return ret
    return ret

_query_insert_action_packages = rhnSQL.Statement("""
    insert into rhnActionPackage
           (id, action_id, name_id, evr_id, package_arch_id, parameter)
    select sequence_nextval('rhn_act_p_id_seq'), :action_id, name_id, evr_id,
           package_arch_id, 'upgrade'
      from rhnPackage
     where id = :package_id
""")


def schedule_package_install(server_id, action_id, scheduler, packages):
    if not packages:
        # Nothing to do
        return action_id
    new_action_id = rhnAction.schedule_server_action(
        server_id, action_type='packages.update',
        action_name="Package update to enable configuration deployment",
        delta_time=0, scheduler=scheduler, prerequisite=action_id,
    )
    # Add entries to rhnActionPackage
    action_ids = [new_action_id] * len(packages)
    h = rhnSQL.prepare(_query_insert_action_packages)
    h.executemany(action_id=action_ids, package_id=packages)
    return new_action_id


def __execute_many(cursor, array, col_names, **kwargs):
    """ Execute the cursor, with arguments extracted from the array
        The array is converted into a hash having col_names as keys, and adds
        whatever kwarg was specified too.
    """
    linecount = len(array)
    if not linecount:
        return
    # Transpose the array into a hash with col_names as keys
    params = rhnLib.transpose_to_hash(array, col_names)
    for k, v in list(kwargs.items()):
        params[k] = [v] * linecount

    cursor.executemany(**params)


def _packages_from_cursor(cursor):
    result = []
    while 1:
        row = cursor.fetchone_dict()
        if not row:
            break
        p_name = row['name']
        if p_name == 'gpg-pubkey':
            # We ignore GPG public keys since they are too weird to schedule
            # as a package delta
            continue
        result.append((p_name, row['version'], row['release'], row['epoch']))
    return result

_query_lookup_pending_kickstart_sessions = rhnSQL.Statement("""
    select ks.id, ks.action_id, NULL other_server_id
      from rhnKickstartSessionState kss,
           rhnKickstartSession ks
     where (
             (ks.old_server_id = :server_id and ks.new_server_id is null)
             or ks.new_server_id = :server_id
           )
       and ks.state_id = kss.id
       and kss.label not in ('complete', 'failed')
       and (:ks_session_id is null or ks.id != :ks_session_id)
""")

_query_terminate_pending_kickstart_sessions = rhnSQL.Statement("""
    update rhnKickstartSession
       set action_id = NULL,
           state_id = :state_id
     where id = :kickstart_session_id
""")


def terminate_kickstart_sessions(server_id):
    log_debug(3, server_id)
    history = []
    tokens_obj = rhnFlags.get('registration_token')
    current_ks_session_id = tokens_obj.get_kickstart_session_id()
    # ks_session_id can be null
    h = rhnSQL.prepare(_query_lookup_pending_kickstart_sessions)
    h.execute(server_id=server_id, ks_session_id=current_ks_session_id)
    log_debug(4, "current_ks_session_id", current_ks_session_id)
    ks_session_ids = []
    action_ids = []
    while 1:
        row = h.fetchone_dict()
        if not row:
            break
        ks_session_ids.append(row['id'])
        action_ids.append(row['action_id'])

    if not ks_session_ids:
        # Nothing to do
        log_debug(4, "Nothing to do", server_id, current_ks_session_id)
        return []

    ks_session_table = rhnSQL.Table('rhnKickstartSessionState', 'label')
    state_id_failed = ks_session_table['failed']['id']
    state_ids = [state_id_failed] * len(ks_session_ids)

    # Add a history item
    for ks_session_id in ks_session_ids:
        log_debug(4, "Adding history entry for session id", ks_session_id)
        history.append(("Kickstart session canceled",
                        "A kickstart session for this system was canceled because "
                        "the system was re-registered with token <strong>%s</strong>" %
                        tokens_obj.get_names()))

    h = rhnSQL.prepare(_query_terminate_pending_kickstart_sessions)

    params = {
        'kickstart_session_id': ks_session_ids,
        'state_id': state_ids,
    }
    # Terminate pending actions
    log_debug(4, "Terminating sessions", params)
    h.executemany(**params)

    # Invalidate pending actions
    for action_id in action_ids:
        if action_id is None:
            continue
        rhnAction.invalidate_action(server_id, action_id)
    return history


def get_kickstart_profile_package_profile(kickstart_session_id):
    """ Fetches the package profile from the kickstart profile (Not the session) """
    h = rhnSQL.prepare("""
        select pn.name, pe.version, pe.release, pe.epoch, pa.label
          from rhnKickstartSession ks,
               rhnKickstartDefaults kd,
               rhnServerProfilePackage spp,
               rhnPackageName pn,
               rhnPackageEVR pe,
               rhnPackageArch pa
         where ks.id = :kickstart_session_id
           and kd.server_profile_id = spp.server_profile_id
           and spp.name_id = pn.id
           and spp.evr_id = pe.id
           and spp.package_arch_id = pa.id
           and kd.kickstart_id = ks.kickstart_id
    """)
    h.execute(kickstart_session_id=kickstart_session_id)
    return _packages_from_cursor(h)


def get_kisckstart_session_package_profile(kickstart_session_id):
    """ Fetches the package profile from the kickstart session """
    h = rhnSQL.prepare("""
        select pn.name, pe.version, pe.release, pe.epoch, pa.label
          from rhnKickstartSession ks,
               rhnServerProfilePackage spp,
               rhnPackageName pn,
               rhnPackageEVR pe,
               rhnPackageArch pa
         where ks.id = :kickstart_session_id
           and ks.server_profile_id = spp.server_profile_id
           and spp.name_id = pn.id
           and spp.evr_id = pe.id
           and spp.package_arch_id = pa.id
    """)
    h.execute(kickstart_session_id=kickstart_session_id)
    return _packages_from_cursor(h)


def get_server_package_profile(server_id):
    # XXX misa 2005-05-25  May need to look at package arches too
    h = rhnSQL.prepare("""
        select pn.name, pe.version, pe.release, pe.epoch, pa.label
          from rhnServerPackage sp,
               rhnPackageName pn,
               rhnPackageEVR pe,
               rhnPackageArch pa
         where sp.server_id = :server_id
           and sp.name_id = pn.id
           and sp.evr_id = pe.id
           and sp.package_arch_id = pa.id
    """)
    h.execute(server_id=server_id)
    return _packages_from_cursor(h)

_query_get_kickstart_session_info = rhnSQL.Statement("""
    select org_id, scheduler, deploy_configs, virtualization_type
      from rhnKickstartSession
     where id = :kickstart_session_id
""")


def get_kickstart_session_info(kickstart_session_id, server_id):
    h = rhnSQL.prepare(_query_get_kickstart_session_info)
    h.execute(kickstart_session_id=kickstart_session_id)
    row = h.fetchone_dict()
    if not row:
        raise rhnException("Could not fetch kickstart session id %s "
                           "for server %s" % (kickstart_session_id, server_id))

    return row

_query_lookup_ks_server_profile = rhnSQL.Statement("""
    select kss.server_profile_id
      from rhnServerProfileType spt,
           rhnServerProfile sp,
           rhnKickstartSession kss
     where kss.id = :ks_session_id
       and kss.server_profile_id = sp.id
       and sp.profile_type_id = spt.id
       and spt.label = :profile_type_label
""")
_query_delete_server_profile = rhnSQL.Statement("""
    delete from rhnServerProfile where id = :server_profile_id
""")


def cleanup_profile(server_id, action_id, ks_session_id, action_status):
    if ks_session_id is None:
        log_debug(4, "No kickstart session")
        return
    if action_status != 2:
        log_debug(4, "Action status: %s; nothing to do" % action_status)
        return

    h = rhnSQL.prepare(_query_lookup_ks_server_profile)
    h.execute(ks_session_id=ks_session_id, profile_type_label='sync_profile')
    row = h.fetchone_dict()
    if not row:
        log_debug(4, "No server profile of the right type found; nothing to do")
        return

    server_profile_id = row['server_profile_id']
    if server_profile_id is None:
        log_debug(4, "No server profile associated with this kickstart session")
        return

    # There is an "on delete cascade" constraint on
    # rhnKickstartSession.server_profile_id and on
    # rhnServerProfilePacakge.server_profile_id
    h = rhnSQL.prepare(_query_delete_server_profile)
    h.execute(server_profile_id=server_profile_id)
  070701000001C5000081B40000000000000000000000015FBBE8EE00002D7E000000000000000000000000000000000000003100000000spacewalk-backend/server/rhnServer/server_lib.py  #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# implements a bunch of functions needed by rhnServer modules
#

import os
import hashlib
import time
import sys

if sys.version_info[0] == 3:
    from functools import reduce

from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.common.rhnException import rhnException
from spacewalk.common.rhnConfig import CFG

from spacewalk.server import rhnSQL
from rhn.i18n import bstr

# Do not import server.apacheAuth in this module, or the secret generation
# script will traceback - since it would try to import rhnSecret which doesn't
# exist


class rhnSystemEntitlementException(rhnException):
    pass


class rhnNoSystemEntitlementsException(rhnSystemEntitlementException):
    pass


def getServerID(server, fields=[]):
    """ Given a textual digitalid (old style or new style) or simply an ID
        try to search in the database and return the numeric id (thus doing
        validation in case you pass a numeric ID already)

        If found, it will return a dictionary with at least an "id" member

        Additional fields can be requested by passing an array of strings
        with field names from rhnServer
        check if all chars of a string are in a set
    """
    def check_chars(s):
        return reduce(lambda a, b: a and b in "0123456789", s, 1)

    log_debug(4, server, fields)
    if not type(server) in [type(""), type(0)]:
        return None

    if type(server) == type(0):
        search_id = server  # will search by number
    elif server[:7] == "SERVER-":  # old style certificate
        search_id = server
    elif server[:3] == "ID-":  # new style id, extract the numeric id
        tmp_id = server[3:]
        if not tmp_id or check_chars(tmp_id) == 0:
            # invalid certificate, after ID- we have non numbers
            return None
        search_id = int(tmp_id)
    else:
        # this is string. if all are numbers, then try to convert to int
        if check_chars(server) == 0:
            # throughly invalid id, whet the heck do we do?
            log_error("Invalid server ID passed in search: %s" % server)
            return None
        # otherwise try as int
        try:
            search_id = int(server)
        except ValueError:
            return None

    # Now construct the extra stuff for the case when additional fields
    # are requested
    xfields = ""
    archdb = ""
    archjoin = ""
    # look at the fields
    fields = [f.lower() for f in fields]
    for k in fields:
        if k == "id":  # already there
            continue
        if k == 'arch':
            archdb = ", rhnServerArch sa"
            archjoin = "and s.server_arch_id = sa.id"
            xfields = "%s, a.label arch" % xfields
            continue
        xfields = "%s, s.%s" % (xfields, k)
    # ugliness is over

    # Now build the search
    if type(search_id) == type(0):
        h = rhnSQL.prepare("""
        select s.id %s from rhnServer s %s
        where s.id = :p1 %s
        """ % (xfields, archdb, archjoin))
    else:  # string
        h = rhnSQL.prepare("""
        select s.id %s from rhnServer s %s
        where s.digital_server_id = :p1 %s
        """ % (xfields, archdb, archjoin))
    h.execute(p1=search_id)
    row = h.fetchone_dict()
    if row is None or row["id"] is None:  # not found
        return None
    return row


def getServerSecret(server):
    """ retrieve the server secret using the great getServerID function """
    row = getServerID(server, ["secret"])
    if row is None:
        return None
    return row["secret"]


###############################
# Server Class Helper functions
###############################

def __create_server_group(group_label, org_id):
    """ create the initial server groups for a new server """
    # Add this new server to the pending group
    h = rhnSQL.prepare("""
    select sg.id, sg.current_members
    from rhnServerGroup sg
    where sg.group_type = ( select id from rhnServerGroupType
                            where label = :group_label )
    and sg.org_id = :org_id
    """)
    h.execute(org_id=org_id, group_label=group_label)
    data = h.fetchone_dict()
    if not data:
        # create the requested group
        ret_id = rhnSQL.Sequence("rhn_server_group_id_seq")()
        h = rhnSQL.prepare("""
        insert into rhnServerGroup
        ( id, name, description,
          group_type, org_id)
        select
            :new_id, sgt.name, sgt.name,
            sgt.id, :org_id
        from rhnServerGroupType sgt
        where sgt.label = :group_label
        """)
        rownum = h.execute(new_id=ret_id, org_id=org_id,
                           group_label=group_label)
        if rownum == 0:
            # No rows were created, probably invalid label
            raise rhnException("Could not create new group for org=`%s'"
                               % org_id, group_label)
    else:
        ret_id = data["id"]
    return ret_id


def join_server_group(server_id, server_group_id):
    """ Adds a server to a server group """
    # avoid useless reparses caused by different arg types
    server_id = str(server_id)
    server_group_id = str(server_group_id)

    insert_call = rhnSQL.Function("rhn_server.insert_into_servergroup_maybe",
                                  rhnSQL.types.NUMBER())
    ret = insert_call(server_id, server_group_id)
    # return the number of rows inserted - feel free to ignore
    return ret


def create_server_setup(server_id, org_id):
    """ This function inserts a row in rhnServerInfo.
    """
    # create the rhnServerInfo record
    h = rhnSQL.prepare("""
    insert into rhnServerInfo (server_id, checkin, checkin_counter)
                       values (:server_id, current_timestamp, :checkin_counter)
    """)
    h.execute(server_id=server_id, checkin_counter=0)

    # Do not entitle the server yet
    return 1


def checkin(server_id, commit=1):
    """ checkin - update the last checkin time
    """
    log_debug(3, server_id)
    h = rhnSQL.prepare("""
    update rhnServerInfo
    set checkin = current_timestamp, checkin_counter = checkin_counter + 1
    where server_id = :server_id
    """)
    h.execute(server_id=server_id)
    if commit:
        rhnSQL.commit()
    return 1


def set_qos(server_id):
    pass


def throttle(server):
    """ throttle - limits access to free users if a throttle file exists
        NOTE: We don't throttle anybody. Just stub.
    """
    #server_id = server['id']
    #log_debug(3, server_id)
    #
    # Are we throttling?
    #throttlefile = "/usr/share/rhn/throttle"
    # if not os.path.exists(throttlefile):
    #    # We don't throttle anybody
    #    return
    return


def join_rhn(org_id):
    """ Stub """
    return


def snapshot_server(server_id, reason):
    if CFG.ENABLE_SNAPSHOTS:
        return rhnSQL.Procedure("rhn_server.snapshot_server")(server_id, reason)


def check_entitlement(server_id,want_array=False):
    h = rhnSQL.prepare("""select server_id, label, is_base from rhnServerEntitlementView where server_id = :server_id order by is_base DESC""")
    #h = rhnSQL.prepare("""select server_id, label from rhnServerEntitlementView where server_id = :server_id""")
    h.execute(server_id = server_id)

    # if I read the old code correctly, this should do about the same thing.
    # Basically "entitled? yay/nay" -akl.  UPDATE 12/08/06: akl says "nay".
    # It's official
    rows = h.fetchall_dict()
    ents = {}
    ents_array = []

    if rows:
        for row in rows:
            ents[row['label']] = row['label']
            ents_array.append( row['label'] )
        if want_array:
            return ents_array
        return ents

    if want_array:
        return ents_array
    # Empty dictionary - will act as False
    return ents


def check_entitlement_by_machine_id(machine_id):
    h = rhnSQL.prepare("""
    select e.label from rhnServer s, rhnServerEntitlementView e
    where s.machine_id=:machine_id and s.id=e.server_id
    """)
    h.execute(machine_id=machine_id)
    rows = h.fetchall_dict()
    return [row["label"] for row in rows] if rows else []

# Push client related
# XXX should be moved to a different file?
_query_update_push_client_registration = rhnSQL.Statement("""
    update rhnPushClient
       set name = :name_in,
           shared_key = :shared_key_in,
           state_id = :state_id_in,
           next_action_time = NULL,
           last_ping_time = NULL
     where server_id = :server_id_in
""")
_query_insert_push_client_registration = rhnSQL.Statement("""
        insert into rhnPushClient
           (id, server_id, name, shared_key, state_id)
        values (sequence_nextval('rhn_pclient_id_seq'), :server_id_in, :name_in,
            :shared_key_in, :state_id_in)
""")


def update_push_client_registration(server_id):
    # Generate a new a new client name and shared key
    client_name = generate_random_string(16)
    shared_key = generate_random_string(40)
    t = rhnSQL.Table('rhnPushClientState', 'label')
    row = t['offline']
    assert row is not None
    state_id = row['id']

    h = rhnSQL.prepare(_query_update_push_client_registration)
    rowcount = h.execute(server_id_in=server_id, name_in=client_name,
                         shared_key_in=shared_key, state_id_in=state_id)
    if not rowcount:
        h = rhnSQL.prepare(_query_insert_push_client_registration)
        h.execute(server_id_in=server_id, name_in=client_name,
                  shared_key_in=shared_key, state_id_in=state_id)

    # Get the server's (database) time
    # XXX
    timestamp = int(time.time())
    rhnSQL.commit()
    return timestamp, client_name, shared_key

_query_delete_duplicate_client_jids = rhnSQL.Statement("""
    update rhnPushClient
       set jabber_id = null
     where jabber_id = :jid and
           server_id <> :server_id
""")

_query_update_push_client_jid = rhnSQL.Statement("""
    update rhnPushClient
       set jabber_id = :jid,
           next_action_time = NULL,
           last_ping_time = NULL
     where server_id = :server_id
""")


def update_push_client_jid(server_id, jid):
    h1 = rhnSQL.prepare(_query_delete_duplicate_client_jids)
    h1.execute(server_id=server_id, jid=jid)
    h2 = rhnSQL.prepare(_query_update_push_client_jid)
    h2.execute(server_id=server_id, jid=jid)
    rhnSQL.commit()
    return jid


def generate_random_string(length=20):
    if not length:
        return ''
    random_bytes = 16
    length = int(length)
    s = hashlib.new('sha1')
    s.update(bstr("%.8f" % time.time()))
    s.update(bstr(str(os.getpid())))
    devrandom = open('/dev/urandom', mode='rb')
    result = []
    cur_length = 0
    while 1:
        s.update(bstr(devrandom.read(random_bytes)))
        buf = s.hexdigest()
        result.append(buf)
        cur_length = cur_length + len(buf)
        if cur_length >= length:
            break

    devrandom.close()

    result = ''.join(result)[:length]
    return result.lower()

if __name__ == '__main__':
    rhnSQL.initDB()
    print((update_push_client_registration(1000102174)))
  070701000001C6000081B40000000000000000000000015FBBE8EE00004E67000000000000000000000000000000000000003600000000spacewalk-backend/server/rhnServer/server_packages.py #
# Copyright (c) 2008--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# This file contains classes and functions that save and retrieve package
# profiles.
#

import sys
import time
from uyuni.common.usix import DictType, raise_with_tb
from uyuni.common import rhn_rpm
from spacewalk.common.rhnLog import log_debug
from spacewalk.common.rhnException import rhnFault
from spacewalk.server import rhnSQL, rhnAction
from .server_lib import snapshot_server, check_entitlement

UNCHANGED = 0
ADDED = 1
DELETED = 2
UPDATED = 3


class dbPackage:

    """ A small class that helps us represent things about a
        database package. In this structure "real" means that we have an
        entry in the database for it.
    """

    def __init__(self, pdict, real=0, name_id=None, evr_id=None,
                 package_arch_id=None):
        if type(pdict) != DictType:
            return None
        if ('arch' not in pdict) or (pdict['arch'] is None):
            pdict['arch'] = ""
        if str(pdict['epoch']).lower() == "(none)" or pdict['epoch'] == "" or pdict['epoch'] is None:
            pdict['epoch'] = None
        else:
            pdict['epoch'] = str(pdict['epoch'])
        for k in ('name', 'version', 'release', 'arch'):
            if pdict[k] is None:
                return None
        self.n = str(pdict['name'])
        self.v = str(pdict['version'])
        self.r = str(pdict['release'])
        self.e = pdict['epoch']
        self.a = str(pdict['arch'])
        if 'installtime' in pdict:
            self.installtime = pdict['installtime']
        else:
            self.installtime = None
        # nvrea is a tuple; we can use tuple as dictionary keys since they are
        # immutable
        self.nvrea = (self.n, self.v, self.r, self.e, self.a)
        self.real = real
        self.name_id = name_id
        self.evr_id = evr_id
        self.package_arch_id = package_arch_id
        if real:
            self.status = UNCHANGED
        else:
            self.status = ADDED

    def setval(self, value):
        self.status = value

    def add(self):
        if self.status == DELETED:
            if self.real:
                self.status = UNCHANGED  # real entries remain unchanged
            else:
                self.status = ADDED  # others are added
        return

    def delete(self):
        if self.real:
            self.status = DELETED
        else:
            self.status = UNCHANGED  # we prefer unchanged for the non-real packages
        return

    def __str__(self):
        return "server.rhnServer.dbPackage instance %s" % {
            'n': self.n,
            'v': self.v,
            'r': self.r,
            'e': self.e,
            'a': self.a,
            'installtime': self.installtime,
            'real': self.real,
            'name_id': self.name_id,
            'evr_id': self.evr_id,
            'package_arch_id': self.package_arch_id,
            'status': self.status,
        }
    __repr__ = __str__


class Packages:

    def __init__(self):
        self.__p = {}
        # Have we loaded the packages or not?
        self.__loaded = 0
        self.__changed = 0

    def add_package(self, sysid, entry):
        log_debug(4, sysid, entry)
        p = dbPackage(entry)
        if p is None:
            # Not a valid package spec
            return -1
        if not self.__loaded:
            self.reload_packages_byid(sysid)
        if p.nvrea in self.__p:
            if self.__p[p.nvrea].installtime != p.installtime:
                self.__p[p.nvrea].installtime = p.installtime
                self.__p[p.nvrea].status = UPDATED
            else:
                self.__p[p.nvrea].add()
            self.__changed = 1
            return 0
        self.__p[p.nvrea] = p
        self.__changed = 1
        return 0

    def delete_package(self, sysid, entry):
        """ delete a package from the list """
        log_debug(4, sysid, entry)
        p = dbPackage(entry)
        if p is None:
            # Not a valid package spec
            return -1
        if not self.__loaded:
            self.reload_packages_byid(sysid)
        if p.nvrea in self.__p:
            log_debug(4, "  Package deleted")
            self.__p[p.nvrea].delete()
            self.__changed = 1
        # deletion is always successfull
        return 0

    def dispose_packages(self, sysid):
        """ delete all packages and get an empty package list """
        log_debug(4, sysid)
        if not self.__loaded:
            self.reload_packages_byid(sysid)
        for k in list(self.__p.keys()):
            self.__p[k].delete()
            self.__changed = 1
        return 0

    def get_packages(self):
        """ produce a list of packages """
        return [a.nvrea for a in [a for a in list(self.__p.values()) if a.status != DELETED]]

    def __expand_installtime(self, installtime):
        """ Simulating the ternary operator, one liner is ugly """
        if installtime:
            return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(installtime))
        else:
            return None

    def save_packages_byid(self, sysid, schedule=1):
        """ save the package list """
        log_debug(3, sysid, "Errata cache to run:", schedule,
                  "Changed:", self.__changed, "%d total packages" % len(self.__p))

        if not self.__changed:
            return 0

        commits = 0

        # get rid of the deleted packages
        dlist = [a for a in list(self.__p.values()) if a.real and a.status in (DELETED, UPDATED)]
        if dlist:
            log_debug(4, sysid, len(dlist), "deleted packages")
            h = rhnSQL.prepare("""
            delete from rhnServerPackage
            where server_id = :sysid
            and name_id = :name_id
            and evr_id = :evr_id
            and ((:package_arch_id is null and package_arch_id is null)
                or package_arch_id = :package_arch_id)
            """)
            h.executemany(**{
                'sysid': [sysid] * len(dlist),
                'name_id': [a.name_id for a in dlist],
                'evr_id': [a.evr_id for a in dlist],
                'package_arch_id': [a.package_arch_id for a in dlist],
            })
            commits = commits + len(dlist)
            del dlist

        # And now add packages
        alist = [a for a in list(self.__p.values()) if a.status in (ADDED, UPDATED)]
        if alist:
            log_debug(4, sysid, len(alist), "added packages")
            h = rhnSQL.prepare("""
            insert into rhnServerPackage
            (server_id, name_id, evr_id, package_arch_id, installtime)
            values (:sysid, LOOKUP_PACKAGE_NAME(:n), LOOKUP_EVR(:e, :v, :r),
                LOOKUP_PACKAGE_ARCH(:a), TO_TIMESTAMP(:instime, 'YYYY-MM-DD HH24:MI:SS')
            )
            """)
            # some fields are not allowed to contain empty string (varchar)

            def lambdaae(a):
                if a.e == '':
                    return None
                else:
                    return a.e
            package_data = {
                'sysid': [sysid] * len(alist),
                'n': [a.n for a in alist],
                'v': [a.v for a in alist],
                'r': [a.r for a in alist],
                'e': list(map(lambdaae, alist)),
                'a': [a.a for a in alist],
                'instime': [self.__expand_installtime(a.installtime) for a in alist],
            }
            try:
                h.executemany(**package_data)
                rhnSQL.commit()
            except rhnSQL.SQLSchemaError:
                e = sys.exc_info()[1]
                # LOOKUP_PACKAGE_ARCH failed
                if e.errno == 20243:
                    log_debug(2, "Unknown package arch found", e)
                    raise_with_tb(rhnFault(45, "Unknown package arch found"), sys.exc_info()[2])

            commits = commits + len(alist)
            del alist

        if schedule:
            # queue this server for an errata update
            update_errata_cache(sysid)

        # if provisioning box, and there was an actual delta, snapshot
        ents = check_entitlement(sysid)
        if commits and "enterprise_entitled" in ents:
            snapshot_server(sysid, "Package profile changed")

        # Our new state does not reflect what's on the database anymore
        self.__loaded = 0
        self.__changed = 0
        return 0

    _query_get_package_arches = rhnSQL.Statement("""
        select id, label
          from rhnPackageArch
    """)

    def get_package_arches(self):
        # None gets automatically converted to empty string
        package_arches_hash = {None: ''}
        h = rhnSQL.prepare(self._query_get_package_arches)
        h.execute()
        while 1:
            row = h.fetchone_dict()
            if not row:
                break
            package_arches_hash[row['id']] = row['label']
        return package_arches_hash

    def reload_packages_byid(self, sysid):
        """ reload the packages list from the database """
        log_debug(3, sysid)
        # First, get the package arches
        package_arches_hash = self.get_package_arches()
        # XXX we could achieve the same thing with an outer join but that's
        # more expensive
        # Now load packages
        h = rhnSQL.prepare("""
        select
            rpn.name,
            rpe.version,
            rpe.release,
            rpe.epoch,
            sp.name_id,
            sp.evr_id,
            sp.package_arch_id,
            TO_CHAR(sp.installtime, 'YYYY-MM-DD HH24:MI:SS') installtime
        from
            rhnServerPackage sp,
            rhnPackageName rpn,
            rhnPackageEVR rpe
        where sp.server_id = :sysid
        and sp.name_id = rpn.id
        and sp.evr_id = rpe.id
        """)
        h.execute(sysid=sysid)
        self.__p = {}
        while 1:
            t = h.fetchone_dict()
            if not t:
                break
            t['arch'] = package_arches_hash[t['package_arch_id']]
            if 'installtime' in t and t['installtime'] is not None:
                t['installtime'] = time.mktime(time.strptime(t['installtime'],
                                                             "%Y-%m-%d %H:%M:%S"))
            p = dbPackage(t, real=1, name_id=t['name_id'], evr_id=t['evr_id'],
                          package_arch_id=t['package_arch_id'])
            self.__p[p.nvrea] = p
        log_debug(4, "Loaded %d packages for server %s" % (len(self.__p), sysid))
        self.__loaded = 1
        self.__changed = 0
        return 0

    _query_product_packages = rhnSQL.Statement("""
    select rp.name_id, rp.package_arch_id arch_id, X.name
      from
        (
          select pn.name,
                 latest.name_id,
                 lookup_evr((latest.evr).epoch, (latest.evr).version, (latest.evr).release) AS evr_id,
                 latest.arch_label AS ARCH,
                 latest.arch_id
            from
               (
                SELECT p.name_id AS name_id,
                       max(pe.evr) AS evr,
                       pa.label AS arch_label,
                       pa.id AS arch_id
                  FROM
                       rhnPackageEVR pe
                  JOIN rhnPackage p ON p.evr_id = pe.id
                  JOIN rhnChannelPackage cp ON cp.package_id = p.id
                  JOIN rhnPackageArch pa ON pa.id = p.package_arch_id
                  JOIN rhnPackageProvides pv on p.id = pv.package_id
                  JOIN rhnPackageCapability c on pv.capability_id = c.id
                  JOIN rhnServerChannel sc on cp.channel_id = sc.channel_id
                 WHERE
                       sc.server_id = :server_id
                   and c.name = 'product()'
              GROUP BY p.name_id, pa.label, pa.id
         ) latest
         JOIN rhnPackageName pn ON pn.id = latest.name_id
        where pn.name not like '%-migration'
          and NOT EXISTS (
                 SELECT 1
                   FROM rhnServerPackage SP
                  WHERE SP.server_id = :server_id
                    AND SP.name_id = latest.name_id
                    AND (SP.package_arch_id = latest.arch_id OR SP.package_arch_id IS NULL)
          )
          and NOT EXISTS (
                 select 1
                   FROM rhnServerPackage SP
                   JOIN rhnPackage p_p ON SP.name_id = p_p.name_id and SP.evr_id = p_p.evr_id and SP.package_arch_id = p_p.package_arch_id
                   JOIN rhnPackageProvides p_pv on p_p.id = p_pv.package_id
                   JOIN rhnPackageCapability p_c on p_pv.capability_id = p_c.id
                  WHERE SP.server_id = :server_id
                    and p_c.name = pn.name
              )
        ) X
        JOIN rhnPackage rp ON rp.name_id = X.name_id
             AND rp.evr_id = X.evr_id
             AND rp.package_arch_id = X.arch_id
    """)

    def install_missing_product_packages(self):
        '''
        Find missing products and schedule an action to install them
        '''
        h = rhnSQL.prepare(self._query_product_packages)
        package_names = {}
        h.execute(server_id=self.server['id'])
        while True:
            row = h.fetchone_dict()
            if not row:
                break
            pn_id = row['name_id']
            pa_id = row['arch_id']
            package_names[(pn_id, pa_id)] = row['name']

        if not package_names:
            return None

        package_arch_ids = list(package_names.keys())

        action_id = rhnAction.schedule_server_packages_update_by_arch(self.server['id'],
                                                                      package_arch_ids,
                                                                      org_id=self.server['org_id'],
                                                                      action_name="Product Package Auto-Install")
        for p in list(package_names.values()):
            log_debug(1, "Scheduled for install:  '%s'" % p)

        rhnSQL.commit()

        return action_id


def update_errata_cache(server_id):
    """ Queue an update the the server's errata cache. This queues for
        Taskomatic instead of doing it in-line because updating many servers
        at once was problematic and lead to unresponsive Satellite and
        incorrectly reporting failed actions when they did not fail (see
        bz 1119460).
    """
    log_debug(2, "Queueing the errata cache update", server_id)
    update_needed_cache = rhnSQL.Procedure("queue_server")
    update_needed_cache(server_id, 0)


def processPackageKeyAssociations(header, checksum_type, checksum):
    provider_sql = rhnSQL.prepare("""
        insert into rhnPackageKeyAssociation
            (package_id, key_id) values
            (:package_id, :key_id)
    """)

    insert_keyid_sql = rhnSQL.prepare("""
        insert into rhnPackagekey
            (id, key_id, key_type_id) values
            (sequence_nextval('rhn_pkey_id_seq'), :key_id, :key_type_id)
    """)

    lookup_keyid_sql = rhnSQL.prepare("""
       select pk.id
         from rhnPackagekey pk
        where pk.key_id = :key_id
    """)

    lookup_keytype_id = rhnSQL.prepare("""
       select id
         from rhnPackageKeyType
        where LABEL in ('gpg', 'pgp')
    """)

    lookup_pkgid_sql = rhnSQL.prepare("""
        select p.id
          from rhnPackage p,
               rhnChecksumView c
         where c.checksum = :csum
           and c.checksum_type = :ctype
           and p.checksum_id = c.id
    """)

    lookup_pkgkey_sql = rhnSQL.prepare("""
        select 1
          from rhnPackageKeyAssociation
         where package_id = :package_id
           and key_id = :key_id
    """)

    lookup_pkgid_sql.execute(ctype=checksum_type, csum=checksum)
    pkg_ids = lookup_pkgid_sql.fetchall_dict()

    if not pkg_ids:
        # No package to associate, continue with next
        return

    sigkeys = header.signatures
    key_id = None  # _key_ids(sigkeys)[0]
    for sig in sigkeys:
        if sig['signature_type'] in ['gpg', 'pgp']:
            key_id = sig['key_id']

    if not key_id:
        # package is not signed, skip gpg key insertion
        return

    lookup_keyid_sql.execute(key_id=key_id)
    keyid = lookup_keyid_sql.fetchall_dict()

    if not keyid:
        lookup_keytype_id.execute()
        key_type_id = lookup_keytype_id.fetchone_dict()
        insert_keyid_sql.execute(key_id=key_id, key_type_id=key_type_id['id'])
        lookup_keyid_sql.execute(key_id=key_id)
        keyid = lookup_keyid_sql.fetchall_dict()

    for pkg_id in pkg_ids:
        lookup_pkgkey_sql.execute(key_id=keyid[0]['id'],
                                  package_id=pkg_id['id'])
        exists_check = lookup_pkgkey_sql.fetchall_dict()

        if not exists_check:
            provider_sql.execute(key_id=keyid[0]['id'], package_id=pkg_id['id'])


def package_delta(list1, list2):
    """ Compares list1 and list2 (each list is a tuple (n, v, r, e)
        returns two lists
        (install, remove)
        XXX upgrades and downgrades are simulated by a removal and an install
    """
    # Package registry - canonical versions for all packages
    package_registry = {}
    hash1 = _package_list_to_hash(list1, package_registry)
    hash2 = _package_list_to_hash(list2, package_registry)
    del package_registry

    installs = []
    removes = []
    for pn, ph1 in list(hash1.items()):
        if pn not in hash2:
            removes.extend(list(ph1.keys()))
            continue

        ph2 = hash2[pn]
        del hash2[pn]

        # Now, compute the differences between ph1 and ph2
        for p in list(ph1.keys()):
            if p not in ph2:
                # We have to remove it
                removes.append(p)
            else:
                del ph2[p]
        # Everything else left in ph2 has to be installed
        installs.extend(list(ph2.keys()))

    # Whatever else is left in hash2 should be installed
    for ph2 in list(hash2.values()):
        installs.extend(list(ph2.keys()))

    installs.sort()
    removes.sort()
    return installs, removes


def _package_list_to_hash(package_list, package_registry):
    """ Converts package_list into a hash keyed by name
        package_registry contains the canonical version of the package
        for instance, version 51 and 0051 are indentical, but that would break the
        list comparison in Python. package_registry is storing representatives for
        each equivalence class (where the equivalence relationship is rpm's version
        comparison algorigthm
        Side effect: Modifies second argument!
    """
    hash = {}
    for e in package_list:
        e = tuple(e)
        pn = e[0]
        if pn not in package_registry:
            # Definitely new equivalence class
            _add_to_hash(package_registry, pn, e)
            _add_to_hash(hash, pn, e)
            continue

        # Look for a match for this package name in the registry
        plist = list(package_registry[pn].keys())
        for p in plist:
            if rhn_rpm.nvre_compare(p, e) == 0:
                # Packages are identical
                e = p
                break
        else:
            # Package not found in the global registry - add it
            _add_to_hash(package_registry, pn, e)

        # Add it to the hash too
        _add_to_hash(hash, pn, e)

    return hash


def _add_to_hash(hash, key, value):
    if key not in hash:
        hash[key] = {value: None}
    else:
        hash[key][value] = None
 070701000001C7000081B40000000000000000000000015FBBE8EE00000F81000000000000000000000000000000000000003300000000spacewalk-backend/server/rhnServer/server_route.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Module for storing client route through proxies
#

from spacewalk.common import rhnFlags
from spacewalk.common.rhnLog import log_debug
from spacewalk.server import rhnSQL, apacheAuth


def store_client_route(server_id):
    """ Stores the route the client took to get to hosted or the Satellite """

    log_debug(5, server_id)

    # get the old routing information for this server_id
    # oldRoute in this format: [(id0, hostname0),  (id1, hostname1),  ...]
    #                           closest to client, ..., closest to server
    h = rhnSQL.prepare("""
        select position,
               proxy_server_id,
               hostname
          from rhnServerPath
         where server_id = :server_id
        order by position
        """)
    h.execute(server_id=server_id)
    oldRoute = h.fetchall_dict() or []
    newRoute = []

    # construct oldRoute_ from oldRoute, to have the actual format described above
    oldRouteTuples = []
    for oldRouteDict in oldRoute:
        oldRouteTuples.append((str(oldRouteDict['proxy_server_id']), oldRouteDict['hostname']))

    # code block if there *is* routing info in the headers
    # NOTE: X-RHN-Proxy-Auth described in proxy/broker/rhnProxyAuth.py
    if rhnFlags.test('X-RHN-Proxy-Auth'):
        tokens = rhnFlags.get('X-RHN-Proxy-Auth').split(',')
        tokens = [token for token in tokens if token]

        log_debug(4, "route tokens", tokens)
        # newRoute in this format: [(id0, hostname0),  (id1, hostname1),  ...]
        #                           closest to client, ..., closest to server
        for token in tokens:
            token, hostname = apacheAuth.splitProxyAuthToken(token)
            if hostname is None:
                log_debug(3, "NOTE: Spacewalk Proxy v1.1 detected - route tracking is unsupported")
                newRoute = []
                break
            newRoute.append((token[0], hostname))

        log_debug(4, "newRoute", newRoute)

    if oldRouteTuples == newRoute:
        # Nothing to do here
        # This also catches the case of no routes at all
        return

    if oldRouteTuples:
        # blow away table rhnServerPath entries for server_id
        log_debug(8, 'blow away route-info for %s' % server_id)
        h = rhnSQL.prepare("""
            delete from rhnServerPath where server_id = :server_id
        """)
        h.execute(server_id=server_id)

    if not newRoute:
        log_debug(3, "No new route to add")
        rhnSQL.commit()
        return

    log_debug(8, 'adding route-info entries: %s - %s' % (server_id, newRoute))

    h = rhnSQL.prepare("""
        insert into rhnServerPath
               (server_id, proxy_server_id, position, hostname)
        values (:server_id, :proxy_server_id, :position, :hostname)
    """)
    server_ids = []
    proxy_ids = []
    proxy_hostnames = []
    positions = []
    counter = 0
    for p in newRoute:
        proxy_id, proxy_hostname = p[:2]
        proxy_ids.append(proxy_id)
        proxy_hostnames.append(proxy_hostname)
        server_ids.append(server_id)
        positions.append(counter)
        counter = counter + 1

    log_debug(5, server_ids, proxy_ids, positions,
              proxy_hostnames)
    h.executemany(server_id=server_ids, proxy_server_id=proxy_ids,
                  position=positions, hostname=proxy_hostnames)

    rhnSQL.commit()
   070701000001C8000081B40000000000000000000000015FBBE8EE000012F9000000000000000000000000000000000000003200000000spacewalk-backend/server/rhnServer/server_suse.py # -*- coding: utf-8 -*-
#
# Copyright (c) 2010 SUSE LLC
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#

from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.common.rhnException import rhnFault
from spacewalk.common.rhnTB import Traceback
from spacewalk.server import rhnSQL

class SuseData:
  def __init__(self):
    log_debug(4, "SuseData initialized")
    # format:
    # suse_products [{ 'name' = ..., 'version' = ..., 'release' = ..., 'arch' = ..., 'baseproduct' = ...},
    #               ...]
    self.suse_products = []

  def get_suse_products(self):
      if len(self.suse_products) == 0:
          self.suse_products = []
          self.load_suse_products()
      return self.suse_products

  def load_suse_products(self):
      log_debug(1, "load suse_products")
      if not self.server['id']:
          return
      h = rhnSQL.prepare("""
          SELECT sip.name,
                 sip.version,
                 sip.release,
                 rpa.label arch,
                 sip.is_baseproduct baseproduct
            FROM suseInstalledProduct sip
             JOIN rhnPackageArch rpa ON sip.arch_type_id = rpa.id
             JOIN suseServerInstalledProduct ssip ON sip.id = ssip.suse_installed_product_id
           WHERE ssip.rhn_server_id = :server_id
      """)
      h.execute(server_id = self.server['id'])
      self.suse_products = h.fetchall_dict() or []


  def add_suse_products(self, suse_products):
      log_debug(1, suse_products)
      if isinstance(suse_products, dict):
          self.suse_products = suse_products['products']
      elif isinstance(suse_products, list):
          self.suse_products = suse_products

  def save_suse_products_byid(self, sysid):
      log_debug(1, sysid, self.suse_products )
      if len(self.suse_products) == 0: # nothing loaded
          return 0
      self.create_update_suse_products(self.server["id"], self.suse_products)
      return 0

  def create_update_suse_products(self, sysid, products):
    log_debug(4, sysid, products)

    # check products
    h = rhnSQL.prepare("""
      SELECT
          suse_installed_product_id as id
        FROM suseServerInstalledProduct
       WHERE rhn_server_id = :sysid
    """)
    h.execute(sysid=sysid)
    existing_products = [x['id'] for x in h.fetchall_dict() or []]

    for product in products:
      sipid = self.get_installed_product_id(product)
      if not sipid:
        continue
      if sipid in existing_products:
        existing_products.remove(sipid)
        continue
      h = rhnSQL.prepare("""
        INSERT INTO suseServerInstalledProduct
        (rhn_server_id, suse_installed_product_id)
        VALUES(:sysid, :sipid)
      """)
      h.execute(sysid=sysid, sipid=sipid)

    for pid in existing_products:
      h = rhnSQL.prepare("""
        DELETE from suseServerInstalledProduct
         WHERE rhn_server_id = :sysid
           AND suse_installed_product_id = :pid
      """)
      h.execute(sysid=sysid, pid=pid)


  def get_installed_product_id(self, product):
    version_query = "sip.version = :version"
    release_query = "sip.release = :release"
    if product['version'] is None or product['version'] == '':
       product['version'] = None
       version_query = "(sip.version is NULL)"
    if product['release'] is None or product['release'] == '':
       product['release'] = None
       release_query = "(sip.release is NULL)"

    h = rhnSQL.prepare("""
      SELECT sip.id
        FROM suseInstalledProduct sip
         JOIN rhnPackageArch rpa ON sip.arch_type_id = rpa.id
       WHERE sip.name = :name
         AND %s
         AND rpa.label = :arch
         AND %s
         AND sip.is_baseproduct = :baseproduct
    """ % (version_query, release_query))
    h.execute(*(), **product)
    d = h.fetchone_dict()
    if not d:
      # not available yet, so let's create one
      n = rhnSQL.prepare("""
        INSERT INTO suseInstalledProduct
        (id, name, version, arch_type_id, release, is_baseproduct)
        VALUES (sequence_nextval('suse_inst_pr_id_seq'), :name, :version,
               (SELECT id FROM rhnPackageArch WHERE label = :arch),
               :release, :baseproduct)
      """)
      n.execute(*(), **product)
      h.execute(*(), **product)
      d = h.fetchone_dict()
      if not d:
        # should never happen
        log_error("Unable to create installed product item %s-%s-%s-%s" % (
          product['name'], product['version'], product['release'], product['arch']))
        return None

    return d['id']
   070701000001C9000081B40000000000000000000000015FBBE8EE000096DA000000000000000000000000000000000000003300000000spacewalk-backend/server/rhnServer/server_token.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# this module handles the token registration code for a server
#

import sys

from spacewalk.common import rhnFlags
from uyuni.common.usix import raise_with_tb
from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.common.rhnException import rhnFault, rhnException
from spacewalk.common.rhnTranslate import _
from spacewalk.server import rhnSQL, rhnChannel, rhnAction

from .server_lib import join_server_group, check_entitlement

VIRT_ENT_LABEL = 'virtualization_host'

def token_channels(server, server_arch, tokens_obj):
    """ Handle channel subscriptions for the registration token """
    assert(isinstance(tokens_obj, ActivationTokens))
    log_debug(1, "YYY token_channels", tokens_obj)

    server_id, server_arch_id = server['id'], server['server_arch_id']

    # what channels are associated with this token (filter only those
    # compatible with this server)
    h = rhnSQL.prepare("""
    select
        rtc.channel_id id, c.name, c.label, c.parent_channel
    from
        rhnRegTokenChannels rtc,
        rhnChannel c,
        rhnServerChannelArchCompat scac
    where rtc.token_id = :token_id
        and rtc.channel_id = c.id
        and c.channel_arch_id = scac.channel_arch_id
        and scac.server_arch_id = :server_arch_id
    """)

    chash = {}
    base_channel_token = None
    base_channel_id = None

    for token in tokens_obj.tokens:
        token_id = token['token_id']
        h.execute(token_id=token_id, server_arch_id=server_arch_id)
        while 1:
            row = h.fetchone_dict()
            if not row:
                break
            channel_id = row['id']
            chash[channel_id] = row
            if row['parent_channel'] is not None:
                # Not a base channel
                continue

            # We only allow for one base channel
            if base_channel_id is not None and channel_id != base_channel_id:
                # Base channels conflict - are they coming from the same
                # token?
                if base_channel_token == token:
                    log_error("Token has multiple base channels", token_id,
                              base_channel_id)
                    raise rhnFault(62,
                                   _("Token `%s' has more than one base channel assigned")
                                   % token['note'])
                raise rhnFault(63, _("Conflicting base channels"))
            base_channel_id = channel_id
            base_channel_token = token

    bc = chash.get(base_channel_id)
    log_debug(4, "base channel", bc)

    # get the base channel for this server
    # Note that we are hitting this codepath after newserver.__save() has been
    # run, which means we've already chosen a base channel
    # from rhnDistChannelMap
    sbc = rhnChannel.get_base_channel(server_id, none_ok=1)

    # prepare the return value
    ret = []

    # now try to figure out which base channel we prefer
    if bc is None:
        if sbc is None:
            # we need at least one base channel definition
            log_error("Server has invalid release and "
                      "token contains no base channels", server_id,
                      tokens_obj.tokens)
            ret.append("System registered without a base channel")
            ret.append("Unsupported release-architecture combination "
                       "(%s, %s)" % (server["release"], server_arch))
            return ret
    else:  # do we need to drop the one from sbc?
        if sbc and sbc["id"] != bc["id"]:  # we need to prefer the token one
            # unsubscribe from old channel(s)
            rhnChannel.unsubscribe_all_channels(server_id)
            sbc = None  # force true on the next test
        if sbc is None:
            # no base channel subscription at this point
            rhnChannel.subscribe_sql(server_id, bc["id"], commit=0)
            ret.append("Subscribed to base channel '%s' (%s)" % (
                bc["name"], bc["label"]))
            sbc = bc

    # attempt to subscribe all non-base channels associated with this
    # token
    subscribe_channel = rhnSQL.Procedure("rhn_channel.subscribe_server")
    # Use a set here to ensure uniqueness of the
    # channel family ids used in the loop below.
    channel_family_ids = set()

    for c in [a for a in list(chash.values()) if a["parent_channel"]]:
        # make sure this channel has the right parent
        if str(c["parent_channel"]) != str(sbc["id"]):
            ret.append("NOT subscribed to channel '%s' "
                       "(not a child of '%s')" % (
                           c["name"], sbc["name"]))
            continue
        try:
            # don't run the EC yet
            # XXX: test return code when this one will start returning
            # a status
            subscribe_channel(server_id, c["id"], 0, None)
            child = rhnChannel.Channel()
            child.load_by_id(c["id"])
            child._load_channel_families()
            cfamid = child._channel_families[0]
            channel_family_ids.add(cfamid)
        except rhnSQL.SQLError:
            e = sys.exc_info()[1]
            log_error("Failed channel subscription", server_id,
                      c["id"], c["label"], c["name"])
            ret.append("FAILED to subscribe to channel '%s'" % c["name"])
        else:
            ret.append("Subscribed to channel '%s'" % c["name"])

    log_debug(5, "cf ids: %s" % str(channel_family_ids))
    log_debug(5, "Server org_id: %s" % str(server['org_id']))

    return ret

_query_token_server_groups = rhnSQL.Statement("""
    select rtg.server_group_id, sg.name
      from rhnRegTokenGroups rtg, rhnServerGroup sg
     where rtg.token_id = :token_id
       and sg.id = rtg.server_group_id
""")


def token_server_groups(server_id, tokens_obj):
    """ Handle server group subscriptions for the registration token """
    assert(isinstance(tokens_obj, ActivationTokens))
    h = rhnSQL.prepare(_query_token_server_groups)
    server_groups = {}
    for token in tokens_obj.tokens:
        token_id = token['token_id']
        h.execute(token_id=token_id)
        while 1:
            row = h.fetchone_dict()
            if not row:
                break
            server_group_id = row['server_group_id']
            server_groups[server_group_id] = row

    # Now try to subscribe server to group
    ret = []
    for server_group_id, sg in list(server_groups.items()):
        log_debug(4, "token server group", sg)

        try:
            join_server_group(server_id, server_group_id)
        except rhnSQL.SQLError:
            e = sys.exc_info()[1]
            log_error("Failed to add server to group", server_id,
                      server_group_id, sg["name"])
            raise_with_tb(rhnFault(80, _("Failed to add server to group %s") %
                           sg["name"]), sys.exc_info()[2])
        else:
            ret.append("Subscribed to server group '%s'" % sg["name"])
    return ret


_query_token_packages = rhnSQL.Statement("""
    select pn.id as name_id, pa.id as arch_id, pn.name
    from rhnPackageName pn, rhnRegTokenPackages rtp
        left outer join rhnPackageArch pa on rtp.arch_id = pa.id
    where rtp.token_id = :token_id
        and rtp.name_id = pn.id
    order by upper(pn.name)
""")
_query_token_packages_insert = rhnSQL.Statement("""
    insert into rhnActionPackage (id, action_id, name_id, parameter)
    values (sequence_nextval('rhn_act_p_id_seq'), :action_id, :name_id, 'upgrade')
""")


def token_packages(server_id, tokens_obj):
    assert(isinstance(tokens_obj, ActivationTokens))

    h = rhnSQL.prepare(_query_token_packages)
    package_names = {}
    for token in tokens_obj.tokens:
        token_id = token['token_id']
        h.execute(token_id=token_id)
        while True:
            row = h.fetchone_dict()
            if not row:
                break
            pn_id = row['name_id']
            pa_id = row['arch_id']
            package_names[(pn_id, pa_id)] = row['name']

    ret = []
    if not package_names:
        return ret

    package_arch_ids = list(package_names.keys())
    # Get the latest action scheduled for this token
    last_action_id = rhnFlags.get('token_last_action_id')

    action_id = rhnAction.schedule_server_packages_update_by_arch(server_id,
                                                                  package_arch_ids, org_id=token['org_id'],
                                                                  prerequisite=last_action_id,
                                                                  action_name="Activation Key Package Auto-Install")

    # This action becomes the latest now
    rhnFlags.set('token_last_action_id', action_id)

    for p in list(package_names.values()):
        ret.append("Scheduled for install:  '%s'" % p)

    rhnSQL.commit()

    return ret


# given 2 channels, with one pathname overlap, you'll get
# something like:
#  id=1,  '/etc/foo.txt',     priority=1
#  id=27, '/etc/foo.txt',     priority=2
#  id=53, '/var/tmp/baz.log', priority=2
_query_token_latest_revisions = rhnSQL.Statement("""
    select cf.latest_config_revision_id revision_id,
           cfn.path
      from rhnConfigFileName cfn,
           rhnConfigFile cf,
           rhnConfigChannelType cct,
           rhnConfigChannel cc,
           rhnServerConfigChannel scc
     where scc.server_id = :server_id
       and scc.config_channel_id = cc.id
       and cc.confchan_type_id = cct.id
       and cct.label != 'server_import'
       and cc.id = cf.config_channel_id
       and cf.config_file_name_id = cfn.id
           -- latest_config_revision_id should always be non-null but
           -- we should protect ourselves
       and cf.latest_config_revision_id is not null
    order by cfn.path, cct.priority, scc.position
""")

_query_add_revision_to_action = rhnSQL.Statement("""
    insert into rhnActionConfigRevision (id, action_id, server_id, config_revision_id)
    values (sequence_nextval('rhn_actioncr_id_seq'), :action_id, :server_id, :config_revision_id)
""")


def deploy_configs_if_needed(server):
    server_id = server['id']
    log_debug(4, server_id)
    # determine if there are actually any files to be deployed...
    revisions = {}

    h = rhnSQL.prepare(_query_token_latest_revisions)
    h.execute(server_id=server_id)

    while 1:
        row = h.fetchone_dict()
        if not row:
            break

        # only care about the 1st revision of a particular path due to
        # sql ordering...
        if row['path'] not in revisions:
            revisions[row['path']] = row['revision_id']

    if not len(revisions):
        return None

    # Get the latest action scheduled for this token
    last_action_id = rhnFlags.get('token_last_action_id')

    action_id = rhnAction.schedule_server_action(
        server_id,
        action_type='activation.schedule_deploy',
        action_name="Activation Key Config File Deployment",
        delta_time=0, scheduler=None,
        org_id=server['org_id'],
        prerequisite=last_action_id,
    )

    # This action becomes the latest now
    rhnFlags.set('token_last_action_id', action_id)

    log_debug(4, "scheduled activation key config deploy")

    h = rhnSQL.prepare(_query_add_revision_to_action)
    # XXX should use executemany()
    for revision_id in list(revisions.values()):
        log_debug(5, action_id, revision_id)
        h.execute(server_id=server_id,
                  action_id=action_id,
                  config_revision_id=revision_id)

    return action_id


_query_token_config_channels = rhnSQL.Statement("""
    select rtcc.config_channel_id,
           rtcc.position, cc.name
      from rhnConfigChannel cc,
           rhnRegTokenConfigChannels rtcc
     where rtcc.token_id = :token_id
       and rtcc.config_channel_id = cc.id
    order by rtcc.position
""")

# XXX Same query exists in config/rhn_config_management.py
_query_set_server_config_channels = rhnSQL.Statement("""
    insert into rhnServerConfigChannel (server_id, config_channel_id, position)
    values (:server_id, :config_channel_id, :position)
""")


def _get_token_config_channels(token_id):
    h = rhnSQL.prepare(_query_token_config_channels)
    h.execute(token_id=token_id)

    return h.fetchall_dict() or []

_query_current_config_channels = rhnSQL.Statement("""
    select config_channel_id
      from rhnServerConfigChannel
       where server_id = :server_id
           and position is not null
""")


def _get_current_config_channels(server_id):
    h = rhnSQL.prepare(_query_current_config_channels)
    h.execute(server_id=server_id)

    current_ch = h.fetchall_dict() or []
    data = []
    for curr in current_ch:
        data.append(curr['config_channel_id'])
    return data


def token_config_channels(server, tokens_obj):
    assert(isinstance(tokens_obj, ActivationTokens))
    server_id = server['id']

    # If this is a re-registration token, it should not have any config
    # channel associated with it (and no deploy_configs either). We'll just
    # keep whatever config files they had on this profile
    if tokens_obj.is_rereg_token:
        return []

    # Activation key order matters; config channels are stacked in order

    config_channels = []
    config_channels_hash = {}
    deployment = 0
    current_channels = []
    if tokens_obj.forget_rereg_token:
        current_channels = _get_current_config_channels(server_id)

    for token in tokens_obj.tokens:
        channels = _get_token_config_channels(token['token_id'])
        # Check every token used and if any of them are set to not deploy configs
        # then we won't deploy configs for any config channels the system is subscribed to
        deploy_configs = token['deploy_configs']
        log_debug(2, "token_id: ", token['token_id'], " deploy_configs: ", deploy_configs)
        if deploy_configs == 'Y':
            log_debug(2, "At least one token set to deploy config files")
            deployment = 1
        for c in channels:
            config_channel_id = c['config_channel_id']
            if not c['config_channel_id'] in current_channels and\
                    config_channel_id not in config_channels_hash:
                position = len(current_channels) + len(config_channels) + 1
                # Update the position in the queue
                c['position'] = position
                config_channels.append(c)
                config_channels_hash[config_channel_id] = None

    ret = []
    if config_channels:
        h = rhnSQL.prepare(_query_set_server_config_channels)

        h.executemany(**{
            'server_id': [server_id] * len(config_channels),
            'config_channel_id': [c['config_channel_id'] for c in config_channels],
            'position': [c['position'] for c in config_channels],
        })

        for channel in config_channels:
            msg = "Subscribed to config channel %s" % channel['name']
            log_debug(4, msg)
            ret.append(msg)

    # Now that we have the server subscribed to config channels,
    # determine if we have to deploy the files too
    # Don't pass tokens_obj, we only need the token that provided the config
    # channels in the first place
    if deployment:
        log_debug(2, "At least one token has deploy_configs == Y, deploying configs")
        deploy_configs_if_needed(server)

    rhnSQL.commit()

    return ret


_query_server_token_used = rhnSQL.Statement("""
    insert into rhnServerTokenRegs (server_id, token_id)
    values (:server_id, :token_id)
""")

_query_check_server_uses_token = rhnSQL.Statement("""
    select 1 from rhnServerTokenRegs
    where server_id = :server_id
    and token_id = :token_id
""")


def server_used_token(server_id, token_id):
    h = rhnSQL.prepare(_query_check_server_uses_token)
    h.execute(server_id=server_id, token_id=token_id)
    ret = h.fetchone_dict()
    if not ret:
        h = rhnSQL.prepare(_query_server_token_used)
        h.execute(server_id=server_id, token_id=token_id)

_query_check_token_limits = rhnSQL.Statement("""
    select
       rt.usage_limit max_nr,
       ( select count(server_id) from rhnServerTokenRegs
         where token_id = :token_id ) curr_nr
    from rhnRegToken rt
    where rt.id = :token_id
""")


def check_token_limits(server_id, tokens_obj):
    """ check the token registration limits """
    # XXX: would be nice to have those done with triggers in the database
    # land...
    assert(isinstance(tokens_obj, ActivationTokens))
    rhnSQL.transaction("check_token_limits")
    for token in tokens_obj.tokens:
        try:
            _check_token_limits(server_id, token)
        except:
            log_debug(4, "Rolling back transaction")
            rhnSQL.rollback("check_token_limits")
            raise
    return 0


def _check_token_limits(server_id, token_rec):
    token_id = token_rec["token_id"]

    # Mark that we used this token
    server_used_token(server_id, token_id)

    # now check we're not using this token too much
    h = rhnSQL.prepare(_query_check_token_limits)
    h.execute(token_id=token_id)
    ret = h.fetchone_dict()
    if not ret:
        raise rhnException("Could not check usage limits for token",
                           server_id, token_rec)
    # See bug #79095: if usage_limit is NULL, it means unlimited reg tokens
    if ret["max_nr"] is not None and ret["max_nr"] < ret["curr_nr"]:
        log_error("Token usage limit exceeded", token_rec,
                  ret["max_nr"], server_id)
        raise rhnFault(61, _("Maximum usage count of %s reached") % ret["max_nr"])
    # all clean, we're below usage limits
    return 0


class ActivationTokens:

    """
    An aggregation of activation tokens, exposing important information
    like org_id, user_id etc in a unified manner.
    """
    is_rereg_token = 0
    forget_rereg_token = 0

    def __init__(self, tokens, user_id=None, org_id=None,
                 kickstart_session_id=None, entitlements=[], deploy_configs=None, contact_method_id=0):
        self.tokens = tokens
        self.user_id = user_id
        self.org_id = org_id
        self.kickstart_session_id = kickstart_session_id
        # Boolean
        self.deploy_configs = deploy_configs
        # entitlements is list of tuples [(name, label)]
        self.entitlements = entitlements
        self.contact_method_id = contact_method_id

    def __nonzero__(self):
        return (len(self.tokens) > 0)

    __bool__ = __nonzero__

    def get_server_id(self):
        if not self:
            return None
        # We can have only one re-activation key
        for token in self.tokens:
            server_id = token.get('server_id')
            if server_id:
                return server_id
        # We hit this when no re-activation key
        return None

    def get_user_id(self):
        return self.user_id

    def get_org_id(self):
        return self.org_id

    def get_kickstart_session_id(self):
        return self.kickstart_session_id

    def get_entitlements(self):
        return self.entitlements

    def has_entitlement_label(self, entitlement):
        if entitlement in [x[0] for x in self.entitlements]:
            return 1
        return 0

    def get_deploy_configs(self):
        return self.deploy_configs

    def get_contact_method_id(self):
        return self.contact_method_id

    def get_names(self):
        """ Returns a string of the entitlement names that the token grants.
            This function is poorly named.
        """
        token_names = [x[0] for x in self.entitlements]
        if not token_names:
            return None
        return ",".join(token_names)

    def get_tokens(self):
        tokens = []
        for token in self.tokens:
            tokens.append(token['token'])

        return tokens

    def entitle(self, server_id, history, virt_type=None):
        """
        Entitle a server according to the entitlements we have configured.
        """
        log_debug(3, self.entitlements)

        # check for bootstrap_entitled and unentitle first
        cur = check_entitlement(server_id, True)
        if cur and 'bootstrap_entitled' in cur:
            remove_ent = rhnSQL.Procedure("rhn_entitlements.remove_server_entitlement")
            remove_ent(server_id, "bootstrap_entitled")

        entitle_server = rhnSQL.Procedure("rhn_entitlements.entitle_server")
        # TODO: entitle_server calls can_entitle_server, so we're doing this
        # twice for each successful call. Is it necessary for external error
        # handling or can we ditch it?
        can_entitle_server = rhnSQL.Function(
            "rhn_entitlements.can_entitle_server", rhnSQL.types.NUMBER())

        can_ent = None

        history["entitlement"] = ""

        for entitlement in self.entitlements:
            if virt_type is not None and entitlement[0] == VIRT_ENT_LABEL:
                continue

            try:
                can_ent = can_entitle_server(server_id, entitlement[0])
            except rhnSQL.SQLSchemaError:
                e = sys.exc_info()[1]
                can_ent = 0

            try:
                # bugzilla #160077, skip attempting to entitle if we cant
                if can_ent:
                    entitle_server(server_id, entitlement[0])
            except rhnSQL.SQLSchemaError:
                e = sys.exc_info()[1]
                log_error("Token failed to entitle server", server_id,
                          self.get_names(), entitlement[0], e.errmsg)
                #No idea what error may be here...
                raise_with_tb(rhnFault(90, e.errmsg), sys.exc_info()[2])
            except rhnSQL.SQLError:
                e = sys.exc_info()[1]
                log_error("Token failed to entitle server", server_id,
                          self.get_names(), entitlement[0], e.args)
                raise_with_tb(rhnFault(90, str(e)), sys.exc_info()[2])
            else:
                history["entitlement"] = "Entitled as a %s member" % entitlement[1]


class ReRegistrationToken(ActivationTokens):

    """
    Subclass for re-registration keys.

    (i.e. used alone and not combined with other regular activation keys)
    """
    is_rereg_token = 1


class ReRegistrationActivationToken(ReRegistrationToken):

    """
    Subclass for re-registration keys and activation keys used together.
    """
    forget_rereg_token = 1

    def __init__(self, tokens, user_id=None, org_id=None,
            kickstart_session_id=None, entitlements=[],
            remove_entitlements=[], deploy_configs=None, contact_method_id=0):
        ReRegistrationToken.__init__(self, tokens, user_id, org_id,
                kickstart_session_id, entitlements, deploy_configs, contact_method_id)
        self.remove_entitlements = remove_entitlements # list of labels

    def entitle(self, server_id, history, virt_type=None):
        for ent in self.remove_entitlements:
            unentitle_server = rhnSQL.Procedure(
                "rhn_entitlements.remove_server_entitlement")
            try:
                unentitle_server(server_id, ent)
            except rhnSQL.SQLSchemaError:
                e = sys.exc_info()[1]
                log_error("Failed to unentitle server", server_id,
                          ent, e.errmsg)
                raise_with_tb(rhnFault(90, e.errmsg), sys.exc_info()[2])
            except rhnSQL.SQLError:
                e = sys.exc_info()[1]
                log_error("Failed to unentitle server", server_id,
                          ent, e.args)
                raise_with_tb(rhnFault(90, str(e)), sys.exc_info()[2])

        # Call parent method:
        ReRegistrationToken.entitle(self, server_id, history, virt_type)


def _fetch_token_from_cursor(cursor):
    """ Fetches a token from a prepared and executed cursor
        Used by both fetch_token and fetch_org_token
    """
    token_entry = None
    token_entitlements = {}
    while 1:
        row = cursor.fetchone_dict()
        if not row:
            break
        tup = (row['token_type'], row['token_desc'], row['is_base'])
        token_entitlements[tup] = None
        if token_entry:
            # We've seen this token already - the only thing that can be
            # different is the entitlement level, which we've already
            # saved

            # Double-check it's the same token
            assert token_entry['token_id'] == row['token_id'], \
                "Query returned different tokens - missing unique constraint" \
                " on rhnActivationKey.token?"
            continue

        # First entry of this type
        token_entry = row

    return token_entry, token_entitlements


def _categorize_token_entitlements(token_entitlements, entitlements_base,
                                   entitlements_extra):
    """ Given a hash token_entitlements, splits the base ones and puts them in
        the entitlements_base hash, and the extras in entitlements_extra
    """
    for tup in list(token_entitlements.keys()):
        is_base = tup[2]
        ent = (tup[0], tup[1])
        if is_base == 'Y':
            entitlements_base[ent] = None
        else:
            entitlements_extra[ent] = None

    return entitlements_base, entitlements_extra


def _validate_entitlements(token_string, rereg_ents, base_entitlements,
                           extra_entitlements, remove_entitlements):
    """
    Perform various checks on the final list of entitlements accumulated after
    processing all activation keys.

    rereg_ents passed in as a list of entitlement labels.

    Extra/base entitlements passed in as a hash of tuples ('label', 'Friendly
    Name') mapping to None. (i.e. seems to be used as just a set)

    Remove entitlements being maintained as just a list of labels.
    """
    # Check for exactly one base entitlement:
    if len(list(base_entitlements.keys())) != 1:
        log_error("Tokens with different base entitlements", token_string,
                  base_entitlements)
        raise rhnFault(63,
                       _("Stacking of re-registration tokens with different base entitlements "
                         "is not supported"), explain=0)

_query_token = rhnSQL.Statement("""
    select rt.id as token_id,
           sgt.label as token_type,
           sgt.name as token_desc,
           sgt.is_base,
           ak.token,
           rt.user_id,
           rt.org_id,
           rt.note,
           rt.usage_limit,
           rt.server_id,
           ak.ks_session_id kickstart_session_id,
           rt.deploy_configs,
           rt.contact_method_id
    from rhnActivationKey ak, rhnRegToken rt, rhnRegTokenEntitlement rte, rhnServerGroupType sgt
    where ak.token = :token
      and ak.reg_token_id = rt.id
      and rt.disabled = 0
      and rt.id = rte.reg_token_id
      and rte.server_group_type_id = sgt.id
""")

_query_contact_method_ranking = rhnSQL.Statement("""
    select id, rank
      from suseServerContactMethod
""")

def fetch_token(token_string):
    """ Fetches a token from the database """
    log_debug(3, token_string)
    # A token should always be passed to this function
    assert token_string
    tokens = token_string.split(',')
    h = rhnSQL.prepare(_query_token)
    result = []
    rereg_token_found = 0
    num_of_rereg = 0
    # Global user_id and org_id
    user_id = None
    same_user_id = 1
    org_id = None
    ks_session_id_token = None
    deploy_configs = None
    entitlements_base = {}
    entitlements_extra = {}

    # List of re-registration entitlements labels (if found):
    rereg_ents = []

    # 0 = default, 1 = ssh, 2 = ssh-tunnel
    server_contact_method = 0;
    cm_ranking = {}

    ranks = rhnSQL.fetchall_dict(_query_contact_method_ranking)
    for r in ranks:
        cm_ranking[r['id']] = r['rank']

    for token in tokens:
        h.execute(token=token)
        token_entry, token_entitlements = _fetch_token_from_cursor(h)

        if not token_entry:
            # Unable to find the token
            log_error("Invalid token '%s'" % token)
            raise rhnFault(60, _("Could not find token '%s'") % token, explain=0)

        row = token_entry

        if row.get('server_id'):
            rereg_token_found = row
            num_of_rereg += 1

            # Store the re-reg ents:
            for tup in list(token_entitlements.keys()):
                rereg_ents.append(tup[0])

        # Check user_id
        token_user_id = row.get('user_id')

        # 4/27/05 wregglej - Commented this line out 'cause the token_user_id should
        # be allowed to be None. This line was causing problems when registering with
        # an activation key whose creator had been deleted.
        #assert(token_user_id is not None)

        if same_user_id and user_id is not None and user_id != token_user_id:
            log_debug(4, "Different user ids: %s, %s" % (same_user_id, user_id))
            # This token has a different user id than the rest
            same_user_id = 0
        else:
            user_id = token_user_id

        # Check org_id
        token_org_id = row.get('org_id')
        assert(token_org_id is not None)
        if org_id is not None and org_id != token_org_id:
            # Cannot use activation keys from different orgs
            raise rhnFault(63, _("Tokens from mismatching orgs"), explain=0)
        org_id = token_org_id

        # Check kickstart session ids
        token_ks_session_id = row.get('kickstart_session_id')
        if token_ks_session_id is not None:
            if ks_session_id_token is not None:
                ks_session_id = ks_session_id_token['kickstart_session_id']
                if ks_session_id != token_ks_session_id:
                    # Two tokens with different kickstart sessions
                    raise rhnFault(63, _("Kickstart session mismatch"),
                                   explain=0)
            else:
                # This token has kickstart session id info
                ks_session_id_token = row

        # Iterate through the entitlements from this token
        # and intead of picking one entitlement, create a union of
        # all the entitlemts as a list of tuples of (name, label) aka
        # (token_type, token_desc)
        _categorize_token_entitlements(token_entitlements, entitlements_base,
                                       entitlements_extra)

        # Deploy configs?
        deploy_configs = deploy_configs or (row['deploy_configs'] == 'Y')

        # which contact method?
        if cm_ranking[row['contact_method_id']] > cm_ranking[server_contact_method]:
            server_contact_method = row['contact_method_id']
        result.append(row)

    # One should not stack re-activation tokens
    if num_of_rereg > 1:
        raise rhnFault(63,
                       _("Stacking of re-registration tokens is not supported"), explain=0)

    entitlements_remove = []
    _validate_entitlements(token_string, rereg_ents, entitlements_base,
                           entitlements_extra, entitlements_remove)
    log_debug(5, "entitlements_base = %s" % entitlements_base)
    log_debug(5, "entitlements_extra = %s" % entitlements_extra)

    if ks_session_id_token:
        ks_session_id = ks_session_id_token['kickstart_session_id']
    else:
        ks_session_id = None

    # akl add entitles array constructed above to kwargs
    kwargs = {
        'user_id': user_id,
        'org_id': org_id,
        'kickstart_session_id': ks_session_id,
        'entitlements': list(entitlements_base.keys()) + list(entitlements_extra.keys()),
        'deploy_configs': deploy_configs,
        'contact_method_id': server_contact_method,
    }
    log_debug(4, "Values", kwargs)

    if rereg_token_found and len(result) > 1:
        log_debug(4, "re-activation stacked with activationkeys")
        kwargs['remove_entitlements'] = entitlements_remove
        return ReRegistrationActivationToken(result, **kwargs)
    elif rereg_token_found:
        log_debug(4, "simple re-activation")
        return ReRegistrationToken([rereg_token_found], **kwargs)

    return ActivationTokens(result, **kwargs)

# always be sure this query has matching columns as _query_token above...
_query_org_default_token = rhnSQL.Statement("""
    select rt.id as token_id,
           sgt.label as token_type,
           sgt.name as token_desc,
           sgt.is_base,
           ak.token,
           rt.user_id,
           rt.org_id,
           rt.note,
           -- Default tokens have no usage limit
           NULL usage_limit,
           rt.server_id,
           NULL kickstart_session_id,
           rt.deploy_configs
      from rhnServerGroupType sgt,
           rhnActivationKey ak,
           rhnRegToken rt,
           rhnRegTokenOrgDefault rtod,
           rhnRegTokenEntitlement rte
     where rtod.org_id = :org_id
       and rtod.reg_token_id = rt.id
       and rt.id =  rte.reg_token_id
       and rt.disabled = 0
       and rte.server_group_type_id = sgt.id
       and ak.reg_token_id = rtod.reg_token_id
""")


def fetch_org_token(org_id):
    log_debug(3, org_id)
    h = rhnSQL.prepare(_query_org_default_token)
    h.execute(org_id=org_id)
    token_entry, token_entitlements = _fetch_token_from_cursor(h)
    entitlements_base = {}
    entitlements_extra = {}
    _categorize_token_entitlements(token_entitlements, entitlements_base,
                                   entitlements_extra)

    kwargs = {}
    tokens = []
    if token_entry:
        kwargs = {
            'user_id': token_entry['user_id'],
            'org_id': token_entry['org_id'],
            'kickstart_session_id': token_entry['kickstart_session_id'],
            'entitlements': list(entitlements_base.keys()) + list(entitlements_extra.keys()),
            'deploy_configs': token_entry['deploy_configs'] == 'Y',
        }
        tokens.append(token_entry)

    return ActivationTokens(tokens, **kwargs)


_query_disable_token = rhnSQL.Statement("""
    update rhnRegToken
       set disabled = 1
     where id = :token_id
""")


def disable_token(tokens_obj):
    assert(isinstance(tokens_obj, ActivationTokens))
    h = rhnSQL.prepare(_query_disable_token)
    for token in tokens_obj.tokens:
        if token.get("server_id"):
            # only disable re-activation tokens
            h.execute(token_id=token["token_id"])


def process_token(server, server_arch, tokens_obj, virt_type=None):
    """ perform registration tasks for a server as indicated by a token """
    assert(isinstance(tokens_obj, ActivationTokens))
    server_id = server['id']
    log_debug(1, server_id, tokens_obj.get_names())

    # Keep track of what we're doing
    history = {}

    # the tokens are confirmed, mark this server as using it and make
    # sure we're within limits
    check_token_limits(server_id, tokens_obj)

    is_reactivation = rhnFlags.test('re_registration_token')

    # channels
    history["channels"] = token_channels(server, server_arch, tokens_obj)

    if is_reactivation:
        # If it's a re-registration, the server is already entitled
        history["entitlement"] = "Re-activation: keeping previous entitlement level"
    else:
        tokens_obj.entitle(server_id, history, virt_type)

    is_management_entitled = None

    if tokens_obj.has_entitlement_label('enterprise_entitled'):
        is_management_entitled = 1

    if is_reactivation:
        history["groups"] = ["Re-activation: keeping previous server groups"]
    else:
        # server groups - allowed for enterprise only
        if is_management_entitled:
            history["groups"] = token_server_groups(server_id, tokens_obj)
        else:
            # FIXME:  better messaging about minimum service level
            history["groups"] = [
                "Not subscribed to any system groups: not entitled for "
                "Management"
            ]

    if is_management_entitled:
        history["packages"] = token_packages(server_id, tokens_obj)
        history["config_channels"] = token_config_channels(server,
                                                           tokens_obj)
    else:
        history["packages"] = ["Insufficient service level for automatic package installation."]
        history["config_channels"] = ["Insufficient service level for config channel subscription."]

    # build the report and send it back
    return history_report(history)


def history_report(history):
    """ build a mildly html-ized version of the history as a report """
    # header information
    report = "Entitlement Information:\n"
    report += "<ul><li>%s</li></ul>" % history["entitlement"]
    report += "\n"
    # print out channels
    report += history_subreport(history, "groups",
                                "Channel Subscription Information:",
                                "The token does not include default Channel Subscriptions")

    # print out the groups
    report += history_subreport(history, "groups",
                                "System Group Membership Information:",
                                "The token does not include default System Group Membership")

    # auto-installed packages...
    report += history_subreport(history, "packages",
                                "Packages Scheduled for Installation:",
                                "No packages scheduled for automatic installation")

    # config channels...
    report += history_subreport(history, 'config_channels',
                                "Config Channel Subscription Information:",
                                "The token does not include default configuration channels")

    return report


def history_subreport(history, key, title, emptymsg):
    if key in history:
        subreport = title + "\n"
        subreport += "<ul>\n"

        for c in history[key]:
            subreport += "<li>%s</li>\n" % c

        if len(history[key]) == 0:
            subreport += "<li>%s</li>\n" % emptymsg

        subreport += "</ul>\n"
    return subreport
  070701000001CA000081B40000000000000000000000015FBBE8EE00000FA4000000000000000000000000000000000000003500000000spacewalk-backend/server/rhnServer/server_wrapper.py  # -*- coding: utf-8 -*-
#
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# this file implements the ServerWrapper class, which takes care
# of all the load and save functions for misc tables associated
# with a server (such as packages, hardware, history)
#
# the server.Server class inherits this ServerWrapper class
#

from .server_hardware import Hardware
from .server_packages import Packages
from .server_history import History
from .server_suse import SuseData

from rhn.UserDictCase import UserDictCase
from spacewalk.server import rhnSQL

class ServerWrapper(Packages, Hardware, History, SuseData):
    """ This is a middle class that ties all the subclasses together, plus it
        provides a cleaner way to keep all the wrapper functions in one place.
        The main Server class is based on this one and it looks a little bit
        cleaner that way.
    """

    def __init__(self):
        self.server = UserDictCase()
        Packages.__init__(self)
        History.__init__(self)
        Hardware.__init__(self)
        SuseData.__init__(self)

    def __repr__(self):
        return "<%s instance>" % (self.__class__,)

    def set_value(self, name, value):
        """ update a value in self.server """
        if name is None or value is None:
            return -1
        self.server[name] = value
        return 0

    ###
    # PACKAGES
    ###

    def add_package(self, entry):
        """ Wrappers for the similar functions from Packages class that supplementaly
            require a valid sysid.
        """
        return Packages.add_package(self, self.server.get("id"), entry)

    def delete_package(self, entry):
        return Packages.delete_package(self, self.server.get("id"), entry)

    def dispose_packages(self):
        return Packages.dispose_packages(self, self.server["id"])

    def save_packages(self, schedule=1):
        """ wrapper for the Packages.save_packages_byid() which requires the sysid """
        ret = self.save_packages_byid(self.server["id"], schedule=schedule)
        # this function is primarily called from outside
        # so we have to commit here
        rhnSQL.commit()
        return ret

    ###
    # HARDWARE
    ###

    def delete_hardware(self):
        """ Wrappers for the similar functions from Hardware class """
        return Hardware.delete_hardware(self, self.server.get("id"))

    def save_hardware(self):
        """ wrapper for the Hardware.save_hardware_byid() which requires the sysid """
        ret = self.save_hardware_byid(self.server["id"])
        # this function is primarily called from outside
        # so we have to commit here
        rhnSQL.commit()
        return ret

    def reload_hardware(self):
        """ wrapper for the Hardware.reload_hardware_byid() which requires the sysid """
        ret = self.reload_hardware_byid(self.server["id"])
        return ret

    ###
    # HISTORY
    ###
    def save_history(self):
        ret = self.save_history_byid(self.server["id"])
        # this function is primarily called from outside
        # so we have to commit here
        rhnSQL.commit()
        return ret

    ###
    ### SUSE PRODUCT DATA
    ###
    def save_suse_products(self):
        ret = self.save_suse_products_byid(self.server["id"])
        rhnSQL.commit()
        return ret

    def update_suse_products(self, products):
        self.add_suse_products(products)
        return self.save_suse_products()
070701000001CB000081B40000000000000000000000015FBBE8EE000010FB000000000000000000000000000000000000002700000000spacewalk-backend/server/rhnSession.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Session management
#


import hashlib
import time
import sys

from spacewalk.common.rhnConfig import CFG
from uyuni.common.usix import raise_with_tb

from . import rhnSQL


class InvalidSessionError(Exception):
    pass


class ExpiredSessionError(Exception):
    pass


class Session:

    def __init__(self, session_id=None):
        self.session_id = session_id
        self.expires = None
        self.uid = None
        self.duration = None

    def generate(self, duration=None, web_user_id=None):
        # Grabs a session ID
        self.session_id = rhnSQL.Sequence('pxt_id_seq').next()
        self.duration = int(duration or CFG.SESSION_LIFETIME)
        self.web_user_id(web_user_id)
        return self

    def _get_secrets(self):
        # Reads the four secrets from the config file
        return list(map(lambda x, cfg=CFG: getattr(cfg, 'session_secret_%s' % x),
                    list(range(1, 5))))

    def get_secrets(self):
        # Validates the secrets from the config file
        secrets = self._get_secrets()
        if len(secrets) != len([_f for _f in secrets if _f]):
            # the list of secrets has unset items
            raise Exception("Secrets not set in the config file")
        return secrets

    def digest(self):
        if self.session_id is None:
            raise ValueError("session id not supplied")

        secrets = self.get_secrets()

        ctx = hashlib.new('sha256')
        ctx.update(':'.join(secrets[:2] + [str(self.session_id)] + secrets[2:]).encode())

        return ctx.hexdigest()

    def get_session(self):
        return "%sx%s" % (self.session_id, self.digest())

    def web_user_id(self, uid=None):
        if uid:
            self.uid = uid
        return self.uid

    def load(self, session):
        arr = session.split('x', 1)
        if len(arr) != 2:
            raise InvalidSessionError("Invalid session string")

        digest = arr[1]
        if len(digest) != 64:
            raise InvalidSessionError("Invalid session string (wrong length)")

        try:
            self.session_id = int(arr[0])
        except ValueError:
            raise_with_tb(InvalidSessionError("Invalid session identifier"), sys.exc_info()[2])

        if digest != self.digest():
            raise InvalidSessionError("Bad session checksum")

        h = rhnSQL.prepare("""
            select web_user_id, expires, value
              from pxtSessions
             where id = :session_id
        """)
        h.execute(session_id=self.session_id)

        row = h.fetchone_dict()
        if row:
            # Session is stored in the DB
            if time.time() < row['expires']:
                # And it's not expired yet - good to go
                self.expires = row['expires']
                self.uid = row['web_user_id']
                return self

            # Old session - clean it up
            h = rhnSQL.prepare("""
                    delete from pxtSessions where id = :session_id
            """)
            h.execute(session_id=self.session_id)
            rhnSQL.commit()

        raise ExpiredSessionError("Session not found")

    def save(self):
        expires = int(time.time()) + self.duration

        h = rhnSQL.prepare("""
                insert into PXTSessions (id, web_user_id, expires, value)
                values (:id, :web_user_id, :expires, :value)
        """)
        h.execute(id=self.session_id, web_user_id=self.uid,
                  expires=expires, value='RHNAPP')
        rhnSQL.commit()
        return self


def load(session_string):
    return Session().load(session_string)


def generate(web_user_id=None, duration=None):
    return Session().generate(web_user_id=web_user_id, duration=duration).save()
 070701000001CC000081B40000000000000000000000015FBBE8EE00005A08000000000000000000000000000000000000002400000000spacewalk-backend/server/rhnUser.py   #
# Copyright (c) 2008--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Stuff for handling Certificates and Servers
#

import re
import crypt

# Global Modules
from rhn.UserDictCase import UserDictCase
from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.common.rhnConfig import CFG
from spacewalk.common.rhnException import rhnFault, rhnException
from spacewalk.common.rhnTranslate import _

from . import rhnSQL
from . import rhnSession


class User:

    """ Main User class """

    def __init__(self, username, password):
        # compatibilty with the rest of the code
        self.username = username

        # placeholders for the table schemas
        # web_contact
        self.contact = rhnSQL.Row("web_contact", "id")
        self.contact["login"] = username
        self.contact["password"] = password
        # web_customer
        self.customer = rhnSQL.Row("web_customer", "id")
        self.customer["name"] = username
        self.customer["password"] = password
        # web_user_personal_info
        self.__init_info()
        # web_user_contact_permission
        self.__init_perms()
        # web_user_site_info
        self.__init_site()
        self._session = None

    def __init_info(self):
        """ init web_user_personal_info """
        # web_user_personal_info
        self.info = rhnSQL.Row("web_user_personal_info",
                               "web_user_id")
        self.info['first_names'] = "Valued"
        self.info['last_name'] = "Customer"
        self.info['prefix'] = "Mr."

    def __init_perms(self):
        """ init web_user_contact_permission """
        # web_user_contact_permission
        self.perms = rhnSQL.Row("web_user_contact_permission",
                                "web_user_id")
        self.perms["email"] = "Y"
        self.perms["mail"] = "Y"
        self.perms["call"] = "Y"
        self.perms["fax"] = "Y"

    def __init_site(self):
        """ init web_user_site_info """
        # web_user_site_info
        self.site = rhnSQL.Row("web_user_site_info", "id")
        self.site['city'] = "."
        self.site['address1'] = "."
        self.site['country'] = "US"
        self.site['type'] = "M"
        self.site['notes'] = "Entry created by Spacewalk registration process"

    def check_password(self, password, allow_read_only=False):
        """ simple check for a password that might become more complex sometime """
        if not allow_read_only and is_user_read_only(self.contact["login"]):
            raise rhnFault(702)
        good_pwd = str(self.contact["password"])
        if CFG.pam_auth_service:
            # a PAM service is defined
            # We have to check the user's rhnUserInfo.use_pam_authentication
            # XXX Should we create yet another __init_blah function?
            # since it's the first time we had to lool at rhnUserInfo,
            # I'll assume it's not something to happen very frequently,
            # so I'll use a query for now
            # - misa
            #
            h = rhnSQL.prepare("""
                select ui.use_pam_authentication
                from web_contact w, rhnUserInfo ui
                where w.login_uc = UPPER(:login)
                and w.id = ui.user_id""")
            h.execute(login=self.contact["login"])
            data = h.fetchone_dict()
            if not data:
                # This should not happen
                raise rhnException("No entry found for user %s" %
                                   self.contact["login"])
            if data['use_pam_authentication'] == 'Y':
                # use PAM
                from . import rhnAuthPAM
                return rhnAuthPAM.check_password(self.contact["login"],
                                                 password, CFG.pam_auth_service)
        # If the entry in rhnUserInfo is 'N', perform regular authentication
        ret = check_password(password, good_pwd)
        if ret and CFG.encrypted_passwords and self.contact['password'].find('$1$') == 0:
            # If successfully authenticated and the current password is
            # MD5 encoded, convert the password to SHA-256 and save it in the DB.
            self.contact['password'] = encrypt_password(password)
            self.contact.save()
            rhnSQL.commit()
        return ret

    def set_org_id(self, org_id):
        if not org_id:
            raise rhnException("Invalid org_id requested for user", org_id)
        self.contact["org_id"] = int(org_id)
        self.customer.load(int(org_id))

    def getid(self):
        if not self.contact.has_key("id"):
            userid = rhnSQL.Sequence("web_contact_id_seq")()
            self.contact.data["id"] = userid  # kind of illegal, but hey!
        else:
            userid = self.contact["id"]
        return userid

    def set_contact_perm(self, name, value):
        """ handling of contact permissions """
        if not name:
            return -1
        n = name.lower()
        v = 'N'
        if value:
            v = 'Y'
        if n == "contact_phone":
            self.perms["call"] = v
        elif n == "contact_mail":
            self.perms["mail"] = v
        elif n == "contact_email":
            self.perms["email"] = v
        elif n == "contact_fax":
            self.perms["fax"] = v
        return 0

    def set_info(self, name, value):
        """ set a certain value for the userinfo field. This is BUTT ugly. """
        log_debug(3, name, value)
        # translation from what the client send us to real names of the fields
        # in the tables.
        mapping = {
            "first_name": "first_names",
            "position": "title",
            "title": "prefix"
        }
        if not name:
            return -1
        name = name.lower()
        if type(value) == type(""):
            value = value.strip()
        # We have to watch over carefully for different field names
        # being sent from rhn_register
        changed = 0

        # translation
        if name in list(mapping.keys()):
            name = mapping[name]
        # Some fields can not have null string values
        if name in ["first_names", "last_name", "prefix",  # personal_info
                    "address1", "city", "country"]:       # site_info
            # we require something of it
            if len(str(value)) == 0:
                return -1
        # fields in personal_info (and some in site)
        if name in ["last_name", "first_names",
                    "company", "phone", "fax", "email", "title"]:
            self.info[name] = value[:128]
            changed = 1
        elif name == "prefix":
            values = ["Mr.", "Mrs.", "Ms.", "Dr.", "Hr.", "Sr.", " "]
            # Now populate a dictinary of valid values
            valids = UserDictCase()
            for v in values:  # initialize from good values, with and w/o the dot
                valids[v] = v
                valids[v[:-1]] = v
            # commonly encountered values
            valids["Miss"] = "Miss"
            valids["Herr"] = "Hr."
            valids["Sig."] = "Sr."
            valids["Sir"] = "Mr."
            # Now check it out
            if valids.has_key(value):
                self.info["prefix"] = valids[value]
                changed = 1
            else:
                log_error("Unknown prefix value `%s'. Assumed `Mr.' instead"
                          % value)
                self.info["prefix"] = "Mr."
                changed = 1

        # fields in site
        if name in ["phone", "fax", "zip"]:
            self.site[name] = value[:32]
            changed = 1
        elif name in ["city",  "country", "alt_first_names", "alt_last_name",
                      "address1", "address2", "email",
                      "last_name", "first_names"]:
            if name == "last_name":
                self.site["alt_last_name"] = value
                changed = 1
            elif name == "first_names":
                self.site["alt_first_names"] = value
                changed = 1
            else:
                self.site[name] = value[:128]
                changed = 1
        elif name in ["state"]:  # stupid people put stupid things in here too
            self.site[name] = value[:60]
            changed = 1
        if not changed:
            log_error("SET_INFO: Unknown info `%s' = `%s'" % (name, value))
        return 0

    def get_roles(self):
        user_id = self.getid()

        h = rhnSQL.prepare("""
            select ugt.label as role
              from rhnUserGroup ug,
                   rhnUserGroupType ugt,
                   rhnUserGroupMembers ugm
             where ugm.user_id = :user_id
               and ugm.user_group_id = ug.id
               and ug.group_type = ugt.id
        """)
        h.execute(user_id=user_id)
        return [x['role'] for x in h.fetchall_dict() or []]

    def reload(self, user_id):
        """ Reload the current data from the SQL database using the given id """
        log_debug(3, user_id)

        # If we can not load these we have a fatal condition
        if not self.contact.load(user_id):
            raise rhnException("Could not find contact record for id", user_id)
        if not self.customer.load(self.contact["org_id"]):
            raise rhnException("Could not find org record",
                               "user_id = %s" % user_id,
                               "org_id = %s" % self.contact["org_id"])
        # These other ones are non fatal because we can create dummy records
        if not self.info.load(user_id):
            self.__init_info()
        if not self.perms.load(user_id):
            self.__init_perms()
        # The site info is trickier, we need to find it first
        if not self.site.load_sql("web_user_id = :userid and type = 'M'",
                                  {"userid": user_id}):
            self.__init_site()
        # Fix the username
        self.username = self.contact['login']
        return 0

    def create_session(self):
        if self._session:
            return self._session

        self.session = rhnSession.generate(web_user_id=self.getid())
        return self.session


def auth_username_password(username, password):
    # hrm.  it'd be nice to move importlib.userAuth stuff here
    user = search(username)

    if not user:
        raise rhnFault(2, _("Invalid username/password combination"))

    if not user.check_password(password):
        raise rhnFault(2, _("Invalid username/password combination"))

    return user


def session_reload(session_string):
    log_debug(4, session_string)
    session = rhnSession.load(session_string)
    web_user_id = session.uid
    if not web_user_id:
        raise rhnSession.InvalidSessionError("No user associated with session")

    u = User("", "")
    ret = u.reload(web_user_id)
    if ret != 0:
        # Something horked
        raise rhnFault(10)
    return u


def get_user_id(username):
    """ search for an userid """
    username = str(username)
    h = rhnSQL.prepare("""
    select w.id from web_contact w
    where w.login_uc = upper(:username)
    """)
    h.execute(username=username)
    data = h.fetchone_dict()
    if data:
        return data["id"]
    return None


def search(user):
    """ search the database for a user """
    log_debug(3, user)
    userid = get_user_id(user)
    if not userid:  # no user found
        return None
    ret = User(user, "")
    if not ret.reload(userid) == 0:
        # something horked during reloading entry from database
        # we can not realy say that the entry does not exist...
        raise rhnFault(10)
    return ret


def is_user_disabled(user):
    log_debug(3, user)
    username = str(user)
    h = rhnSQL.prepare("""
    select 1 from rhnWebContactDisabled
    where login_uc = upper(:username)
    """)
    h.execute(username=username)
    row = h.fetchone_dict()
    if row:
        return 1
    return 0


def is_user_read_only(user):
    log_debug(3, user)
    username = str(user)
    h = rhnSQL.prepare("""
    select 1 from web_contact
    where login_uc = upper(:username)
    and read_only = 'Y'
    """)
    h.execute(username=username)
    row = h.fetchone_dict()
    if row:
        return 1
    return 0


def reserve_user(username, password):
    """ create a reservation record """
    return __reserve_user_db(username, password)


def __reserve_user_db(user, password):
    encrypted_password = CFG.encrypted_passwords
    log_debug(3, user, CFG.disallow_user_creation, encrypted_password, CFG.pam_auth_service)
    user = str(user)
    h = rhnSQL.prepare("""
    select w.id, w.password, w.org_id, ui.use_pam_authentication
    from web_contact w, rhnUserInfo ui
    where w.login_uc = upper(:p1)
    and w.id = ui.user_id
    """)
    h.execute(p1=user)
    data = h.fetchone_dict()
    if data and data["id"]:
        # contact exists, check password
        if data['use_pam_authentication'] == 'Y' and CFG.pam_auth_service:
            # We use PAM for authentication
            from . import rhnAuthPAM
            if rhnAuthPAM.check_password(user, password, CFG.pam_auth_service) > 0:
                return 1
            return -1

        if check_password(password, data['password']) > 0:
            return 1
        return -1

    # user doesn't exist.  now we fail, instead of reserving user.
    if CFG.disallow_user_creation:
        raise rhnFault(2001)
    user, password = check_user_password(user, password)

    # now check the reserved table
    h = rhnSQL.prepare("""
    select r.login, r.password from rhnUserReserved r
    where r.login_uc = upper(:p1)
    """)
    h.execute(p1=user)
    data = h.fetchone_dict()
    if data and data["login"]:
        # found already reserved
        if check_password(password, data["password"]) > 0:
            return 1
        return -2

    validate_new_username(user)
    log_debug(3, "calling validate_new_password")
    validate_new_password(password)

    # this is not reserved either, register it
    if encrypted_password:
        # Encrypt the password, let the function pick the salt
        password = encrypt_password(password)

    h = rhnSQL.prepare("""
    insert into rhnUserReserved (login, password)
    values (:username, :password)
    """)
    h.execute(username=user, password=password)
    rhnSQL.commit()

    # all should be dandy
    return 0


def new_user(username, password, email, org_id, org_password):
    """ create a new user account """
    return __new_user_db(username, password, email, org_id, org_password)


def __new_user_db(username, password, email, org_id, org_password):
    encrypted_password = CFG.encrypted_passwords
    log_debug(3, username, email, encrypted_password)

    # now search it in the database
    h = rhnSQL.prepare("""
    select w.id, w.password, ui.use_pam_authentication
    from web_contact w, rhnUserInfo ui
    where w.login_uc = upper(:username)
    and w.id = ui.user_id
    """)
    h.execute(username=username)
    data = h.fetchone_dict()

    pre_existing_user = 0

    if not data:
        # the username is not there, check the reserved user table
        h = rhnSQL.prepare("""
        select login, password from rhnUserReserved
        where login_uc = upper(:username)
        """)
        h.execute(username=username)
        data = h.fetchone_dict()
        if not data:  # nope, not reserved either
            raise rhnFault(1, _("Username `%s' has not been reserved") % username)
    else:
        pre_existing_user = 1

    if not pre_existing_user and not email:
        # New accounts have to specify an e-mail address
        raise rhnFault(30, _("E-mail address not specified"))

    # we have to perform PAM authentication if data has a field called
    # 'use_pam_authentication' and its value is 'Y', and we do have a PAM
    # service set in the config file.
    # Note that if the user is only reserved we don't do PAM authentication
    if data.get('use_pam_authentication') == 'Y' and CFG.pam_auth_service:
        # Check the password with PAM
        from . import rhnAuthPAM
        if rhnAuthPAM.check_password(username, password, CFG.pam_auth_service) <= 0:
            # Bad password
            raise rhnFault(2)
        # We don't care about the password anymore, replace it with something
        import time
        password = 'pam:%.8f' % time.time()
    else:
        # Regular authentication
        if check_password(password, data["password"]) == 0:
            # Bad password
            raise rhnFault(2)

    # creation of user was never supported in spacewalk but this call was mis-used
    # to check username/password in the past
    # so let's skip other checks and return now
    return 0


def check_user_password(username, password):
    """ Do some minimal checks on the data thrown our way. """
    # username is required
    if not username:
        raise rhnFault(11)
    # password is required
    if not password:
        raise rhnFault(12)
    if len(username) < CFG.MIN_USER_LEN:
        raise rhnFault(13, _("username should be at least %d characters")
                       % CFG.MIN_USER_LEN)
    if len(username) > CFG.MAX_USER_LEN:
        raise rhnFault(700, _("username should be less than %d characters")
                       % CFG.MAX_USER_LEN)
    username = username[:CFG.MAX_USER_LEN]

    # Invalid characters
    # ***NOTE*** Must coordinate with web and installer folks about any
    # changes to this set of characters!!!!
    invalid_re = re.compile(".*[\s&+%'`\"=#]", re.I)
    tmp = invalid_re.match(username)
    if tmp is not None:
        pos = tmp.regs[0]
        raise rhnFault(15, _("username = `%s', invalid character `%s'") % (
            username, username[pos[1] - 1]))

    # use new password validation method
    validate_new_password(password)

    return username, password


def check_email(email):
    """ Do some minimal checks on the e-mail address """
    if email is not None:
        email = email.strip()

    if not email:
        # Still supported
        return None

    if len(email) > CFG.MAX_EMAIL_LEN:
        raise rhnFault(100, _("Please limit your e-mail address to %s chars") %
                       CFG.MAX_EMAIL_LEN)
    # XXX More to come (check the format is indeed foo@bar.baz
    return email


def check_password(key, pwd1):
    """ Validates the given key against the current or old password
        If encrypted_password is false, it compares key with pwd1.
        If encrypted_password is true, it compares the encrypted key
        with pwd1.

        Historical note: we used to compare the passwords case-insensitive, and that
        was working fine until we started to encrypt passwords. -- misa 20030530
    """
    encrypted_password = CFG.encrypted_passwords
    log_debug(4, "Encrypted password:", encrypted_password)
    # We don't trust the origin for key, so stringify it
    key = str(key)
    if len(key) == 0:
        # No zero-length passwords accepted
        return 0

    if not encrypted_password:
        # Unencrypted passwords
        if key == pwd1:  # good password
            return 1
        log_debug(4, "Unencrypted password doesn't match")
        return 0  # Invalid

    # Crypted passwords in the database
    if pwd1.find("$5") == 0:    # SHA-256 encrypted password
        if pwd1 == encrypt_password(key, pwd1, 'SHA-256'):
            return 1
    elif pwd1.find("$1$") == 0:  # MD5 encrypted password
        if pwd1 == encrypt_password(key, pwd1, 'MD5'):
            return 1

    log_debug(4, "Encrypted password doesn't match")
    return 0  # invalid


def encrypt_password(key, salt=None, method='SHA-256'):
    """ Encrypt the key
        If no salt is supplied, generates one (md5-crypt salt)
    """

    pw_params = {
        'MD5': [8, "$1$"],      # method: [salt length, prefix]
        'SHA-256': [16, "$5$"],
    }

    if not salt:
        # No salt supplied, generate it ourselves
        import base64
        import time
        import os
        # Get the first 15 digits after the decimal point from time.time(), and
        # add the pid too
        salt = (time.time() % 1) * 1e15 + os.getpid()
        # base64 it and keep only the first n chars
        salt = base64.encodestring(str(salt).encode()).decode()[:pw_params[method][0]]
        # slap the magic in front of the salt
        salt = pw_params[method][1] + salt + '$'
    salt = str(salt)
    return crypt.crypt(key, salt)


def validate_new_password(password):
    """ Perform all the checks required for new passwords """
    log_debug(3, "Entered validate_new_password")
    #
    # We're copying the code because we don't want to
    # invalidate any of the existing passwords.
    #

    # Validate password based on configurable length
    # regular expression
    if not password:
        raise rhnFault(12)
    if len(password) < CFG.MIN_PASSWD_LEN:
        raise rhnFault(14, _("password must be at least %d characters")
                       % CFG.MIN_PASSWD_LEN)
    if len(password) > CFG.MAX_PASSWD_LEN:
        raise rhnFault(701, _("Password must be shorter than %d characters")
                       % CFG.MAX_PASSWD_LEN)

    password = password[:CFG.MAX_PASSWD_LEN]
    invalid_re = re.compile(
        r"[^ A-Za-z0-9`!@#$%^&*()-_=+[{\]}\\|;:'\",<.>/?~]")
    asterisks_re = re.compile(r"^\**$")

    # make sure the password isn't all *'s
    tmp = asterisks_re.match(password)
    if tmp is not None:
        raise rhnFault(15, "password cannot be all asterisks '*'")

    # make sure we have only printable characters
    tmp = invalid_re.search(password)
    if tmp is not None:
        pos = tmp.regs[0]
        raise rhnFault(15,
                       _("password contains character `%s'") % password[pos[1] - 1])


def validate_new_username(username):
    """ Perform all the checks required for new usernames. """
    log_debug(3)
    if len(username) < CFG.MIN_NEW_USER_LEN:
        raise rhnFault(13, _("username should be at least %d characters long")
                       % CFG.MIN_NEW_USER_LEN)

    disallowed_suffixes = CFG.DISALLOWED_SUFFIXES or []
    if not isinstance(disallowed_suffixes, type([])):
        disallowed_suffixes = [disallowed_suffixes]

    log_debug(4, "Disallowed suffixes", disallowed_suffixes)

    for suffix in disallowed_suffixes:
        if username[-len(suffix):].upper() == suffix.upper():
            raise rhnFault(106, _("Cannot register usernames ending with %s") %
                           suffix)
070701000001CD000081B40000000000000000000000015FBBE8EE0000937C000000000000000000000000000000000000002E00000000spacewalk-backend/server/rhnVirtualization.py #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# This file contains classes and functions that save and retrieve virtual
# instance information.
#


import time
import sys

from uyuni.common.usix import raise_with_tb, LongType
from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.server import rhnSQL
from spacewalk.server.rhnServer import server_lib
from spacewalk.server.rhnSQL import procedure

###############################################################################
# Constants
###############################################################################

##
# Ugh... These types should be the same as on the client.  We should consider
# finding a way to share this code.  Possibly move to rhnlib?  I dunno.
#


class ListenerEvent:
    GUEST_DISCOVERED = "guest_discovered"
    GUEST_MIGRATED = "guest_migrated"

    GUEST_REGISTERED = "guest_registered"


class ClientStateType:
    NOSTATE = 'nostate'
    RUNNING = 'running'
    BLOCKED = 'blocked'
    PAUSED = 'paused'
    SHUTDOWN = 'shutdown'
    SHUTOFF = 'shutoff'
    CRASHED = 'crashed'


class ServerStateType:
    UNKNOWN = 'unknown'
    STOPPED = 'stopped'
    RUNNING = 'running'
    CRASHED = 'crashed'
    PAUSED = 'paused'


class VirtualizationType:
    PARA = 'para_virtualized'
    FULLY = 'fully_virtualized'
    QEMU = 'qemu'
    HYPERV = 'hyperv'
    VMWARE = 'vmware'
    VIRTAGE = 'virtage'
    VBOX = 'virtualbox'

class IdentityType:
    HOST = 'host'
    GUEST = 'guest'


class EventType:
    EXISTS = 'exists'
    REMOVED = 'removed'
    CRAWL_BEGAN = 'crawl_began'
    CRAWL_ENDED = 'crawl_ended'


class TargetType:
    SYSTEM = 'system'
    DOMAIN = 'domain'
    LOG_MSG = 'log_message'


class PropertyType:
    NAME = 'name'
    UUID = 'uuid'
    TYPE = 'virt_type'
    MEMORY = 'memory_size'
    VCPUS = 'vcpus'
    STATE = 'state'
    IDENTITY = 'identity'
    ID = 'id'
    MESSAGE = 'message'

CLIENT_SERVER_STATE_MAP = {
    ClientStateType.NOSTATE: ServerStateType.RUNNING,
    ClientStateType.RUNNING: ServerStateType.RUNNING,
    ClientStateType.BLOCKED: ServerStateType.RUNNING,
    ClientStateType.PAUSED: ServerStateType.PAUSED,
    ClientStateType.SHUTDOWN: ServerStateType.STOPPED,
    ClientStateType.SHUTOFF: ServerStateType.STOPPED,
    ClientStateType.CRASHED: ServerStateType.CRASHED
}

###############################################################################
# VirtualizationEventError Class
###############################################################################


class VirtualizationEventError(Exception):
    pass

###############################################################################
# Listener Interface
###############################################################################


class Listeners:

    """ Abusing python to get a singleton behavior. """
    listeners = []


def add_listener(listener):
    """
    Allows other components of the server to listen for virtualization
    related events.
    """
    log_debug(3, "Virt listener added: %s" % str(listener))

    # Don't add the listener if it's already there.
    if not listener in Listeners.listeners:
        Listeners.listeners.append(listener)


###############################################################################
# VirtualizationEventHandler Class
###############################################################################

##
# This class handles virtualization events.
#
class VirtualizationEventHandler:

    ##
    # This map defines how to route each event to the appropriate handler.
    #
    HANDLERS = {
        (EventType.EXISTS,      TargetType.SYSTEM): '_handle_system_exists',
        (EventType.EXISTS,      TargetType.DOMAIN): '_handle_domain_exists',
        (EventType.REMOVED,     TargetType.DOMAIN): '_handle_domain_removed',
        (EventType.CRAWL_BEGAN, TargetType.SYSTEM): '_handle_system_crawl_began',
        (EventType.CRAWL_ENDED, TargetType.SYSTEM): '_handle_system_crawl_ended',
        (EventType.EXISTS,      TargetType.LOG_MSG): '_handle_log_msg_exists'
    }

    ##
    # This map defines the absolute required properties for each event type.
    #
    REQUIRED_PROPERTIES = {
        (EventType.EXISTS, TargetType.SYSTEM): (PropertyType.IDENTITY,
                                                PropertyType.UUID, ),
        (EventType.EXISTS, TargetType.DOMAIN): (PropertyType.UUID, ),
        (EventType.EXISTS, TargetType.LOG_MSG): (PropertyType.MESSAGE,
                                                 PropertyType.ID, )
    }

    ###########################################################################
    # Public Methods
    ###########################################################################

    def __init__(self):
        pass

    def handle(self, system_id, notification):

        log_debug(5, "Handling notification:", system_id, notification)

        # First, validate that the notification is in the correct format.  If it
        # is not, we'll bail out.
        if len(notification) != 4:
            raise VirtualizationEventError(
                "Received invalid notification length:", notification,
                "; len=", len(notification))

        # Now we are ready to field the notification.  Begin by parsing it.
        (timestamp, action, target, properties) = notification

        event = (action, target)

        # Fetch the appropriate handler.
        handler = None
        try:
            handler = getattr(self, self.HANDLERS[event])
        except KeyError:
            ke = sys.exc_info()[1]
            raise_with_tb(VirtualizationEventError(
                "Don't know how to handle virt event:", event), sys.exc_info()[2])

        # Ensure that the event has any required properties before calling the
        # handler.
        if event in self.REQUIRED_PROPERTIES:
            required_properties = self.REQUIRED_PROPERTIES[event]
            for required_property in required_properties:
                if required_property not in properties:
                    raise VirtualizationEventError(
                        "Event does not have required property:",
                        required_property,
                        event)

        # Some properties need to be preprocessed before we can actually
        # handle the notification.
        self.__convert_properties(properties)

        # Call the handler.
        handler(system_id, timestamp, properties)

    ###########################################################################
    # Protected Methods
    ###########################################################################

    def _handle_system_exists(self, system_id, timestamp, properties):
        uuid = properties[PropertyType.UUID]
        identity = properties[PropertyType.IDENTITY]
        virt_type = None

        if PropertyType.TYPE in properties:
            virt_type = properties[PropertyType.TYPE]
        else:
            # presume paravirt if not specified, probably a host
            virt_type = VirtualizationType.PARA

        row = self.__db_get_system(identity, system_id, uuid)
        if not row:
            self.__db_insert_system(identity, system_id, uuid, virt_type)
        else:
            self.__db_update_system(identity, system_id, uuid, row)

            self.__notify_listeners(ListenerEvent.GUEST_REGISTERED,
                                    row['host_system_id'],
                                    system_id)

    def _handle_domain_exists(self, system_id, timestamp, properties):
        uuid = properties[PropertyType.UUID]

        row = self.__db_get_domain(system_id, uuid)
        if not row:
            self.__db_insert_domain(system_id, uuid, properties)

            # We've noticed a new guest; send a notification down the pipeline.
            self.__notify_listeners(ListenerEvent.GUEST_DISCOVERED,
                                    system_id,
                                    uuid)
        else:
            self.__db_update_domain(system_id, uuid, properties, row)

            # We'll attempt to detect migration by checking if the host system
            # ID has changed.
            if 'host_system_id' in row and \
                    row['host_system_id'] != system_id:

                self.__notify_listeners(ListenerEvent.GUEST_MIGRATED,
                                        row['host_system_id'],
                                        system_id,
                                        row['virtual_system_id'],
                                        uuid)

    def _handle_domain_removed(self, system_id, timestamp, properties):
        """ Handle a domain removal.  Since we are dealing with virtual domains, we
            can't really tell whether physical removal took place, so we'll just mark
            the domain as 'stopped'.
        """
        uuid = properties[PropertyType.UUID]

        row = self.__db_get_domain(system_id, uuid)
        if len(list(row.keys())) == 0:
            log_debug(1, "Guest already deleted in SUSE Manager Server: ", properties)
            return
        new_properties = {PropertyType.STATE: ServerStateType.STOPPED}
        self.__db_update_domain(system_id, uuid, new_properties, row)

    def _handle_system_crawl_began(self, system_id, timestamp, properties):
        self.__unconfirm_domains(system_id)

    def _handle_system_crawl_ended(self, system_id, timestamp, properties):
        self.__remove_unconfirmed_domains(system_id)
        self.__confirm_domains(system_id)

    def _handle_log_msg_exists(self, system_id, timestamp, properties):
        kickstart_session_id = properties[PropertyType.ID]
        log_message = properties[PropertyType.MESSAGE]

        self.__db_insert_log_message(kickstart_session_id, log_message)

    ###########################################################################
    # Helper Methods
    ###########################################################################

    def __db_get_system(self, identity, system_id, uuid):
        """ This returns a row from the database that represents a virtual system.
            If no system could be found, None is returned.
        """

        condition = None

        # The SELECT condition is different, depending on whether this system
        # is a host or a guest.  A guest will always have a UUID, while a host
        # will never have one.  Instead, a host should be identified by its
        # sysid only.
        #
        # When IdentityType.GUEST, need to worry about cross-org issues...
        # 2 states to worry about:
        # - no prior entry in the VI table; we return nothing, insert happens
        # - prior entry, we return that one, update happens
        if identity == IdentityType.HOST:
            condition = """
                vi.uuid is null
                and vi.host_system_id=:system_id
            """
        elif identity == IdentityType.GUEST:
            condition = """
                (
                  vi.uuid=:uuid
                  AND (vi.virtual_system_id is null or
                       vi.virtual_system_id = :system_id)
                )
                OR
                (
                  vi.uuid is not null and
                  vi.virtual_system_id = :system_id
                )
            """
        else:
            raise VirtualizationEventError(
                "Unknown identity:", identity)

        select_sql = """
            SELECT
                vi.id                as id,
                vi.host_system_id    as host_system_id,
                vi.virtual_system_id as virtual_system_id,
                vi.uuid              as uuid,
                vi.confirmed         as confirmed
            FROM
                rhnVirtualInstance vi
            WHERE
                %s
        """ % (condition)
        query = rhnSQL.prepare(select_sql)
        query.execute(system_id=system_id, uuid=uuid)

        row = query.fetchone_dict() or {}

        return row

    def __db_insert_system(self, identity, system_id, uuid, virt_type):
        """ Inserts a new system into the database. """

        # If this system is a host, it's sysid goes into the host_system_id
        # column.  Otherwise, it's sysid goes into the virtual_system_id
        # column.
        host_id = None
        guest_id = None
        if identity == IdentityType.HOST:
            host_id = system_id
        elif identity == IdentityType.GUEST:
            guest_id = system_id

            # Check to see if this uuid has already been registered to a
            # host and is confirmed.
            check_sql = """
                select
                    vi.id,
                    vi.host_system_id,
                    vi.confirmed
                from
                    rhnVirtualInstance vi
                where
                    vi.uuid = :uuid
                    and confirmed = 1
            """

            query = rhnSQL.prepare(check_sql)
            query.execute(uuid=uuid, system_id=system_id)

            row = query.fetchone_dict()

            if row:
                # We found a host for this guest, we'll save the value
                # to use when we create the row in rhnVirtualInstance.
                host_id = row['host_system_id']
            else:
                # We didn't find a host, this guest will just end up with
                # no host, and consuming physical entitlements.
                pass

        else:
            raise VirtualizationEventError(
                "Unknown identity:", identity)

        get_id_sql = "SELECT sequence_nextval('rhn_vi_id_seq') as id FROM dual"
        query = rhnSQL.prepare(get_id_sql)
        query.execute()
        row = query.fetchone_dict() or {}

        if not row or 'id' not in row:
            raise VirtualizationEventError('unable to get virt instance id')

        insert_sql = """
            INSERT INTO rhnVirtualInstance
                (id, host_system_id, virtual_system_id, uuid, confirmed)
            VALUES
                (:id, :host_id, :guest_id, :uuid, 1)
        """
        query = rhnSQL.prepare(insert_sql)
        query.execute(id=row['id'],
                      host_id=host_id,
                      guest_id=guest_id,
                      uuid=uuid)

        # Initialize a dummy info record for this system.
        insert_sql = """
            INSERT INTO rhnVirtualInstanceInfo
                (instance_id, state, instance_type)
            VALUES
                (:id,
                 (
                     SELECT rvis.id
                     FROM rhnVirtualInstanceState rvis
                     WHERE rvis.label = :state
                 ),
                 (
                     SELECT rvit.id
                     FROM rhnVirtualInstanceType rvit
                     WHERE rvit.label = :virt_type
                 ))
        """
        query = rhnSQL.prepare(insert_sql)
        query.execute(id=row['id'],
                      state=ServerStateType.UNKNOWN,
                      virt_type=virt_type)

    def __db_update_system(self, identity, system_id, uuid, existing_row):
        """ Updates a system in the database. """

        new_values_array = []
        bindings = {}
        if not existing_row.get('confirmed'):
            new_values_array.append("confirmed=1")

        # Some guests may have been unregistered before, and therefore did not
        # have sysid's.  If we got an EXISTS for a guest system, then a guest
        # must have been registered.  Make sure that we update the
        # virtual_system_id column in the DB to reflect that this guest is now
        # registered.
        if identity == IdentityType.GUEST:
            if existing_row['virtual_system_id'] != system_id:
                new_values_array.append("virtual_system_id=:sysid")
                bindings['sysid'] = system_id
                # note, at this point, it's still possible to have
                # an entry in rhnVirtualInstance for this uuid w/out
                # a virtual_system_id; it'd be for a different org
            if existing_row['uuid'] != uuid:
                new_values_array.append("uuid=:uuid")
                bindings['uuid'] = uuid

        # Only touch the database if something changed.
        if new_values_array:
            new_values = ', '.join(new_values_array)

            bindings['row_id'] = existing_row['id']

            update_sql = """
                UPDATE rhnVirtualInstance SET %s WHERE id=:row_id
            """ % (new_values)
            query = rhnSQL.prepare(update_sql)
            query.execute(**bindings)

    def __db_get_domain(self, host_id, uuid):
        select_sql = """
            SELECT
                rvi.id                as rvi_id,
                rvi.host_system_id    as host_system_id,
                rvi.virtual_system_id as virtual_system_id,
                rvi.confirmed         as confirmed,
                rvii.name             as name,
                rvit.label            as instance_type,
                rvii.memory_size_k    as memory_size_k,
                rvii.instance_id      as instance_id,
                rvii.vcpus            as vcpus,
                rvis.label            as state
            FROM
                rhnVirtualInstanceInfo rvii,
                rhnVirtualInstanceType rvit,
                rhnVirtualInstanceState rvis,
                rhnVirtualInstance rvi
            WHERE
                (rvi.uuid = :uuid or
                 (:uuid is null and
                  rvi.uuid is null)) and
                rvi.host_system_id = :host_id and
                rvi.id = rvii.instance_id and
                rvit.id = rvii.instance_type and
                rvis.id = rvii.state
        """
        query = rhnSQL.prepare(select_sql)
        query.execute(host_id=host_id, uuid=uuid)

        row = query.fetchone_dict() or {}

        return row

    def __db_insert_domain(self, host_id, uuid, properties):
        """ To create a new domain, we must modify both the rhnVirtualInstance
            and the rhnVirtualInstanceInfo tables.
        """
        # We'll do rhnVirtualInstance first.
        get_id_sql = "SELECT sequence_nextval('rhn_vi_id_seq') as id FROM dual"
        query = rhnSQL.prepare(get_id_sql)
        query.execute()
        row = query.fetchone_dict() or {}

        if not row or 'id' not in row:
            raise VirtualizationEventError('unable to get virt instance id')
        id = row['id']

        # Do we have a system with a machine id matching the uuid?
        get_system_id_sql = """
            SELECT s.id
            FROM rhnServer s
            LEFT JOIN rhnVirtualInstance vi on vi.virtual_system_id = s.id
            WHERE s.machine_id = ':uuid' and vi.virtual_system_id IS NULL
        """
        query = rhnSQL.prepare(get_system_id_sql)
        query.execute(uuid=uuid)
        row = query.fetchone_dict() or {}

        guest_id = row['id'] if row and 'id' in row else None 

        insert_sql = """
            INSERT INTO rhnVirtualInstance
                (id, host_system_id, virtual_system_id, uuid, confirmed)
            VALUES
                (:id, :host_id, :guest_id, :uuid, 1)
        """
        query = rhnSQL.prepare(insert_sql)
        query.execute(id=id, host_id=host_id, guest_id=guest_id, uuid=uuid)

        # Now we'll insert into the rhnVirtualInstanceInfo table.

        insert_sql = """
            INSERT INTO rhnVirtualInstanceInfo
                (instance_id,
                 name,
                 vcpus,
                 memory_size_k,
                 instance_type,
                 state)
            SELECT
                :id,
                :name,
                :vcpus,
                :memory,
                rvit.id,
                rvis.id
            FROM
                rhnVirtualInstanceType rvit,
                rhnVirtualInstanceState rvis
            WHERE
                rvit.label=:virt_type and
                rvis.label=:state
        """
        name = properties[PropertyType.NAME]
        vcpus = properties[PropertyType.VCPUS]
        memory = properties[PropertyType.MEMORY]
        virt_type = properties[PropertyType.TYPE]
        state = properties[PropertyType.STATE]

        query = rhnSQL.prepare(insert_sql)
        query.execute(id=id,
                      name=name,
                      vcpus=vcpus,
                      memory=memory,
                      virt_type=virt_type,
                      state=state)

    def __db_update_domain(self, host_id, uuid, properties, existing_row):

        # First, update the rhnVirtualInstance table.  If a guest domain was
        # registered but its host was not, it is possible that the
        # rhnVirtualInstance table's host_system_id column is null.  We'll
        # update that now, if need be.

        new_values_array = []
        bindings = {}

        if not existing_row.get('confirmed'):
            new_values_array.append('confirmed=1')

        if existing_row['host_system_id'] != host_id:
            new_values_array.append('host_system_id=:host_id')
            bindings['host_id'] = host_id

        # Only touch the database if something changed.
        if new_values_array:
            new_values = ', '.join(new_values_array)

            bindings['row_id'] = existing_row['rvi_id']

            update_sql = """
                UPDATE rhnVirtualInstance SET %s WHERE id=:row_id
            """ % (new_values)
            query = rhnSQL.prepare(update_sql)

            try:
                query.execute(**bindings)
            except rhnSQL.SQLError:
                e = sys.exc_info()[1]
                log_error(str(e))
                raise_with_tb(VirtualizationEventError(str(e)), sys.exc_info()[2])

        # Now update the rhnVirtualInstanceInfo table.

        new_values_array = []
        bindings = {}

        if PropertyType.NAME in properties and \
           existing_row['name'] != properties[PropertyType.NAME]:
            new_values_array.append('name=:name')
            bindings['name'] = properties[PropertyType.NAME]

        if PropertyType.VCPUS in properties and \
           existing_row['vcpus'] != properties[PropertyType.VCPUS]:
            new_values_array.append('vcpus=:vcpus')
            bindings['vcpus'] = properties[PropertyType.VCPUS]

        if PropertyType.MEMORY in properties and \
           existing_row['memory_size_k'] != properties[PropertyType.MEMORY]:
            new_values_array.append('memory_size_k=:memory')
            bindings['memory'] = properties[PropertyType.MEMORY]

        if PropertyType.TYPE in properties and \
           existing_row['instance_type'] != properties[PropertyType.TYPE]:
            new_values_array.append("""
                instance_type = (
                    select rvit.id
                    from rhnVirtualInstanceType rvit
                    where rvit.label = :virt_type)
            """)
            bindings['virt_type'] = properties[PropertyType.TYPE]

        if PropertyType.STATE in properties and \
           existing_row['state'] != properties[PropertyType.STATE]:
            new_values_array.append("""
                state = (
                    SELECT rvis.id
                    FROM rhnVirtualInstanceState rvis
                    WHERE rvis.label = :state)
            """)
            bindings['state'] = properties[PropertyType.STATE]

        # Only touch the database if something changed.
        if new_values_array:
            new_values = ', '.join(new_values_array)

            bindings['row_id'] = existing_row['instance_id']

            update_sql = """
                UPDATE rhnVirtualInstanceInfo SET %s WHERE instance_id=:row_id
            """ % (new_values)
            query = rhnSQL.prepare(update_sql)
            query.execute(**bindings)

    def __unconfirm_domains(self, system_id):
        update_sql = """
            UPDATE rhnVirtualInstance
            SET confirmed=0
            WHERE host_system_id=:sysid
        """
        query = rhnSQL.prepare(update_sql)
        query.execute(sysid=system_id)

    def __confirm_domains(self, system_id):
        update_sql = """
            UPDATE rhnVirtualInstance
            SET confirmed=1
            WHERE host_system_id=:sysid
        """
        query = rhnSQL.prepare(update_sql)
        query.execute(sysid=system_id)

    def __remove_unconfirmed_domains(self, system_id):
        """ Mark the unconfirmed entries in the RVII table as stopped, since it
            appears they are no longer running.
        """

        update_sql = """
            UPDATE rhnVirtualInstanceInfo rvii
            SET state=(
                SELECT rvis.id
                FROM rhnVirtualInstanceState rvis
                WHERE rvis.label=:state
            )
            WHERE
                rvii.instance_id IN (
                    SELECT rvi.id
                    FROM rhnVirtualInstance rvi
                    WHERE rvi.confirmed=0)
        """
        query = rhnSQL.prepare(update_sql)
        query.execute(state=ServerStateType.STOPPED)

    def __db_insert_log_message(self, kickstart_session_id, log_message):
        """
        Insert a new installation log message into the database.
        """

        # log_message must be 4000 chars or shorter, db constraint
        log_message = log_message[:4000]

        insert_sql = """
            INSERT INTO rhnVirtualInstanceInstallLog
                (id, log_message, ks_session_id)
            VALUES
                (sequence_nextval('rhn_viil_id_seq'), :log_message, :kickstart_session_id)
        """
        query = rhnSQL.prepare(insert_sql)
        query.execute(log_message=log_message,
                      kickstart_session_id=kickstart_session_id)

    def __convert_properties(self, properties):
        """ This function normalizes and converts the values of some properties to
            format consumable by the server.
        """
        # Attempt to normalize the UUID.
        if PropertyType.UUID in properties:
            uuid = properties[PropertyType.UUID]
            if uuid:
                uuid_as_number = int(uuid, 16)

                if uuid_as_number == 0:
                    # If the UUID is a bunch of null bytes, we will convert it
                    # to None.  This will allow us to interact with the
                    # database properly, since the database assumes a null UUID
                    # when the system is a host.
                    properties[PropertyType.UUID] = None
                else:
                    # Normalize the UUID.  We don't know how it will appear
                    # when it comes from the client, so we'll convert it to a
                    # normal form.
                    # if UUID had leading 0, we must pad 0 again #429192
                    properties[PropertyType.UUID] = "%032x" % uuid_as_number
            else:
                properties[PropertyType.UUID] = None

        # The server only cares about certain types of states.
        if PropertyType.STATE in properties:
            state = properties[PropertyType.STATE]
            properties[PropertyType.STATE] = CLIENT_SERVER_STATE_MAP[state]

        # We must send the memory across as a string because XMLRPC can only
        # handle up to 32 bit numbers.  RAM can easily exceed that limit these
        # days.
        if PropertyType.MEMORY in properties:
            memory = properties[PropertyType.MEMORY]
            properties[PropertyType.MEMORY] = LongType(memory)

    def __notify_listeners(self, *args):
        for listener in Listeners.listeners:
            listener._notify(*args)

###############################################################################
# Module level functions
###############################################################################


def _notify_guest(server_id, uuid, virt_type):
    """ Notifies the virtualization backend that there is a guest with a
        specific
        uuid and type, then associates it with the provided system id.

        New for RHEL 5.

        Args are:
         * system_id   - a string representation of the system's system id.
         * uuid        - a string representation of the system's uuid.
         * virt_type   - a string representation of the system's virt type

         No return value.
    """
    identity = IdentityType.GUEST
    event = EventType.EXISTS
    target = TargetType.SYSTEM
    properties = {
        PropertyType.IDENTITY:   identity,
        PropertyType.UUID:   uuid,
        PropertyType.TYPE:   virt_type,
    }

    virt_action = _make_virt_action(event, target, properties)
    _virt_notify(server_id, [virt_action])


def _virt_notify(server_id, actions):
        # Instantiate the event handler.
    handler = VirtualizationEventHandler()

    # Handle each of the actions, in turn.
    for action in actions:
        log_debug(5, "Processing action:", action)

        try:
            handler.handle(server_id, action)
        except VirtualizationEventError:
            vee = sys.exc_info()[1]
            log_error(
                "An error occurred while handling a virtualization event:",
                vee,
                "Ignoring event...")

    # rhnSQL.commit()
    return 0


def _make_virt_action(event, target, properties):
    """
    Construct a tuple representing a virtualization action.

    New for RHEL 5.

    Args are:
    * event       - one of EventType.EXISTS, EventType.REMOVED,
                    EventType.CRAWL_BEGAN, EventType.CRAWL_ENDED
    * target      - one of TargetType.SYSTEM, TargetType.DOMAIN,
                    TargetType.LOG_MSG
    * properties  - a dictionary that associates a PropertyType with
                    a value (typically a string).

    Return a tuple consisting of (timestamp, event, target, properties).
    """

    current_time = int(time.time())
    return (current_time, event, target, properties)


def is_host_uuid(uuid):
    uuid = eval('0x%s' % uuid)
    return LongType(uuid) == 0


###############################################################################
# Testing
###############################################################################

if __name__ == '__main__':

    rhnSQL.initDB()

    host_sysid = 1000010001
    guest_sysid = 1000010010
    handler = VirtualizationEventHandler()

    # Create some fake actions.

    host_exists = (int(time.time()),
                   EventType.EXISTS,
                   TargetType.SYSTEM,
                   {PropertyType.UUID: None,
                    PropertyType.IDENTITY: IdentityType.HOST})

    guest_exists = (int(time.time()),
                    EventType.EXISTS,
                    TargetType.SYSTEM,
                    {PropertyType.UUID: '2e2e2e2e2e2e2e2e',
                     PropertyType.IDENTITY: IdentityType.GUEST})

    crawl_began = (int(time.time()),
                   EventType.CRAWL_BEGAN,
                   TargetType.SYSTEM,
                   {})

    dom0_exists = (int(time.time()),
                   EventType.EXISTS,
                   TargetType.DOMAIN,
                   {PropertyType.UUID: None,
                    PropertyType.NAME: 'DOM0_TEST',
                    PropertyType.TYPE: VirtualizationType.PARA,
                    PropertyType.STATE: ClientStateType.RUNNING,
                    PropertyType.VCPUS: 5,
                    PropertyType.MEMORY: 1111111})

    domU1_exists = (int(time.time()),
                    EventType.EXISTS,
                    TargetType.DOMAIN,
                    {PropertyType.UUID: '1f1f1f1f1f1f1f1f',
                     PropertyType.NAME: 'DOMU1_TEST',
                     PropertyType.TYPE: VirtualizationType.PARA,
                     PropertyType.STATE: ClientStateType.BLOCKED,
                     PropertyType.VCPUS: 1,
                     PropertyType.MEMORY: 22222})

    domU2_exists = (int(time.time()),
                    EventType.EXISTS,
                    TargetType.DOMAIN,
                    {PropertyType.UUID: '2e2e2e2e2e2e2e2e',
                     PropertyType.NAME: 'DOMU2_TEST',
                     PropertyType.TYPE: VirtualizationType.PARA,
                     PropertyType.STATE: ClientStateType.PAUSED,
                     PropertyType.VCPUS: 2,
                     PropertyType.MEMORY: 44444})

    crawl_ended = (int(time.time()),
                   EventType.CRAWL_ENDED,
                   TargetType.SYSTEM,
                   {})

    # Host reg'd, guest reg'd, crawl.

    handler.handle(host_sysid,  host_exists)
    handler.handle(guest_sysid, guest_exists)
    handler.handle(guest_sysid, crawl_began)
    handler.handle(guest_sysid, crawl_ended)
    handler.handle(host_sysid,  crawl_began)
    handler.handle(host_sysid,  dom0_exists)
    handler.handle(host_sysid,  domU1_exists)
    handler.handle(host_sysid,  domU2_exists)
    handler.handle(host_sysid,  crawl_ended)
    # rhnSQL.commit()

    # Clear out the database for this sysid.
    handler.handle(host_sysid,  crawl_began)
    handler.handle(host_sysid,  crawl_ended)
    # rhnSQL.commit()

    # Host reg'd, crawl, guest reg'd.

    handler.handle(host_sysid,  host_exists)
    handler.handle(host_sysid,  crawl_began)
    handler.handle(host_sysid,  dom0_exists)
    handler.handle(host_sysid,  domU1_exists)
    handler.handle(host_sysid,  domU2_exists)
    handler.handle(host_sysid,  crawl_ended)
    handler.handle(guest_sysid, guest_exists)
    handler.handle(guest_sysid, crawl_began)
    handler.handle(guest_sysid, crawl_ended)
    # rhnSQL.commit()

    # Now do some dynamic updates.

    domU2_changed = (int(time.time()),
                     EventType.EXISTS,
                     TargetType.DOMAIN,
                     {PropertyType.UUID: '2e2e2e2e2e2e2e2e',
                      PropertyType.NAME: 'CHANGED_DOMU2_TEST',
                      PropertyType.STATE: ClientStateType.RUNNING})

    handler.handle(host_sysid, domU2_changed)
    # rhnSQL.commit()


# XXX: put this somewhere better
###############################################################################
# VirtualizationListener Class
###############################################################################

class VirtualizationListener:

    def __init__(self):
        pass

    def guest_migrated(self, old_host_sid, new_host_sid, guest_sid, guest_uuid):
        """
        This function is called if we infer that the guest has been migrated
        to a different host system.

            old_host_sid - The server id for the old host.
            new_host_sid - The server id for the new host.
            guest_sid    - The server id for the guest, if it is registered.
            guest_uuid   - The UUID of the guest that has been migrated.
        """
        pass

    def guest_discovered(self, host_sid, guest_uuid, guest_sid=None):
        """
        This function is called if we detect a new guest.
        """
        pass

    def guest_registered(self, host_sid, guest_sid):
        pass

    ###########################################################################
    # Protected Interface
    ###########################################################################

    def _notify(self, event, *args):
        if event == ListenerEvent.GUEST_MIGRATED:
            self.guest_migrated(*args)
        elif event == ListenerEvent.GUEST_DISCOVERED:
            self.guest_discovered(*args)
        elif event == ListenerEvent.GUEST_REGISTERED:
            self.guest_registered(*args)


class EntitlementVirtualizationListener(VirtualizationListener):

    def guest_registered(self, host_sid, guest_sid):
        host_system_slots = server_lib.check_entitlement(host_sid, True)
        #host_system_slots = list(host_system_slots.keys())

        if "virtualization_host" in host_system_slots:
            host_system_slots.remove("virtualization_host")
        if "foreign_entitled" in host_system_slots:
            host_system_slots.remove("foreign_entitled")

        guest_system_slots = server_lib.check_entitlement(guest_sid)
        guest_system_slots = list(guest_system_slots.keys())

        for entitlement in host_system_slots:
            if entitlement not in guest_system_slots:
                try:
                    rhnSQL.transaction(entitlement)
                    procedure.rhn_entitlements.entitle_server(guest_sid,
                                                              entitlement)
                except rhnSQL.SQLError:
                    e = sys.exc_info()[1]
                    rhnSQL.rollback(entitlement)
                    log_error("Error adding entitlement %s to host ID-%s: %s"
                              % (entitlement, guest_sid, str(e)))
                    # rhnSQL.rollback()
                    return

        # rhnSQL.commit()


# This file provides an interface that allows components of the RHN server to
# listen for virtualization events.

###############################################################################
# Constants
###############################################################################


add_listener(EntitlementVirtualizationListener())
070701000001CE000081B40000000000000000000000015FBBE8EE0000098F000000000000000000000000000000000000002500000000spacewalk-backend/server/suseEula.py  # -*- coding: utf-8 -*-
#
# Copyright (c) 2014 SUSE LLC
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#

import hashlib
from spacewalk.common.rhnException import rhnFault
from uyuni.common.stringutils import to_string
from spacewalk.server import rhnSQL

def find_or_create_eula(eula):
    """Return the id of the eula inside of the suseEula table.

       A new entry inside of the suseEula table is added only when needed.
    """
    _query_find = """
        SELECT id
          FROM suseEula
         WHERE checksum = :checksum
    """
    checksum = hashlib.new("sha256", eula.encode('utf-8', 'ignore')).hexdigest()

    h = rhnSQL.prepare(_query_find)
    h.execute(checksum=checksum)
    ret = h.fetchone_dict()

    if ret:
        return ret['id']
    else:
        _query_create_eula_id = """
            SELECT sequence_nextval('suse_eula_id_seq') AS id
            FROM dual
        """
        h = rhnSQL.prepare(_query_create_eula_id)
        h.execute(checksum=checksum)
        ret = h.fetchone_dict()
        id = None
        if ret:
            id = ret['id']
        else:
            raise rhnFault(50, "Unable to add new EULA to the database", explain=0)

        blob_map = { 'text': 'text' }
        h = rhnSQL.prepare("""
                INSERT INTO suseEula (id, text, checksum)
                VALUES (:id, :text, :checksum)
            """,
            blob_map=blob_map)
        h.execute(id=id, text=to_string(eula), checksum=checksum)

        return id

def get_eula_by_id(id):
    """ Return the text of the EULA, None if the EULA is not found """
    h = rhnSQL.prepare("SELECT text from suseEula WHERE id = :id")
    h.execute(id=id)
    match = h.fetchone_dict()
    if match:
        return str(match['text'])
    else:
        return None

def get_eula_by_checksum(checksum):
    """ Return the text of the EULA, None if the EULA is not found """
    h = rhnSQL.prepare("SELECT text from suseEula WHERE checksum = :checksum")
    h.execute(checksum=checksum)
    match = h.fetchone_dict()
    if match:
        return str(match['text'])
    else:
        return None

 070701000001CF000081B40000000000000000000000015FBBE8EE00000AC3000000000000000000000000000000000000002700000000spacewalk-backend/server/taskomatic.py    
"""
Module for taskomatic related functions (inserting into queues, etc)
"""

try:
    import xmlrpc.client as xmlrpclib
except ImportError:
    import xmlrpclib
from spacewalk.server import rhnSQL

# see TaskoXmlRpcHandler.java for available methods
TASKOMATIC_XMLRPC_URL = 'http://localhost:2829/RPC2'

class RepodataQueueEntry(object):

    def __init__(self, channel, client, reason, force=False,
                 bypass_filters=False):
        self.channel = channel
        self.client = client
        self.reason = reason
        self.force = force
        self.bypass_filters = bypass_filters


class RepodataQueue(object):

    def _boolean_as_char(boolean):
        if boolean:
            return 'Y'
        else:
            return 'N'

    _boolean_as_char = staticmethod(_boolean_as_char)

    def add(self, entry):
        h = rhnSQL.prepare("""
            insert into rhnRepoRegenQueue
                (id, channel_label, client, reason, force, bypass_filters,
                 next_action, created, modified)
            values (
                sequence_nextval('rhn_repo_regen_queue_id_seq'),
                :channel, :client, :reason, :force, :bypass_filters,
                current_timestamp, current_timestamp, current_timestamp
            )
        """)

        h.execute(channel=entry.channel, client=entry.client,
                  reason=entry.reason, force=self._boolean_as_char(entry.force),
                  bypass_filters=self._boolean_as_char(entry.bypass_filters))


def add_to_repodata_queue(channel, client, reason, force=False,
                          bypass_filters=False):
    if reason == '':
        reason = None
    entry = RepodataQueueEntry(channel, client, reason, force, bypass_filters)
    queue = RepodataQueue()
    queue.add(entry)

# XXX not the best place for this...


def add_to_repodata_queue_for_channel_package_subscription(affected_channels,
                                                           batch, caller):

    tmpreason = []
    for package in batch:
        tmpreason.append(package.short_str())

    reason = " ".join(tmpreason)

    for channel in affected_channels:
        # don't want to cause an error for the db
        add_to_repodata_queue(channel, caller, reason[:128])

def add_to_erratacache_queue(channel, priority=0):
    h = rhnSQL.prepare("""
    insert into rhnTaskQueue
           (org_id, task_name, task_data, priority, earliest)
           select coalesce(c.org_id, 1),
                  'update_errata_cache_by_channel',
                  c.id,
                  :priority,
                  current_timestamp
             from rhnChannel c
            where c.label = :label
    """)
    h.execute(label=channel, priority=priority)
    rhnSQL.commit()
 070701000001D0000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000001E00000000spacewalk-backend/server/test 070701000001D1000081B40000000000000000000000015FBBE8EE00000442000000000000000000000000000000000000002B00000000spacewalk-backend/server/test/TestProxy.py    #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
import TestServer
import server.redhat_xmlrpc.downloads


class TestProxy(TestServer.TestServer):

    def __init__(self):
        TestServer.TestServer.__init__(self)
        self._init_redhat_xmlrpc_downloads()

    def _init_redhat_xmlrpc_downloads(self):
        self.downloads = server.redhat_xmlrpc.downloads.Downloads()

    def getDownloads(self):
        return self.downloads

if __name__ == "__main__":
    server = TestProxy()
    downloads = server.getDownloads()
  070701000001D2000081B40000000000000000000000015FBBE8EE00000DB2000000000000000000000000000000000000002C00000000spacewalk-backend/server/test/TestRedhat.py   #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# A class that makes testing stuff in backend/server/redhat_xmlrpc a little easier.
# It requires the rhn_server_redhat-xmlrpc.conf file in /etc/rhn/default.

# By default it uses the test-file-upload account in webdev.

# Change the value of the download_files_prefix option in rhn_server_redhat-xmlrpc.conf
# to some directory on your local machine.
#   Mine is set to wregglej, for instance.

# Change the value of the mount_point (or add the mount_point option) in /etc/rhn/rhn_server.conf on you local machine.
#   Mine is set to /home/devel, for instance.

# Place some tarballs in a directory on you machine that is under the path formed by joining the mount_point value
# with the download_files_prefix value.
#   I put them in /home/devel/wregglej/testing/tarballs/t1.

# Modify the values in data to reflect your set up.
import TestServer
import server.redhat_xmlrpc
try:
    #  python 2
    import SimpleXMLRPCServer
except ImportError:
    #  python3
    import xmlrpc.server as SimpleXMLRPCServer
from spacewalk.common import rhnConfig


class TestRedhat(TestServer.TestServer):

    def __init__(self):
        TestServer.TestServer.__init__(self)
        rhnConfig.initCFG("server.redhat-xmlrpc")
        self._init_xmlrpc()

    def _init_xmlrpc(self):
        self.rpc = server.redhat_xmlrpc

    def getXmlRpc(self):
        return self.rpc

    def getUsername(self):
        return "test-file-upload"

    def getPassword(self):
        return "password"

if __name__ == "__main__":
    server = TestRedhat()
    rpc = server.getXmlRpc()
    rpc_downloads = rpc.downloads.Downloads()

    category = "RHN Test Download"
    channel = 'rhn-test-download'
    data = [
        {
            'path': "testing/tarballs/t1/examplesT1.tar.gz",
            'name': "examples1",
            'channel': channel,
            'file_size': '162671',
            'md5sum': 'a39e4a3e8a5615b01b40598fd23d2abf',
            'category': category,
            'ordering': '1',
        },
        {
            'path': "testing/tarballs/t1/examplesT2.tar.gz",
            'name': "examples2",
            'channel': channel,
            'file_size': '162671',
            'md5sum': 'a39e4a3e8a5615b01b40598fd23d2abf',
            'category': category,
            'ordering': '2',
        },
    ]
    info = {
        'entries': data,
        'username': 'test-file-upload',
        'password': 'password',
        'channel': channel,
        'commit': 1,
        'force': 1
    }

    # DELETE THE DOWNLOADS
    # print rpc_downloads.delete_category_files(info)

    # ADD THE DOWNLOADS
#    print rpc_downloads.add_downloadable_files(info)
    server = SimpleXMLRPCServer.SimpleXMLRPCServer(addr=('', 8000))
    for func in rpc_downloads.functions:
        print(func)
        server.register_function(getattr(rpc_downloads, func), name="downloads.%s" % (func))
    server.serve_forever()
  070701000001D3000081B40000000000000000000000015FBBE8EE0000062C000000000000000000000000000000000000002D00000000spacewalk-backend/server/test/TestRhnpush.py  #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
import TestServer
import server.app.packages
try:
    #  python 2
    import SimpleXMLRPCServer
except ImportError:
    #  python3
    import xmlrpc.server as SimpleXMLRPCServer


class TestRhnpush(TestServer.TestServer):

    def __init__(self):
        TestServer.TestServer.__init__(self)
        self._init_app()

    def _init_app(self):
        self.app = server.app.packages.Packages()

    def getApp(self):
        return self.app

if __name__ == "__main__":
    server = TestRhnpush()
    app = server.getApp()
    print((app.test_login(server.getUsername(), server.getPassword())))
    print((app.listChannel(['wregglej-test'], "wregglej", "bm8gv5z2")))
    print((app.listChannelSource(['wregglej-test'], "wregglej", "bm8gv5z2")))
    server = SimpleXMLRPCServer.SimpleXMLRPCServer(addr=('', 16000))
    for func in app.functions:
        print(func)
        server.register_function(getattr(app, func), name="app.%s" % (func))
    server.serve_forever()
070701000001D4000081B40000000000000000000000015FBBE8EE00002066000000000000000000000000000000000000002C00000000spacewalk-backend/server/test/TestServer.py   #!/usr/bin/python
#
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import time
from rhn.UserDictCase import UserDictCase
from spacewalk.server import rhnSQL, rhnServer, rhnAction
from spacewalk.common import rhnConfig, rhnFlags
import server.xmlrpc.up2date
from misc_functions import create_activation_key
import misc_functions

# The Test Server class is a singleton. This allows us to avoid the long setup times between each test.


class TestServer:

    # The actual implementation
    class TestServerImplementation:

        def __init__(self):
            #start_init = time.time()

            self.filesuploaded = False

            self.options = rhnConfig.initCFG('server')
            print((self.options))

            mytime = time.time()
            self.test_username = username or ("test_username_%.3f" % mytime)
            self.test_password = password or ("test_password_%.3f" % mytime)
            self.test_email = email or ("%s@test_domain.com" % self.test_username)
            self.channel_arch = 'unittestarch'

            self.roles = ['org_admin']
            rhnFlags.set('outputTransportOptions', UserDictCase())

            self._init_db()
            self._init_org()
            self._init_user(self.roles)
            self._init_server()
            self._init_channels()
            self._init_up2date()

        # Sets up database connection
        def _init_db(self):
            rhnSQL.initDB()

        # creates an org
        def _init_org(self):
            self.org_id, self.org_name, self.org_password = misc_functions.create_new_org()

        # create a user. Must have called _init_client first.
        def _init_user(self, roles):
            self.testuser = misc_functions.create_new_user(username=self.test_username,
                                                           password=self.test_password,
                                                           #email = self.test_email,
                                                           org_id=self.org_id,
                                                           #org_password = self.org_password,
                                                           roles=roles)

        # create a server. Must have called _init_client and _init_user.
        def _init_server(self):
            self.testserver = misc_functions.new_server(self.testuser, self.org_id)

        # createa a new channel family and a channel associated with the channel
        # family, and add it to the server's channels.
        def _init_channels(self):
            # create a channel family.
            self.cf = misc_functions.create_channel_family()
            self.label = self.cf.get_label()

            # Create a new channel using the channel family info
            self.channel = misc_functions.create_channel(self.label, self.label, org_id=self.org_id)

            # Associate the channel family with the organization
            _insert_channel_family = """
            INSERT INTO rhnPrivateChannelFamily( channel_family_id, org_id )
            VALUES ( :channel_family_id, :org_id )"""
            insert_channel_family = rhnSQL.prepare(_insert_channel_family)
            insert_channel_family.execute(channel_family_id=self.cf.get_id(), org_id=self.org_id)
            rhnSQL.commit()

            # Associate the channel with the server
            _insert_channel = "INSERT INTO rhnServerChannel( server_id, channel_id ) VALUES ( :server_id, :channel_id )"
            insert = rhnSQL.prepare(_insert_channel)
            insert.execute(server_id=self.testserver.getid(), channel_id=self.channel.get_id())
            rhnSQL.commit()

        # instantiate an up2date object and make sure that entitlements aren't checked, which avoids some nastiness
        # that isn't needed for testing purposes...yet. Also, make sure the the server_id of the Up2date object is set
        # correctly. Violates encapsulation horribly.
        def _init_up2date(self):
            self.up2date = server.xmlrpc.up2date.Up2date()
            self.up2date.check_entitlement = 0
            self.up2date.server_id = self.testserver.getid()

        def getUp2date(self):
            return self.up2date

        # Uploads packages from directory.
        def upload_packages(self,
                            directory,
                            channel_label=None,
                            username=None,
                            password=None,
                            org_id=None,
                            force=False,
                            source=0):

            upload_label = channel_label or self.label
            upload_username = username or self.test_username
            upload_password = password or self.test_password
            upload_org_id = org_id or self.org_id

            #start_upload = time.time()
            if not self.filesuploaded or force:
                misc_functions.upload_packages(upload_label,
                                               directory,
                                               org_id=upload_org_id,
                                               username=upload_username,
                                               password=upload_password,
                                               source=source)
                self.filesuploaded = True
            #fin_upload = time.time()
            # print "Upload time: %s" % ( str( fin_upload - start_upload )

        def getServerId(self):
            return self.testserver.getid()

        def getUsername(self):
            return self.test_username

        def getPassword(self):
            return self.test_password

        def getChannel(self):
            return self.channel

        def getChannelFamily(self):
            return self.cf

        def getSystemId(self):
            return self.testserver.system_id()

    # Will contain the reference to a TestServerImplementation object
    __instance = None

    def __init__(self):
        if TestServer.__instance is None:
            TestServer.__instance = TestServer.TestServerImplementation()

        self.__dict__['_TestServer__instance'] = TestServer.__instance

    def __getattr__(self, attr):
        return getattr(TestServer.__instance, attr)

    def __setattr__(self, attr, value):
        return setattr(TestServer.__instance, attr, value)


_query_action_lookup = rhnSQL.Statement("""
    select *
      from rhnServerAction
     where server_id = :server_id
""")


def look_at_actions(server_id):
    h = rhnSQL.prepare(_query_action_lookup)
    h.execute(server_id=server_id)
    return h.fetchall_dict()


if __name__ == "__main__":
    myserver = TestServer()
    # myserver.upload_packages('/home/devel/wregglej/rpmtest')
    #handler = rhnHandler()
    # print handler.auth_system( myserver.getSystemId() )
    #up2date = myserver.getUp2date()
    #id = myserver.getSystemId()
    # print up2date.solvedep( id, ['libcaps.so'] )
    # print "Done!"
    #rhnserver = rhnServer.Server(myserver.testuser, org_id=myserver.org_id)

    fake_key = create_activation_key(
        org_id=myserver.org_id, user_id=myserver.testuser.getid(), channels=[myserver.label], server_id=myserver.getServerId())
    fake_action = rhnAction.schedule_server_action(
        myserver.getServerId(), "packages.update", action_name="Testing", delta_time=9999, org_id=myserver.org_id)
    fake_token = rhnServer.search_token(fake_key._token)

    print((look_at_actions(myserver.getServerId())))

    rhnFlags.set("registration_token", fake_token)
    myserver.testserver.use_token()

    print((look_at_actions(myserver.getServerId())))

    rhnAction.invalidate_action(myserver.getServerId(), fake_action)
    rhnSQL.rollback()
  070701000001D5000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002400000000spacewalk-backend/server/test/attic   070701000001D6000081B40000000000000000000000015FBBE8EE000028CB000000000000000000000000000000000000003800000000spacewalk-backend/server/test/attic/rhnActivationKey.py   #!/usr/bin/python
#
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

import os
import hashlib
import time
from uyuni.common import usix

from spacewalk.server import rhnSQL
from rhn.i18n import bstr


class InvalidTokenError(Exception):
    pass


class InvalidChannelError(Exception):
    pass


class InvalidEntitlementError(Exception):
    pass


class ActivationKey:

    def __init__(self):
        self._row_reg_token = None
        self._row_activ_key = None

        self._server_groups = {}
        self._channels = {}
        self._token = None

    def load(self, token):
        t = rhnSQL.Table('rhnActivationKey', 'token')
        row = t[token]
        if not row:
            raise InvalidTokenError(token)
        self._row_activ_key = row
        reg_token_id = row['reg_token_id']
        t = rhnSQL.Table('rhnRegToken', 'id')
        row = t[reg_token_id]
        if not row:
            raise Exception("Invalid data in DB: missing foreign key")
        self._row_reg_token = row
        self._server_groups = self._load_server_groups()
        self._channels = self._load_channels()

    _query_fetch_server_groups = rhnSQL.Statement("""
        select rtsg.server_group_id
          from rhnRegTokenGroups rtsg
         where rtsg.token_id = :token_id
    """)

    def _load_server_groups(self):
        # Get groups
        h = rhnSQL.prepare(self._query_fetch_server_groups)
        reg_token_id = self._row_reg_token['id']
        h.execute(token_id=reg_token_id)
        ret = {}
        while 1:
            row = h.fetchone_dict()
            if not row:
                break
            server_group_id = row['server_group_id']
            ret[server_group_id] = None
        return ret

    _query_fetch_channels = rhnSQL.Statement("""
        select rtc.channel_id, c.label
          from rhnRegTokenChannels rtc, rhnChannel c
         where rtc.token_id = :token_id
           and rtc.channel_id = c.id
    """)

    def _load_channels(self):
        # Get groups
        h = rhnSQL.prepare(self._query_fetch_channels)
        reg_token_id = self._row_reg_token['id']
        h.execute(token_id=reg_token_id)
        ret = {}
        while 1:
            row = h.fetchone_dict()
            if not row:
                break
            channel_id = row['channel_id']
            ret[channel_id] = row['label']
        return ret

    # Setters

    def set_entitlement_level(self, val):
        entitlements = {}
        for k, v in list(val.items()):
            entitlement_level_id = self._lookup_entitlement_level(k)
            entitlements[entitlement_level_id] = k

        self._set('entitlement_level', entitlements)

    def set_server_groups(self, groups):
        assert(isinstance(groups, usix.ListType))

        ret = {}
        for g in groups:
            ret[g] = None

        self._server_groups.clear()
        self._server_groups.update(ret)

    def set_channels(self, channels):
        assert(isinstance(channels, usix.ListType))

        t = rhnSQL.Table('rhnChannel', 'label')

        ret = {}
        for ch in channels:
            row = t[ch]
            if not row:
                raise InvalidChannelError(ch)
            ret[row['id']] = None

        self._channels.clear()
        self._channels.update(ret)

    def _set(self, name, val):
        if self._row_reg_token is None:
            self._row_reg_token = rhnSQL.Row('rhnRegToken', 'id')
            token_id = rhnSQL.Sequence('rhn_reg_token_seq').next()
            self._row_reg_token.create(token_id)
            self._row_reg_token['usage_limit'] = None

        self._row_reg_token[name] = val

    # Getters

    _query_get_reg_token_entitlements = rhnSQL.Statement("""
        select sgt.label
          from rhnServerGroupType sgt,
               rhnRegTokenEntitlement rte
         where rte.reg_token_id = :reg_token_id
           and rte.server_group_type_id = sgt.id
    """)

    def get_entitlement_level(self):
        reg_token_id = self._row_reg_token['id']
        h = rhnSQL.prepare(self._query_get_reg_token_entitlements)
        h.execute(reg_token_id=reg_token_id)

        ret = {}
        while 1:
            row = h.fetchone_dict()
            if not row:
                break
            ret[row['label']] = None
        return ret

    def get_server_groups(self):
        return list(self._server_groups.keys())

    def get_channels(self):
        return list(self._channels.values())

    def get_token(self):
        return self._token

    def _get(self, name):
        return self._row_reg_token[name]

    # Fix various things

    def _lookup_entitlement_level(self, entitlement_level):
        t = rhnSQL.Table('rhnServerGroupType', 'label')
        row = t[entitlement_level]
        if not row:
            raise InvalidEntitlementError(entitlement_level)
        return row['id']

    def generate_token(self):
        s = hashlib.new('sha1')
        s.update(bstr(str(os.getpid())))
        for field in ['org_id', 'user_id', 'server_id']:
            if self._row_reg_token.has_key(field):
                val = self._row_reg_token[field]
            s.update(bstr(str(val)))
        s.update(bstr("%.8f" % time.time()))
        self._token = s.hexdigest()
        return self._token

    def save(self):
        if self._token is None:
            self.generate_token()

        try:
            return self._save()
        except:
            rhnSQL.rollback()
            raise

    def _save(self):
        h = self._row_reg_token
        k = 'entitlement_level'
        if h.has_key(k):
            entitlements = h[k]
            del h.data[k]
        else:
            entitlements = {}

        self._row_reg_token.save()

        if not self._row_activ_key:
            self._row_activ_key = rhnSQL.Row('rhnActivationKey', 'token')
            self._row_activ_key.create(self._token)
            self._row_activ_key['reg_token_id'] = self._row_reg_token['id']
            self._row_activ_key.save()

        self._store_server_groups()
        self._store_channels()

        self._store_entitlements(entitlements)

    _query_delete_reg_token_entitlements = rhnSQL.Statement("""
        delete from rhnRegTokenEntitlement
         where reg_token_id = :reg_token_id
    """)
    _query_insert_reg_token_entitlements = rhnSQL.Statement("""
        insert into rhnRegTokenEntitlement
               (reg_token_id, server_group_type_id)
        values (:reg_token_id, :server_group_type_id)
    """)

    def _store_entitlements(self, entitlements):
        # entitlements: hash keyed on the entitlement id
        if not entitlements:
            return
        entitlements = list(entitlements.keys())

        reg_token_id = self._row_reg_token['id']
        reg_token_ids = [reg_token_id] * len(entitlements)

        h = rhnSQL.prepare(self._query_delete_reg_token_entitlements)
        h.execute(reg_token_id=reg_token_id)

        h = rhnSQL.prepare(self._query_insert_reg_token_entitlements)
        h.executemany(reg_token_id=reg_token_ids,
                      server_group_type_id=entitlements)

    _query_delete_groups = rhnSQL.Statement("""
        delete from rhnRegTokenGroups
         where token_id = :token_id
           and server_group_id = :server_group_id
    """)
    _query_insert_groups = rhnSQL.Statement("""
        insert into rhnRegTokenGroups (token_id, server_group_id)
        values (:token_id, :server_group_id)
    """)

    def _store_server_groups(self):
        db_server_groups = self._load_server_groups()
        token_id = self._row_reg_token['id']

        inserts, deletes = self._diff_hashes(db_server_groups,
                                             self._server_groups)

        if deletes:
            token_ids = [token_id] * len(deletes)
            h = rhnSQL.prepare(self._query_delete_groups)
            h.executemany(token_id=token_ids, server_group_id=deletes)
        if inserts:
            token_ids = [token_id] * len(inserts)
            h = rhnSQL.prepare(self._query_insert_groups)
            h.executemany(token_id=token_ids, server_group_id=inserts)

    _query_delete_channels = rhnSQL.Statement("""
        delete from rhnRegTokenChannels
         where token_id = :token_id
           and channel_id = :channel_id
    """)
    _query_insert_channels = rhnSQL.Statement("""
        insert into rhnRegTokenChannels(token_id, channel_id)
        values (:token_id, :channel_id)
    """)

    def _store_channels(self):
        db_channels = self._load_channels()
        token_id = self._row_reg_token['id']

        inserts, deletes = self._diff_hashes(db_channels,
                                             self._channels)

        if deletes:
            token_ids = [token_id] * len(deletes)
            h = rhnSQL.prepare(self._query_delete_channels)
            h.executemany(token_id=token_ids, channel_id=deletes)
        if inserts:
            token_ids = [token_id] * len(inserts)
            h = rhnSQL.prepare(self._query_insert_channels)
            h.executemany(token_id=token_ids, channel_id=inserts)

    def _diff_hashes(self, h1, h2):
        "diffs src and dst; returns a list of (inserts, deletes)"
        inserts = []
        h1 = h1.copy()
        for k in list(h2.keys()):
            if k not in h1:
                inserts.append(k)
                continue
            del h1[k]
        deletes = list(h1.keys())
        return inserts, deletes

    def __getattr__(self, name):
        if name.startswith('get_'):
            return CallableObj(name[4:], self._get)
        if name.startswith('set_'):
            return CallableObj(name[4:], self._set)
        raise AttributeError(name)


class CallableObj:

    def __init__(self, name, func):
        self.func = func
        self.name = name

    def __call__(self, *args, **kwargs):
        return self.func(self.name, *args, **kwargs)
 070701000001D7000081B40000000000000000000000015FBBE8EE00000CF0000000000000000000000000000000000000003600000000spacewalk-backend/server/test/attic/rhnServerGroup.py #!/usr/bin/python
#
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#


from uyuni.common import usix

from spacewalk.server import rhnSQL, rhnUser


class InvalidUserError(Exception):
    pass


class InvalidOrgError(Exception):
    pass


class InvalidServerGroupError(Exception):
    pass


class ServerGroup:

    def __init__(self):
        self._row_server_group = None

    _query_lookup = rhnSQL.Statement("""
        select id
          from rhnServerGroup
         where org_id = :org_id
           and name = :name
    """)

    def load(self, org_id, name):
        org_id = self._lookup_org_id(org_id)
        h = rhnSQL.prepare(self._query_lookup)
        h.execute(org_id=org_id, name=name)
        row = h.fetchone_dict()
        if not row:
            raise InvalidServerGroupError(org_id, name)
        server_group_id = row['id']
        self._row_server_group = rhnSQL.Row("rhnServerGroup", 'id')
        self._row_server_group.load(server_group_id)

    # Setters

    def set_org_id(self, org_id):
        self._set('org_id', self._lookup_org_id(org_id))

    def _set(self, name, val):
        if self._row_server_group is None:
            self._row_server_group = rhnSQL.Row('rhnServerGroup', 'id')
            server_group_id = rhnSQL.Sequence('rhn_server_group_id_seq').next()
            self._row_server_group.create(server_group_id)

        self._row_server_group[name] = val

    # Getters

    def _get(self, name):
        return self._row_server_group[name]

    def _lookup_org_id(self, org_id):
        if isinstance(org_id, usix.StringType):
            # Is it a user?
            u = rhnUser.search(org_id)

            if not u:
                raise InvalidUserError(org_id)

            return u.contact['org_id']

        t = rhnSQL.Table('web_customer', 'id')
        row = t[org_id]
        if not row:
            raise InvalidOrgError(org_id)
        return row['id']

    def save(self):
        if not self._row_server_group:
            return
        self._row_server_group.save()

    def __getattr__(self, name):
        if name.startswith('get_'):
            return CallableObj(name[4:], self._get)
        if name.startswith('set_'):
            return CallableObj(name[4:], self._set)
        raise AttributeError(name)


class CallableObj:

    def __init__(self, name, func):
        self.func = func
        self.name = name

    def __call__(self, *args, **kwargs):
        return self.func(self.name, *args, **kwargs)


def create_new_org(username, password):
    f = rhnSQL.Procedure('create_new_org')

    username = rhnSQL.types.STRING(username)
    password = rhnSQL.types.STRING(password)
    ncl = rhnSQL.types.NUMBER

    ret = f(username, password, ncl())
    return int(ret[2])
070701000001D8000081B40000000000000000000000015FBBE8EE000003DD000000000000000000000000000000000000003400000000spacewalk-backend/server/test/attic/rhn_memusage.py   #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import string


def mem_usage():
    f = open("/proc/self/status")
    dict = {}
    while 1:
        line = f.readline()
        if not line:
            break
        arr = list(map(string.strip, string.split(line, ':', 1)))
        if len(arr) == 1:
            continue
        dict[arr[0]] = arr[1]
    return dict['Name'], dict['VmSize'], dict['VmRSS'], dict['VmData']
   070701000001D9000081B40000000000000000000000015FBBE8EE00000E90000000000000000000000000000000000000003000000000spacewalk-backend/server/test/byterangetests.py   #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
import unittest


class ByteRangeTests(unittest.TestCase):

    def testEmptyRange(self):
        try:
            server.byterange.parse_byteranges("")
            self.fail()
        except server.byterange.InvalidByteRangeException:
            # Expected result
            pass

    def testNoRangeGroups(self):
        try:
            server.byterange.parse_byteranges("bytes=")
            self.fail()
        except server.byterange.InvalidByteRangeException:
            # Expected result
            pass

    def testNegativeStart(self):
        try:
            server.byterange.parse_byteranges("bytes=-1-30")
            self.fail()
        except server.byterange.InvalidByteRangeException:
            pass

    def testStartAfterEnd(self):
        try:
            server.byterange.parse_byteranges("bytes=12-3")
            self.fail()
        except server.byterange.InvalidByteRangeException:
            pass

    def testNoStartOrEnd(self):
        try:
            server.byterange.parse_byteranges("bytes=-")
            self.fail()
        except server.byterange.InvalidByteRangeException:
            pass

    def testNoStartInvalidEnd(self):
        try:
            server.byterange.parse_byteranges("bytes=-0")
            self.fail()
        except server.byterange.InvalidByteRangeException:
            pass

    def testBadCharactersInRange(self):
        try:
            server.byterange.parse_byteranges("bytes=2-CB")
            self.fail()
        except server.byterange.InvalidByteRangeException:
            pass

    def testGoodRange(self):
        start, end = server.byterange.parse_byteranges("bytes=0-4")
        self.assertEqual(0, start)
        self.assertEqual(5, end)

    def testStartByteToEnd(self):
        start, end = server.byterange.parse_byteranges("bytes=12-")
        self.assertEqual(12, start)
        self.assertEqual(None, end)

    def testSuffixRange(self):
        start, end = server.byterange.parse_byteranges("bytes=-30")
        self.assertEqual(-30, start)
        self.assertEqual(None, end)

    def testMultipleRanges(self):
        try:
            server.byterange.parse_byteranges("bytes=1-3,9-12")
            self.fail()
        except server.byterange.UnsatisfyableByteRangeException:
            pass

    def testStartWithFileSize(self):
        start, end = server.byterange.parse_byteranges("bytes=23-", 50)
        self.assertEqual(23, start)
        self.assertEqual(50, end)

    def testSuffixWithFileSize(self):
        start, end = server.byterange.parse_byteranges("bytes=-40", 50)
        self.assertEqual(10, start)
        self.assertEqual(50, end)

    def testStartPastFileSize(self):
        try:
            server.byterange.parse_byteranges("bytes=50-60", 50)
            self.fail()
        except server.byterange.UnsatisfyableByteRangeException:
            pass

    def testSuffixLargerThanFileSize(self):
        try:
            server.byterange.parse_byteranges("bytes=-80", 79)
            self.fail()
        except server.byterange.UnsatisfyableByteRangeException:
            pass
unittest.main()
070701000001DA000081B40000000000000000000000015FBBE8EE00000868000000000000000000000000000000000000003100000000spacewalk-backend/server/test/cx_create_table.py  #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
import os
import sys
import cx_Oracle


def main():
    if len(sys.argv) != 2:
        sys.stdout.write("Usage: %s <connectstring>\n" % sys.argv[0])
        return 1
    dbh = cx_Oracle.connect(sys.argv[1])

    table_name = "test_%d" % os.getpid()
    if 1:
        test2(dbh, table_name)
    else:
        test1(dbh, table_name)
        test1(dbh, table_name)


def test1(dbh, table_name):
    tn = table_name.upper()
    create_table(dbh, table_name)
    assert tn in list_tables(dbh), "Table %s not created" % table_name
    drop_table(dbh, table_name)
    assert tn not in list_tables(dbh), "Table %s not dropped" % table_name


def test2(dbh, table_name):
    tn = table_name.upper()
    h1 = create_table(dbh, table_name)
    assert tn in list_tables(dbh), "Table %s not created" % table_name
    h2 = drop_table(dbh, table_name)
    assert tn not in list_tables(dbh), "Table %s not dropped" % table_name

    h1.execute(None)
    assert tn in list_tables(dbh), "Table %s not created" % table_name
    h2.execute(None)
    assert tn not in list_tables(dbh), "Table %s not dropped" % table_name


def create_table(dbh, table_name):
    h = dbh.cursor()
    h.execute("create table %s (id int)" % table_name)
    return h


def drop_table(dbh, table_name):
    h = dbh.cursor()
    h.execute("drop table %s" % table_name)
    return h


def list_tables(dbh):
    h = dbh.cursor()
    h.execute("select table_name from user_tables")
    return [x[0].upper() for x in h.fetchall()]

if __name__ == '__main__':
    sys.exit(main() or 0)
070701000001DB000081B40000000000000000000000015FBBE8EE00002453000000000000000000000000000000000000003000000000spacewalk-backend/server/test/misc_functions.py   #!/usr/bin/python
#
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
#
#
import os
import sys
import time
from uyuni.common import usix
import server.importlib.headerSource
import server.importlib.packageImport
import server.importlib.backendOracle
import server.xmlrpc.up2date
from spacewalk.server import rhnSQL, rhnChannel, rhnServer, rhnUser, rhnServerGroup, rhnActivationKey
from spacewalk.server.xmlrpc import registration


def create_channel_family():
    cf = rhnChannel.ChannelFamily()
    cf.load_from_dict(new_channel_family_dict())
    cf.save()
    return cf


def create_channel(label, channel_family, org_id=None, channel_arch=None):
    vdict = new_channel_dict(label=label, channel_family=channel_family, org_id=org_id, channel_arch=channel_arch)
    c = rhnChannel.Channel()
    c.load_from_dict(vdict)
    c.save()
    return c


def create_new_org():
    "Create a brand new org; return the new org id"
    org_name = "unittest-org-%.3f" % time.time()
    org_password = "unittest-password-%.3f" % time.time()

    org_id = rhnServerGroup.create_new_org(org_name, org_password)
    rhnSQL.commit()
    return (org_id, org_name, org_password)


def _create_server_group(org_id, name, description):
    "Create a server group; return the server group object"
    s = rhnServerGroup.ServerGroup()
    s.set_org_id(org_id)
    s.set_name(name)
    s.set_description(description)
    s.save()
    rhnSQL.commit()
    return s


def create_server_group(params):
    "Create a server group from a dictionary with the params"
    return _create_server_group(**params)


def fetch_server_group(org_id, name):
    "Load a server group object from the org id and name"
    s = rhnServerGroup.ServerGroup()
    s.load(org_id, name)
    return s

_query_fetch_server_groups = rhnSQL.Statement("""
    select sgm.server_group_id
      from rhnServerGroupMembers sgm,
           rhnServerGroup sg
     where sgm.server_id = :server_id
      and sgm.server_group_id = sg.id
      and sg.group_type is null
""")


def fetch_server_groups(server_id):
    "Return a server's groups"
    h = rhnSQL.prepare(_query_fetch_server_groups)
    h.execute(server_id=server_id)
    groups = [x['server_group_id'] for x in h.fetchall_dict() or []]
    groups.sort()
    return groups


def build_server_group_params(**kwargs):
    "Build params for server groups"
    params = {
        'org_id':   'no such org',
        'name':   "unittest group name %.3f" % time.time(),
        'description':   "unittest group description %.3f" % time.time(),
    }
    params.update(kwargs)
    return params


def create_new_user(org_id=None, username=None, password=None, roles=None):
    "Create a new user"
    if org_id is None:
        org_id = create_new_org()
    else:
        org_id = lookup_org_id(org_id)

    if username is None:
        username = "unittest-user-%.3f" % time.time()
    if password is None:
        password = "unittest-password-%.3f" % time.time()
    if roles is None:
        roles = []

    u = rhnUser.User(username, password)
    u.set_org_id(org_id)
    u.save()
    # The password is scrambled now - re-set it
    u.contact['password'] = password
    u.save()
    user_id = u.getid()

    # Set roles
    h = rhnSQL.prepare("""
        select ug.id
          from rhnUserGroupType ugt, rhnUserGroup ug
         where ug.org_id = :org_id
           and ug.group_type = ugt.id
           and ugt.label = :role
    """)
    create_ugm = rhnSQL.Procedure("rhn_user.add_to_usergroup")
    for role in roles:
        h.execute(org_id=org_id, role=role)
        row = h.fetchone_dict()
        if not row:
            raise InvalidRoleError(org_id, role)

        user_group_id = row['id']
        create_ugm(user_id, user_group_id)

    rhnSQL.commit()

    return u


def lookup_org_id(org_id):
    "Look up the org id by user name"
    if isinstance(org_id, usix.StringType):
        # Is it a user?

        u = rhnUser.search(org_id)

        if not u:
            raise rhnServerGroup.InvalidUserError(org_id)

        return u.contact['org_id']

    t = rhnSQL.Table('web_customer', 'id')
    row = t[org_id]
    if not row:
        raise rhnServerGroup.InvalidOrgError(org_id)
    return row['id']

# class InvalidEntitlementError(Exception):
#    pass


class InvalidRoleError(Exception):
    pass


def listdir(directory):
    directory = os.path.abspath(os.path.normpath(directory))
    if not os.access(directory, os.R_OK | os.X_OK):
        print(("Can't access %s." % (directory)))
        sys.exit(1)
    if not os.path.isdir(directory):
        print(("%s not valid." % (directory)))
        sys.exit(1)
    packageList = []
    for f in os.listdir(directory):
        packageList.append("%s/%s" % (directory, f))
    return packageList

# stolen from backend/server/test/unit-test/test_rhnChannel


def new_channel_dict(**kwargs):
    _counter = 0

    label = kwargs.get('label')
    if label is None:
        label = 'rhn-unittest-%.3f-%s' % (time.time(), _counter)
        _counter = _counter + 1

    release = kwargs.get('release') or 'release-' + label
    os = kwargs.get('os') or 'Unittest Distro'
    if 'org_id' in kwargs:
        org_id = kwargs['org_id']
    else:
        org_id = 'rhn-noc'

    vdict = {
        'label': label,
        'name': kwargs.get('name') or label,
        'summary': kwargs.get('summary') or label,
        'description': kwargs.get('description') or label,
        'basedir': kwargs.get('basedir') or '/',
        'channel_arch': kwargs.get('channel_arch') or 'i386',
        'channel_families': [kwargs.get('channel_family') or label],
        'org_id': kwargs.get('org_id'),
        'gpg_key_url': kwargs.get('gpg_key_url'),
        'gpg_key_id': kwargs.get('gpg_key_id'),
        'gpg_key_fp': kwargs.get('gpg_key_fp'),
        'end_of_life': kwargs.get('end_of_life'),
        'dists': [{
            'release': release,
            'os': os,
        }],
    }
    return vdict


# stolen from backend/server/tests/unit-test/test_rhnChannel
def new_channel_family_dict(**kwargs):
    _counter = 0

    label = kwargs.get('label')
    if label is None:
        label = 'rhn-unittest-%.3f-%s' % (time.time(), _counter)
        _counter = _counter + 1

    product_url = kwargs.get('product_url') or 'http://rhn.redhat.com'

    vdict = {
        'label': label,
        'name': kwargs.get('name') or label,
        'product_url': product_url,
    }
    return vdict


def new_server(user, org_id):
    serv = rhnServer.Server(user, org_id=org_id)
    # serv.default_description()
    params = build_sys_params_with_username(username=user.contact['login'])

    # print params
    serv.server['release'] = params['os_release']
    serv.server['os'] = "Unittest Distro"
    serv.server['name'] = params['profile_name']
    serv.set_arch('i386')
    serv.default_description()
    serv.getid()
    serv.gen_secret()
    serv.save()
    return serv


class Counter:
    _counter = 0

    def value(self):
        val = self._counter
        self._counter = val + 1
        return val

def build_sys_params_with_username(**kwargs):
    val = Counter().value()
    rnd_string = "%s%s" % (int(time.time()), val)

    params = {
        'os_release': '9',
        'architecture': 'i386',
        'profile_name': "unittest server " + rnd_string,
        'username': 'no such user',
        'password': 'no such password',
    }
    params.update(kwargs)
    if 'token' in params:
        del params['token']
    return params


def create_activation_key(org_id=None, user_id=None, groups=None,
                          channels=None, entitlement_level=None, note=None, server_id=None):
    if org_id is None:
        need_user = 1
        org_id = create_new_org()
    else:
        need_user = 0

    if user_id is None:
        if need_user:
            u = create_new_user(org_id=org_id)
            user_id = u.getid()
    else:
        u = rhnUser.User("", "")
        u.reload(user_id)

    if groups is None:
        groups = []
        for i in range(3):
            params = build_server_group_params(org_id=org_id)
            sg = create_server_group(params)
            groups.append(sg.get_id())

    if channels is None:
        channels = ['rhel-i386-as-3-beta', 'rhel-i386-as-2.1-beta']

    if entitlement_level is None:
        entitlement_level = 'enterprise_entitled'

    if note is None:
        note = "Test activation key %d" % int(time.time())

    a = rhnActivationKey.ActivationKey()
    a.set_user_id(user_id)
    a.set_org_id(org_id)
    a.set_entitlement_level(entitlement_level)
    a.set_note(note)
    a.set_server_groups(groups)
    a.set_channels(channels)
    a.set_server_id(server_id)
    a.save()
    rhnSQL.commit()

    return a
 070701000001DC000081B40000000000000000000000015FBBE8EE00000516000000000000000000000000000000000000003800000000spacewalk-backend/server/test/test-cx_Oracle-memleak.py   #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import sys
import string
import cx_Oracle

if len(sys.argv) == 1:
    print(("Usage: %s <connection_string>" % sys.argv[0]))
    sys.exit(0)


def mem_usage():
    f = open("/proc/self/status")
    dict = {}
    while 1:
        line = f.readline()
        if not line:
            break
        arr = list(map(string.strip, string.split(line, ':', 1)))
        if len(arr) == 1:
            continue
        dict[arr[0]] = arr[1]
    return dict['Name'], dict['VmSize'], dict['VmRSS'], dict['VmData']

dbh = cx_Oracle.Connection(sys.argv[1])
h = dbh.cursor()
h.execute('select 1 from dual')
for i in range(10000):
    d = h.description
    if not (i % 100):
        print((mem_usage()))
  070701000001DD000081B40000000000000000000000015FBBE8EE0000037D000000000000000000000000000000000000003100000000spacewalk-backend/server/test/test-rhn-import.py  #!/usr/bin/python
#
# Copyright (c) 2008--2013 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

from spacewalk.common import rhnLog
from spacewalk.server import rhnImport

rhnLog.initLOG(level=4)

dir = "spacewalk/server/handlers"

for i in range(2):
    for iface in ['rpcClasses', 'getHandler']:
        m = rhnImport.load(dir, interface_signature=iface)
   070701000001DE000081B40000000000000000000000015FBBE8EE000002E4000000000000000000000000000000000000002A00000000spacewalk-backend/server/test/test_CFG.py #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
from spacewalk.common.rhnConfig import initCFG, CFG

initCFG('server.config-management-tool')

print((CFG.config_delim_start))
070701000001DF000081B40000000000000000000000015FBBE8EE0000040A000000000000000000000000000000000000003A00000000spacewalk-backend/server/test/test_action_rhnsd_config.py #
# Copyright (c) 2008--2013 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
from spacewalk.server import rhnSQL, rhnAction

rhnSQL.initDB('rhnuser/rhnuser@webdev')

server_id = 1003486768
try:
    action_id = rhnAction.schedule_server_action(server_id, 'rhnsd.configure')

    h = rhnSQL.prepare("""
        insert into rhnActionDaemonConfig (action_id, interval)
        values (:action_id, 10)
    """)
    h.execute(action_id=action_id)

except:
    rhnSQL.rollback()
    raise
rhnSQL.commit()
  070701000001E0000081B40000000000000000000000015FBBE8EE00000FC5000000000000000000000000000000000000004300000000spacewalk-backend/server/test/test_action_rpm_verify_extra_data.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
import sys

if len(sys.argv) != 3:
    print(("Usage: %s server_id action_id" % sys.argv[0]))
    sys.exit(1)

system_id = sys.argv[1]
action_id = sys.argv[2]

from spacewalk.common.rhnLog import initLOG
from spacewalk.server import rhnSQL

from spacewalk.server.action_extra_data import packages

initLOG("stderr", 4)
rhnSQL.initDB("rhnuser/rhnuser@webdev")

try:
    packages.verify(system_id, action_id, {
        'verify_info': [
            [['up2date', '2.9.1', '1.2.1AS', '', 'i386'], [
                'SM5..UGT c /etc/sysconfig/rhn/up2date',
                '..?..... c /etc/sysconfig/rhn/up2date-keyring.gpg',
                'S.5....T   /usr/share/rhn/up2date_client/bootloadercfg.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/capabilities.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/checkbootloader.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/clap.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/clientCaps.pyc',
                'SM5....T   /usr/share/rhn/up2date_client/config.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/depSolver.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/getMethod.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/gpgUtils.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/hardware.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/headers.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/iutil.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/lilo.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/newelilocfg.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/newgrubcfg.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/newlilocfg.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/packageList.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/rhnChannel.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/rhnDefines.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/rhnErrata.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/rhnHardware.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/rhnPackageInfo.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/rpcServer.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/rpmSource.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/rpmUtils.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/translate.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/up2date.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/up2dateAuth.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/up2dateBatch.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/up2dateErrors.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/up2dateLog.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/up2dateMessages.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/up2dateUtils.pyc',
                'S.5....T   /usr/share/rhn/up2date_client/wrapper.pyc',
                'S.5.X..T   /usr/share/rhn/up2date_client/wrapperUtils.pyc',
                '.....UG.   /var/spool/up2date',
                '.....UG.   /var/spool/up2date',
            ]],
        ],
    })
except:
    rhnSQL.rollback()
    raise

rhnSQL.commit()
   070701000001E1000081B40000000000000000000000015FBBE8EE00000372000000000000000000000000000000000000002D00000000spacewalk-backend/server/test/test_applet.py  #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
from rhn import rpclib

#server = "xmlrpc.rhn.redhat.com"
server = "coyote.devel.redhat.com"

s = rpclib.Server("http://%s/APPLET" % server)

# print s.applet.poll_status()
print((s.applet.poll_packages('2.1AS', 'i386')))
print((s.applet.poll_packages('8.0', 'i386')))
  070701000001E2000081B40000000000000000000000015FBBE8EE000003AA000000000000000000000000000000000000003000000000spacewalk-backend/server/test/test_applet_as.py   #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
from rhn import rpclib

#server = "xmlrpc.rhn.redhat.com"
server = "coyote.devel.redhat.com"

s = rpclib.Server("http://%s/APPLET" % server)

dict = s.applet.poll_packages('2.1AS', 'i386')
pkg_count = len(dict['contents'])
print(("Available packages: %d" % pkg_count))
assert pkg_count > 0, "No packages available for 2.1AS"
  070701000001E3000081B40000000000000000000000015FBBE8EE00000A0C000000000000000000000000000000000000003300000000spacewalk-backend/server/test/test_capabilities.py    #!/usr/bin/python
#
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# test case for bugzilla 127319
#
# Usage: ./xxx.py <server-name> <db>
#

import os
import sys

_topdir = os.path.dirname(sys.argv[0])
_basedir = os.path.abspath(_topdir + '/../..')
if _basedir not in sys.path:
    sys.path.append(_basedir)

import time
from rhn import rpclib
from spacewalk.server import rhnSQL, rhnServer, rhnCapability
from spacewalk.common.rhnConfig import ConfigParserError


def main():
    if len(sys.argv) == 1:
        server_name = 'xmlrpc.rhn.webdev.redhat.com'
    else:
        server_name = sys.argv[1]

    if len(sys.argv) <= 2:
        db_name = 'rhnuser/rhnuser@webdev'
    else:
        db_name = sys.argv[2]

    try:
        rhnSQL.initDB(db_name)
    except ConfigParserError:
        # database is not available when running in rpmbuild time
        print("Test skipped")
        return 0

    uri = "http://%s/XMLRPC" % (server_name, )
    s = rpclib.Server(uri)

    username = password = "test-username-%.3f" % time.time()
    email = "misa+%s@redhat.com" % username

    s.registration.reserve_user(username, password)
    s.registration.new_user(username, password, email)

    data = {
        'os_release': '9',
        'architecture': 'athlon-redhat-linux',
        'profile_name': 'Test profile for %s' % username,
        'username': username,
        'password': password,
    }
    systemid = s.registration.new_system(data)

    str_caps = [
        'this.is.bogus1(0)=0',
        'this.is.bogus2(1)=1',
        'this.is.bogus3(2)=2',
    ]
    for cap in str_caps:
        s.add_header('X-RHN-Client-Capability', cap)

    # Add some packages
    packages = [
        ['a', '1', '1', ''],
        ['b', '2', '2', ''],
        ['c', '3', '3', ''],
    ]
    s.registration.update_packages(systemid, packages)

    sobj = rhnServer.get(systemid)
    server_id = sobj.getid()
    print(("Registered server", server_id))

    return 0

if __name__ == '__main__':
    sys.exit(main() or 0)
070701000001E4000081B40000000000000000000000015FBBE8EE000002F3000000000000000000000000000000000000003300000000spacewalk-backend/server/test/test_caps_display.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
from rhn import rpclib

s = rpclib.Server("http://coyote.devel.redhat.com/REDHAT-XMLRPC")

print((s.actions.system_capabilities(1003485542)))
 070701000001E5000081B40000000000000000000000015FBBE8EE0000044D000000000000000000000000000000000000003B00000000spacewalk-backend/server/test/test_censored_db_password.py    #!/usr/bin/python
#
# Copyright (c) 2008--2013 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# This test tries to make a connection to a database that doesn't exist.
# It catches the exception and sends the traceback, but the DB password should
# be censored.
# Run the test and look into the email.

from spacewalk.server import rhnSQL
from spacewalk.common.rhnConfig import initCFG
from spacewalk.common.rhnTB import Traceback

initCFG('server.xmlrpc')

try:
    rhnSQL.initDB("rhnuser/rhnuser@webde")
except:
    Traceback('test_censored_db_password', mail=1)
   070701000001E6000081B40000000000000000000000015FBBE8EE000003F1000000000000000000000000000000000000003000000000spacewalk-backend/server/test/test_dcoracle2.py   #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
import sys
from spacewalk.server import rhnSQL

if len(sys.argv) != 2:
    print("Error: no connection string")
    sys.exit(1)

rhnSQL.initDB(sys.argv[1])

ids = [1, 2, 3]
values = [11, 22, 33]
foo = ['', '', '']

h = rhnSQL.prepare("insert into misatest (id, val) values (:id, :val)")
try:
    h.executemany(id=ids, val=values, foo=foo)
except:
    rhnSQL.rollback()
    raise

rhnSQL.commit()
   070701000001E7000081B40000000000000000000000015FBBE8EE00000691000000000000000000000000000000000000003800000000spacewalk-backend/server/test/test_delta_computation.py   #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
from spacewalk.server.rhnServer import server_packages

unzip1 = ('unzip',    '1.1', '2', '')
unzip2 = ('unzip',    '1.2', '1', '')

abiword1 = ('abiword',  '1.0', '2', '1')
abiword2 = ('abiword',  '2.0', '1', '')

kernel1 = ('kernel',   '2.4', '1', '')
kernel2 = ('kernel',   '2.4', '2', '1')
kernel3 = ('kernel',   '2.4', '3', '1')

aalib1 = ('aalib',    '1.0', '1', '')
aalib2 = ('aalib',    '1.1', '2', '')

quota = ('quota',    '1.2', '3', '1')

rpm = ('rpm',      '4.1', '1', '')

perl1 = ('perl',     '1.1', '1', '')
perl2 = ('perl',     '1.01', '1', '')

list1 = [
    abiword2,
    abiword1,
    kernel2,
    kernel1,
    aalib2,
    quota,
    rpm,
    perl1,
]

list2 = [
    unzip1,
    unzip2,
    kernel3,
    aalib1,
    rpm,
    perl2,
]

i, r = server_packages.package_delta(list1, list2)
print(("Install set:  ", i))
print(("Remove set:   ", r))

assert i == [aalib1, kernel3, unzip1, unzip2], "Invalid install set %s" % i
assert r == [aalib2, abiword1, abiword2, kernel1, kernel2, quota], "Invalid remove set %s" % r

print("All assertions passed")
   070701000001E8000081FD0000000000000000000000015FBBE8EE0000BC06000000000000000000000000000000000000003A00000000spacewalk-backend/server/test/test_errata_import_webqa.py #!/usr/bin/python
#
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

try:
    #  python 2
    import xmlrpclib
except ImportError:
    #  python3
    import xmlrpc.client as xmlrpclib
import unittest

SERVER = 'scripts.back-webqa.redhat.com'


class ErrataImportTests(unittest.TestCase):

    def testUtf8Erratum(self):
        global SERVER

        # To actually make this one repeatable, need to munge the
        # erratum_hash['advisory_name'] or erratum_hash['revision'] fields...

        erratum_hash = {'advisory_name': 'RHSA-2007:0008',
                        'bugs': [{'id': 218055,
                                  'status': 'ON_QA',
                                  'summary': 'CVE-2006-6107 D-Bus denial of service'}],
                        'crossref': '',
                        'cve': 'CVE-2006-6107',
                        'description': 'D-BUS is a system for sending messages between applications. It is used\r\nboth for the systemwide message bus service, and as a\r\nper-user-login-session messaging facility.\r\n\r\nKimmo H\xc3\xa4m\xc3\xa4l\xc3\xa4inen discovered a flaw in the way D-BUS processes certain\r\nmessages. It is possible for a local unprivileged D-BUS process to disrupt\r\nthe ability of another D-BUS process to receive messages. (CVE-2006-6107)\r\n\r\nUsers of dbus are advised to upgrade to these updated packages, which\r\ncontain backported patches to correct this issue.',
                        'errata_files': [{'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4Desktop/en/os/SRPMS/dbus-0.22-12.EL.8.src.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '379fdd3f9afb34124fa9b88deb440e3f',
                                          'rhn_channel': ['rh-x86_64-desktop-4',
                                                          'rh-i386-desktop-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4Desktop/en/os/x86_64/dbus-glib-0.22-12.EL.8.x86_64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '8c41138bbf9127bbb2d799f566ce3a8a',
                                          'rhn_channel': ['rh-x86_64-desktop-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4Desktop/en/os/x86_64/dbus-0.22-12.EL.8.x86_64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'ac83105ce8b120ec537a3ea54da1e37d',
                                          'rhn_channel': ['rh-x86_64-desktop-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4Desktop/en/os/x86_64/dbus-python-0.22-12.EL.8.x86_64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '920cf9a273c521118e374230690a3df6',
                                          'rhn_channel': ['rh-x86_64-desktop-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4Desktop/en/os/x86_64/dbus-x11-0.22-12.EL.8.x86_64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '847b2400eee82a36e3542b2f4f2d4947',
                                          'rhn_channel': ['rh-x86_64-desktop-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4Desktop/en/os/x86_64/dbus-devel-0.22-12.EL.8.x86_64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '1b248af405670382e31b06c4fa52fa36',
                                          'rhn_channel': ['rh-x86_64-desktop-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4Desktop/en/os/x86_64/dbus-glib-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '5ba2eefce27c72524c7c5cdb1b6e2224',
                                          'rhn_channel': ['rh-x86_64-desktop-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4Desktop/en/os/x86_64/dbus-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'e81002d1ca5787e89458cd7d5bb04dd5',
                                          'rhn_channel': ['rh-x86_64-desktop-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4Desktop/en/os/i386/dbus-devel-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'b8a46001a416b2e36f5da1e6868c91ec',
                                          'rhn_channel': ['rh-i386-desktop-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4Desktop/en/os/i386/dbus-python-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '8e5eadeb5be39e139885336011551656',
                                          'rhn_channel': ['rh-i386-desktop-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4Desktop/en/os/i386/dbus-x11-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '2f9d064981b12a7f4cb8cf74d6142de5',
                                          'rhn_channel': ['rh-i386-desktop-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4Desktop/en/os/i386/dbus-glib-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '5ba2eefce27c72524c7c5cdb1b6e2224',
                                          'rhn_channel': ['rh-i386-desktop-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4Desktop/en/os/i386/dbus-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'e81002d1ca5787e89458cd7d5bb04dd5',
                                          'rhn_channel': ['rh-i386-desktop-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4WS/en/os/SRPMS/dbus-0.22-12.EL.8.src.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '379fdd3f9afb34124fa9b88deb440e3f',
                                          'rhn_channel': ['rhel-x86_64-ws-4',
                                                          'rhel-i386-ws-4',
                                                          'rhel-ia64-ws-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4WS/en/os/x86_64/dbus-glib-0.22-12.EL.8.x86_64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '8c41138bbf9127bbb2d799f566ce3a8a',
                                          'rhn_channel': ['rhel-x86_64-ws-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4WS/en/os/x86_64/dbus-0.22-12.EL.8.x86_64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'ac83105ce8b120ec537a3ea54da1e37d',
                                          'rhn_channel': ['rhel-x86_64-ws-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4WS/en/os/x86_64/dbus-python-0.22-12.EL.8.x86_64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '920cf9a273c521118e374230690a3df6',
                                          'rhn_channel': ['rhel-x86_64-ws-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4WS/en/os/x86_64/dbus-x11-0.22-12.EL.8.x86_64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '847b2400eee82a36e3542b2f4f2d4947',
                                          'rhn_channel': ['rhel-x86_64-ws-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4WS/en/os/x86_64/dbus-devel-0.22-12.EL.8.x86_64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '1b248af405670382e31b06c4fa52fa36',
                                          'rhn_channel': ['rhel-x86_64-ws-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4WS/en/os/x86_64/dbus-glib-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '5ba2eefce27c72524c7c5cdb1b6e2224',
                                          'rhn_channel': ['rhel-x86_64-ws-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4WS/en/os/x86_64/dbus-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'e81002d1ca5787e89458cd7d5bb04dd5',
                                          'rhn_channel': ['rhel-x86_64-ws-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4WS/en/os/ia64/dbus-glib-0.22-12.EL.8.ia64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'b07996f3ebf2331958a1adfd230302cc',
                                          'rhn_channel': ['rhel-ia64-ws-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4WS/en/os/ia64/dbus-python-0.22-12.EL.8.ia64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'c7406fea694e12487aa8213142ed66ea',
                                          'rhn_channel': ['rhel-ia64-ws-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4WS/en/os/ia64/dbus-x11-0.22-12.EL.8.ia64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '7097ef62d6917170005f000a14a54fe7',
                                          'rhn_channel': ['rhel-ia64-ws-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4WS/en/os/ia64/dbus-devel-0.22-12.EL.8.ia64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'a294a24161855aa73d4a9d83e4f3a107',
                                          'rhn_channel': ['rhel-ia64-ws-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4WS/en/os/ia64/dbus-0.22-12.EL.8.ia64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'dd584d93cd98e8ebc3331e5c5d938b87',
                                          'rhn_channel': ['rhel-ia64-ws-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4WS/en/os/ia64/dbus-glib-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '5ba2eefce27c72524c7c5cdb1b6e2224',
                                          'rhn_channel': ['rhel-ia64-ws-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4WS/en/os/ia64/dbus-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'e81002d1ca5787e89458cd7d5bb04dd5',
                                          'rhn_channel': ['rhel-ia64-ws-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4WS/en/os/i386/dbus-devel-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'b8a46001a416b2e36f5da1e6868c91ec',
                                          'rhn_channel': ['rhel-i386-ws-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4WS/en/os/i386/dbus-python-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '8e5eadeb5be39e139885336011551656',
                                          'rhn_channel': ['rhel-i386-ws-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4WS/en/os/i386/dbus-x11-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '2f9d064981b12a7f4cb8cf74d6142de5',
                                          'rhn_channel': ['rhel-i386-ws-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4WS/en/os/i386/dbus-glib-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '5ba2eefce27c72524c7c5cdb1b6e2224',
                                          'rhn_channel': ['rhel-i386-ws-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4WS/en/os/i386/dbus-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'e81002d1ca5787e89458cd7d5bb04dd5',
                                          'rhn_channel': ['rhel-i386-ws-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4ES/en/os/SRPMS/dbus-0.22-12.EL.8.src.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '379fdd3f9afb34124fa9b88deb440e3f',
                                          'rhn_channel': ['rhel-x86_64-es-4',
                                                          'rhel-i386-es-4',
                                                          'rhel-ia64-es-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4ES/en/os/x86_64/dbus-glib-0.22-12.EL.8.x86_64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '8c41138bbf9127bbb2d799f566ce3a8a',
                                          'rhn_channel': ['rhel-x86_64-es-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4ES/en/os/x86_64/dbus-0.22-12.EL.8.x86_64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'ac83105ce8b120ec537a3ea54da1e37d',
                                          'rhn_channel': ['rhel-x86_64-es-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4ES/en/os/x86_64/dbus-python-0.22-12.EL.8.x86_64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '920cf9a273c521118e374230690a3df6',
                                          'rhn_channel': ['rhel-x86_64-es-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4ES/en/os/x86_64/dbus-x11-0.22-12.EL.8.x86_64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '847b2400eee82a36e3542b2f4f2d4947',
                                          'rhn_channel': ['rhel-x86_64-es-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4ES/en/os/x86_64/dbus-devel-0.22-12.EL.8.x86_64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '1b248af405670382e31b06c4fa52fa36',
                                          'rhn_channel': ['rhel-x86_64-es-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4ES/en/os/x86_64/dbus-glib-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '5ba2eefce27c72524c7c5cdb1b6e2224',
                                          'rhn_channel': ['rhel-x86_64-es-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4ES/en/os/x86_64/dbus-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'e81002d1ca5787e89458cd7d5bb04dd5',
                                          'rhn_channel': ['rhel-x86_64-es-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4ES/en/os/ia64/dbus-glib-0.22-12.EL.8.ia64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'b07996f3ebf2331958a1adfd230302cc',
                                          'rhn_channel': ['rhel-ia64-es-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4ES/en/os/ia64/dbus-python-0.22-12.EL.8.ia64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'c7406fea694e12487aa8213142ed66ea',
                                          'rhn_channel': ['rhel-ia64-es-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4ES/en/os/ia64/dbus-x11-0.22-12.EL.8.ia64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '7097ef62d6917170005f000a14a54fe7',
                                          'rhn_channel': ['rhel-ia64-es-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4ES/en/os/ia64/dbus-devel-0.22-12.EL.8.ia64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'a294a24161855aa73d4a9d83e4f3a107',
                                          'rhn_channel': ['rhel-ia64-es-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4ES/en/os/ia64/dbus-0.22-12.EL.8.ia64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'dd584d93cd98e8ebc3331e5c5d938b87',
                                          'rhn_channel': ['rhel-ia64-es-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4ES/en/os/ia64/dbus-glib-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '5ba2eefce27c72524c7c5cdb1b6e2224',
                                          'rhn_channel': ['rhel-ia64-es-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4ES/en/os/ia64/dbus-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'e81002d1ca5787e89458cd7d5bb04dd5',
                                          'rhn_channel': ['rhel-ia64-es-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4ES/en/os/i386/dbus-devel-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'b8a46001a416b2e36f5da1e6868c91ec',
                                          'rhn_channel': ['rhel-i386-es-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4ES/en/os/i386/dbus-python-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '8e5eadeb5be39e139885336011551656',
                                          'rhn_channel': ['rhel-i386-es-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4ES/en/os/i386/dbus-x11-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '2f9d064981b12a7f4cb8cf74d6142de5',
                                          'rhn_channel': ['rhel-i386-es-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4ES/en/os/i386/dbus-glib-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '5ba2eefce27c72524c7c5cdb1b6e2224',
                                          'rhn_channel': ['rhel-i386-es-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4ES/en/os/i386/dbus-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'e81002d1ca5787e89458cd7d5bb04dd5',
                                          'rhn_channel': ['rhel-i386-es-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/SRPMS/dbus-0.22-12.EL.8.src.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '379fdd3f9afb34124fa9b88deb440e3f',
                                          'rhn_channel': ['rhel-i386-as-4',
                                                          'rhel-ia64-as-4',
                                                          'rhel-ppc-as-4',
                                                          'rhel-s390x-as-4',
                                                          'rhel-s390-as-4',
                                                          'rhel-x86_64-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/ppc/dbus-devel-0.22-12.EL.8.ppc.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'd4adf9454e5303fdcaab8c43805a212c',
                                          'rhn_channel': ['rhel-ppc-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/ppc/dbus-0.22-12.EL.8.ppc.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'acaed9d78ce157ef8b15e19692c832c1',
                                          'rhn_channel': ['rhel-ppc-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/ppc/dbus-python-0.22-12.EL.8.ppc.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '60c70fee76a3a98c6cf46629901b2ed3',
                                          'rhn_channel': ['rhel-ppc-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/ppc/dbus-glib-0.22-12.EL.8.ppc.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '1a66a5a36be6167dff2558866ab34d9c',
                                          'rhn_channel': ['rhel-ppc-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/ppc/dbus-x11-0.22-12.EL.8.ppc.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '02a34c40ade9386f829e0bbf12dc8036',
                                          'rhn_channel': ['rhel-ppc-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/ppc/dbus-0.22-12.EL.8.ppc64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '87db84625d2e27f3b0c168e2f1e34a18',
                                          'rhn_channel': ['rhel-ppc-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/ppc/dbus-glib-0.22-12.EL.8.ppc64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'e28bef04fa98091747deef3b121fec18',
                                          'rhn_channel': ['rhel-ppc-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/s390x/dbus-python-0.22-12.EL.8.s390x.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '6afc6054de436384a71951c4ca7c1083',
                                          'rhn_channel': ['rhel-s390x-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/s390x/dbus-glib-0.22-12.EL.8.s390x.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '5608a1394e595ee7560bc2080b54524e',
                                          'rhn_channel': ['rhel-s390x-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/s390x/dbus-0.22-12.EL.8.s390x.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '38a9c1c9838f1fc0ffe7e8c62259a4e9',
                                          'rhn_channel': ['rhel-s390x-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/s390x/dbus-devel-0.22-12.EL.8.s390x.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'd17fd60137f8fc012826cb5c2fb1c798',
                                          'rhn_channel': ['rhel-s390x-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/s390x/dbus-x11-0.22-12.EL.8.s390x.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'aa63335eff72a01edf6c3c8709257100',
                                          'rhn_channel': ['rhel-s390x-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/s390x/dbus-0.22-12.EL.8.s390.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '2aec70890676846f00be1fd5ed9f4a9c',
                                          'rhn_channel': ['rhel-s390x-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/s390x/dbus-glib-0.22-12.EL.8.s390.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '79ebed9e812ce4760fcbd4bb7fa8efb7',
                                          'rhn_channel': ['rhel-s390x-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/x86_64/dbus-glib-0.22-12.EL.8.x86_64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '8c41138bbf9127bbb2d799f566ce3a8a',
                                          'rhn_channel': ['rhel-x86_64-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/x86_64/dbus-0.22-12.EL.8.x86_64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'ac83105ce8b120ec537a3ea54da1e37d',
                                          'rhn_channel': ['rhel-x86_64-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/x86_64/dbus-python-0.22-12.EL.8.x86_64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '920cf9a273c521118e374230690a3df6',
                                          'rhn_channel': ['rhel-x86_64-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/x86_64/dbus-x11-0.22-12.EL.8.x86_64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '847b2400eee82a36e3542b2f4f2d4947',
                                          'rhn_channel': ['rhel-x86_64-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/x86_64/dbus-devel-0.22-12.EL.8.x86_64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '1b248af405670382e31b06c4fa52fa36',
                                          'rhn_channel': ['rhel-x86_64-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/x86_64/dbus-glib-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '5ba2eefce27c72524c7c5cdb1b6e2224',
                                          'rhn_channel': ['rhel-x86_64-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/x86_64/dbus-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'e81002d1ca5787e89458cd7d5bb04dd5',
                                          'rhn_channel': ['rhel-x86_64-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/s390/dbus-python-0.22-12.EL.8.s390.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'f1be5d2e04c8e0698caddc9d0af40ab2',
                                          'rhn_channel': ['rhel-s390-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/s390/dbus-x11-0.22-12.EL.8.s390.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '11ca54506fedf365fab62e025d7b742b',
                                          'rhn_channel': ['rhel-s390-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/s390/dbus-0.22-12.EL.8.s390.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '2aec70890676846f00be1fd5ed9f4a9c',
                                          'rhn_channel': ['rhel-s390-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/s390/dbus-glib-0.22-12.EL.8.s390.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '79ebed9e812ce4760fcbd4bb7fa8efb7',
                                          'rhn_channel': ['rhel-s390-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/s390/dbus-devel-0.22-12.EL.8.s390.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'ba507082ec7e13a57cbf9d2addf18e9d',
                                          'rhn_channel': ['rhel-s390-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/ia64/dbus-glib-0.22-12.EL.8.ia64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'b07996f3ebf2331958a1adfd230302cc',
                                          'rhn_channel': ['rhel-ia64-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/ia64/dbus-python-0.22-12.EL.8.ia64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'c7406fea694e12487aa8213142ed66ea',
                                          'rhn_channel': ['rhel-ia64-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/ia64/dbus-x11-0.22-12.EL.8.ia64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '7097ef62d6917170005f000a14a54fe7',
                                          'rhn_channel': ['rhel-ia64-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/ia64/dbus-devel-0.22-12.EL.8.ia64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'a294a24161855aa73d4a9d83e4f3a107',
                                          'rhn_channel': ['rhel-ia64-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/ia64/dbus-0.22-12.EL.8.ia64.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'dd584d93cd98e8ebc3331e5c5d938b87',
                                          'rhn_channel': ['rhel-ia64-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/ia64/dbus-glib-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '5ba2eefce27c72524c7c5cdb1b6e2224',
                                          'rhn_channel': ['rhel-ia64-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/ia64/dbus-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'e81002d1ca5787e89458cd7d5bb04dd5',
                                          'rhn_channel': ['rhel-ia64-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/i386/dbus-devel-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'b8a46001a416b2e36f5da1e6868c91ec',
                                          'rhn_channel': ['rhel-i386-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/i386/dbus-python-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '8e5eadeb5be39e139885336011551656',
                                          'rhn_channel': ['rhel-i386-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/i386/dbus-x11-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '2f9d064981b12a7f4cb8cf74d6142de5',
                                          'rhn_channel': ['rhel-i386-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/i386/dbus-glib-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': '5ba2eefce27c72524c7c5cdb1b6e2224',
                                          'rhn_channel': ['rhel-i386-as-4']},
                                         {'ftppath': '/ftp/pub/redhat/linux/updates/enterprise/4AS/en/os/i386/dbus-0.22-12.EL.8.i386.rpm',
                                          'checksum_type': 'md5',
                                          'checksum': 'e81002d1ca5787e89458cd7d5bb04dd5',
                                          'rhn_channel': ['rhel-i386-as-4']}],
                        'errata_type': 'RHSA',
                        'erratum_deployed_by': 'jorris@redhat.com',
                        'issue_date': '2007-02-07',
                        'keywords': '',
                        'multilib': '',
                        'obsoletes': '',
                        'oval': '<?xml version="1.0" encoding="UTF-8"?>\n\n<oval_definitions xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5" xmlns:oval="http://oval.mitre.org/XMLSchema/oval-common-5" xmlns:oval-def="http://oval.mitre.org/XMLSchema/oval-definitions-5" xmlns:unix-def="http://oval.mitre.org/XMLSchema/oval-definitions-5#unix" xmlns:red-def="http://oval.mitre.org/XMLSchema/oval-definitions-5#linux" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://oval.mitre.org/XMLSchema/oval-common-5 oval-common-schema.xsd http://oval.mitre.org/XMLSchema/oval-definitions-5 oval-definitions-schema.xsd http://oval.mitre.org/XMLSchema/oval-definitions-5#unix unix-definitions-schema.xsd http://oval.mitre.org/XMLSchema/oval-definitions-5#linux linux-definitions-schema.xsd">\n  <generator>\n    <oval:product_name>Red Hat Errata System</oval:product_name>\n    <oval:schema_version>5.2</oval:schema_version>\n    <oval:timestamp>2007-02-07T12:21:43</oval:timestamp>\n  </generator>\n\n  <definitions>\n    <definition id="oval:com.redhat.rhsa:def:20070008" version="201" class="patch">\n      <metadata>\n        <title>RHSA-2007:0008: dbus security update (Moderate)\n    </title>\n    <affected family="unix">\n            <platform>Red Hat Enterprise Linux 4</platform>\n             </affected>\n        <reference source="RHSA" ref_id="RHSA-2007:0008-00" ref_url="https://rhn.redhat.com/errata/RHSA-2007-0008.html"/>\n    <description>D-BUS is a system for sending messages between applications. It is used\r\nboth for the systemwide message bus service, and as a\r\nper-user-login-session messaging facility.\r\n\r\nKimmo H\xc3\xa4m\xc3\xa4l\xc3\xa4inen discovered a flaw in the way D-BUS processes certain\r\nmessages. It is possible for a local unprivileged D-BUS process to disrupt\r\nthe ability of another D-BUS process to receive messages. (CVE-2006-6107)\r\n\r\nUsers of dbus are advised to upgrade to these updated packages, which\r\ncontain backported patches to correct this issue.</description>\n\n<!-- ~~~~~~~~~~~~~~~~~~~~   advisory details   ~~~~~~~~~~~~~~~~~~~ -->\n\n<advisory from="secalert@redhat.com">\n\n        <severity>Moderate</severity>\n\n        <rights>Copyright 2007 Red Hat, Inc.</rights>\n        <issued date="2007-02-07"/>\n        <updated date="2007-02-07"/>\n            <cve href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2006-6107">CVE-2006-6107</cve>\n                <bugzilla href="http://bugzilla.redhat.com/218055" id="218055">CVE-2006-6107 D-Bus denial of service</bugzilla>\n    </advisory>\n      </metadata>\n      <criteria operator="AND">\n <criterion test_ref="oval:com.redhat.rhsa:tst:20070008001" comment="Red Hat Enterprise Linux 4 is installed" />\n <criteria operator="OR">\n  \n <criteria operator="AND">\n <criterion test_ref="oval:com.redhat.rhsa:tst:20070008010" comment="dbus-x11 is earlier than 0:0.22-12.EL.8" /><criterion test_ref="oval:com.redhat.rhsa:tst:20070008011" comment="dbus-x11 is signed with Red Hat master key" />\n  \n</criteria><criteria operator="AND">\n <criterion test_ref="oval:com.redhat.rhsa:tst:20070008008" comment="dbus-python is earlier than 0:0.22-12.EL.8" /><criterion test_ref="oval:com.redhat.rhsa:tst:20070008009" comment="dbus-python is signed with Red Hat master key" />\n  \n</criteria><criteria operator="AND">\n <criterion test_ref="oval:com.redhat.rhsa:tst:20070008006" comment="dbus-devel is earlier than 0:0.22-12.EL.8" /><criterion test_ref="oval:com.redhat.rhsa:tst:20070008007" comment="dbus-devel is signed with Red Hat master key" />\n  \n</criteria><criteria operator="AND">\n <criterion test_ref="oval:com.redhat.rhsa:tst:20070008002" comment="dbus is earlier than 0:0.22-12.EL.8" /><criterion test_ref="oval:com.redhat.rhsa:tst:20070008003" comment="dbus is signed with Red Hat master key" />\n  \n</criteria><criteria operator="AND">\n <criterion test_ref="oval:com.redhat.rhsa:tst:20070008004" comment="dbus-glib is earlier than 0:0.22-12.EL.8" /><criterion test_ref="oval:com.redhat.rhsa:tst:20070008005" comment="dbus-glib is signed with Red Hat master key" />\n  \n</criteria>\n</criteria>\n</criteria>\n    </definition>\n  </definitions>\n  <tests>\n    <!-- ~~~~~~~~~~~~~~~~~~~~~   rpminfo tests   ~~~~~~~~~~~~~~~~~~~~~ -->\n    <rpminfo_test id="oval:com.redhat.rhsa:tst:20070008001"  version="201" comment="Red Hat Enterprise Linux 4 is installed" check="at least one">\n  <object object_ref="oval:com.redhat.rhsa:obj:20070008001" />\n  <state state_ref="oval:com.redhat.rhsa:ste:20070008002" />\n</rpminfo_test><rpminfo_test id="oval:com.redhat.rhsa:tst:20070008002"  version="201" comment="dbus is earlier than 0:0.22-12.EL.8" check="at least one">\n  <object object_ref="oval:com.redhat.rhsa:obj:20070008002" />\n  <state state_ref="oval:com.redhat.rhsa:ste:20070008003" />\n</rpminfo_test><rpminfo_test id="oval:com.redhat.rhsa:tst:20070008003"  version="201" comment="dbus is signed with Red Hat master key" check="at least one">\n  <object object_ref="oval:com.redhat.rhsa:obj:20070008002" />\n  <state state_ref="oval:com.redhat.rhsa:ste:20070008001" />\n</rpminfo_test><rpminfo_test id="oval:com.redhat.rhsa:tst:20070008004"  version="201" comment="dbus-glib is earlier than 0:0.22-12.EL.8" check="at least one">\n  <object object_ref="oval:com.redhat.rhsa:obj:20070008003" />\n  <state state_ref="oval:com.redhat.rhsa:ste:20070008003" />\n</rpminfo_test><rpminfo_test id="oval:com.redhat.rhsa:tst:20070008005"  version="201" comment="dbus-glib is signed with Red Hat master key" check="at least one">\n  <object object_ref="oval:com.redhat.rhsa:obj:20070008003" />\n  <state state_ref="oval:com.redhat.rhsa:ste:20070008001" />\n</rpminfo_test><rpminfo_test id="oval:com.redhat.rhsa:tst:20070008006"  version="201" comment="dbus-devel is earlier than 0:0.22-12.EL.8" check="at least one">\n  <object object_ref="oval:com.redhat.rhsa:obj:20070008004" />\n  <state state_ref="oval:com.redhat.rhsa:ste:20070008003" />\n</rpminfo_test><rpminfo_test id="oval:com.redhat.rhsa:tst:20070008007"  version="201" comment="dbus-devel is signed with Red Hat master key" check="at least one">\n  <object object_ref="oval:com.redhat.rhsa:obj:20070008004" />\n  <state state_ref="oval:com.redhat.rhsa:ste:20070008001" />\n</rpminfo_test><rpminfo_test id="oval:com.redhat.rhsa:tst:20070008008"  version="201" comment="dbus-python is earlier than 0:0.22-12.EL.8" check="at least one">\n  <object object_ref="oval:com.redhat.rhsa:obj:20070008005" />\n  <state state_ref="oval:com.redhat.rhsa:ste:20070008003" />\n</rpminfo_test><rpminfo_test id="oval:com.redhat.rhsa:tst:20070008009"  version="201" comment="dbus-python is signed with Red Hat master key" check="at least one">\n  <object object_ref="oval:com.redhat.rhsa:obj:20070008005" />\n  <state state_ref="oval:com.redhat.rhsa:ste:20070008001" />\n</rpminfo_test><rpminfo_test id="oval:com.redhat.rhsa:tst:20070008010"  version="201" comment="dbus-x11 is earlier than 0:0.22-12.EL.8" check="at least one">\n  <object object_ref="oval:com.redhat.rhsa:obj:20070008006" />\n  <state state_ref="oval:com.redhat.rhsa:ste:20070008003" />\n</rpminfo_test><rpminfo_test id="oval:com.redhat.rhsa:tst:20070008011"  version="201" comment="dbus-x11 is signed with Red Hat master key" check="at least one">\n  <object object_ref="oval:com.redhat.rhsa:obj:20070008006" />\n  <state state_ref="oval:com.redhat.rhsa:ste:20070008001" />\n</rpminfo_test>\n  </tests>\n\n  <objects>\n    <!-- ~~~~~~~~~~~~~~~~~~~~   rpminfo objects   ~~~~~~~~~~~~~~~~~~~~ -->\n    <rpminfo_object id="oval:com.redhat.rhsa:obj:20070008006"  version="201">\n  <name>dbus-x11</name>\n</rpminfo_object><rpminfo_object id="oval:com.redhat.rhsa:obj:20070008005"  version="201">\n  <name>dbus-python</name>\n</rpminfo_object><rpminfo_object id="oval:com.redhat.rhsa:obj:20070008004"  version="201">\n  <name>dbus-devel</name>\n</rpminfo_object><rpminfo_object id="oval:com.redhat.rhsa:obj:20070008001"  version="201">\n  <name>redhat-release</name>\n</rpminfo_object><rpminfo_object id="oval:com.redhat.rhsa:obj:20070008002"  version="201">\n  <name>dbus</name>\n</rpminfo_object><rpminfo_object id="oval:com.redhat.rhsa:obj:20070008003"  version="201">\n  <name>dbus-glib</name>\n</rpminfo_object>\n  </objects>\n  <states>\n    <!-- ~~~~~~~~~~~~~~~~~~~~   rpminfo states   ~~~~~~~~~~~~~~~~~~~~~ -->\n    <rpminfo_state id="oval:com.redhat.rhsa:ste:20070008001"  version="201">\n  <signature_keyid  operation="equals">219180cddb42a60e</signature_keyid>\n</rpminfo_state><rpminfo_state id="oval:com.redhat.rhsa:ste:20070008002"  version="201">\n  <version  operation="pattern match">^4\\D</version>\n</rpminfo_state><rpminfo_state id="oval:com.redhat.rhsa:ste:20070008003"  version="201">\n  <evr datatype="evr_string" operation="less_than">0:0.22-12.EL.8</evr>\n</rpminfo_state>\n  </states>\n</oval_definitions>\n\n',
                        'packages': '',
                        'product': 'Red Hat Enterprise Linux',
                        'reference': 'http://www.redhat.com/security/updates/classification/#moderate',
                        'revision': 3,
                        'security_impact': 'Moderate',
                        'solution': 'Before applying this update, make sure all previously released errata\r\nrelevant to your system have been applied.\r\n\r\nThis update is available via Red Hat Satellite.  To use Red Hat Satellite,\r\nlaunch the Red Hat Update Agent with the following command:\r\n\r\nup2date\r\n\r\nThis will start an interactive process that will result in the appropriate\r\nRPMs being upgraded on your system.',
                        'synopsis': 'Moderate: dbus security update',
                        'topic': 'Updated dbus packages that fix a security issue are now available for Red\r\nHat Enterprise Linux 4.\r\n\r\nThis update has been rated as having moderate security impact by the Red\r\nHat Security Response Team.',
                        'update_date': '2007-02-07'}

        url = "http://" + SERVER + "/BUGZILLA"
        s = xmlrpclib.Server(url)
        s.bugzilla_errata.submit_errata(erratum_hash)

unittest.main()
  070701000001E9000081B40000000000000000000000015FBBE8EE0000049C000000000000000000000000000000000000002B00000000spacewalk-backend/server/test/test_leak.py    #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import os
import sys
import time
from spacewalk.server import rhnSQL

print((os.getpid()))
rhnSQL.initDB('rhnuser/rhnuser@webdev')

h = rhnSQL.prepare("select 1 from dual")

start = time.time()
write = sys.stderr.write
i = 0
while i < 10000:
    h.execute()
    if i % 100 == 0:
        f = open("/proc/self/status")
        l = f.readlines()
        vmsize = l[10][10:-1]
        vmrss = l[12][10:-1]
        f.close()
        write("%d %.3f vsz: %s rss: %s \n" % (i, time.time() - start, vmsize,
                                              vmrss))
    i = i + 1
070701000001EA000081B40000000000000000000000015FBBE8EE00000492000000000000000000000000000000000000002C00000000spacewalk-backend/server/test/test_leak2.py   #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import os
import sys
import time
from DCOracle import Connect

print((os.getpid()))
dbh = Connect('rhnuser/rhnuser@webdev')

h = dbh.prepare("select 1 from dual")

start = time.time()
i = 0
write = sys.stderr.write
while i < 10000:
    h.execute()
    if i % 100 == 0:
        f = open("/proc/self/status")
        l = f.readlines()
        vmsize = l[10][10:-1]
        vmrss = l[12][10:-1]
        f.close()
        write("%d %.3f vsz: %s rss: %s \n" % (i, time.time() - start, vmsize,
                                              vmrss))
    i = i + 1
  070701000001EB000081B40000000000000000000000015FBBE8EE000003BF000000000000000000000000000000000000002C00000000spacewalk-backend/server/test/test_leak3.py   #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import os
import time
from DCOracle2 import connect

print((os.getpid()))
dbh = connect('rhnuser/rhnuser@webdev')

h = dbh.prepare("select 1 from dual")

start = time.time()
i = 0
while 1:
    h.execute()
    if 0:
        print((h.fetchone_dict()))
    else:
        print((i, "%.3f" % (time.time() - start)))
    i = i + 1
    time.sleep(.01)
 070701000001EC000081B40000000000000000000000015FBBE8EE0000050E000000000000000000000000000000000000002C00000000spacewalk-backend/server/test/test_leak4.py   #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
import os
import sys
import time
from DCOracle2 import connect

print(('PID', os.getpid()))
db = connect('rhnuser/rhnuser@webdev')

#c = db.prepare("select 1, 'z', 2, 3, 4, 't' from dual")
c = db.prepare("select 1 from dual")
#c = db.prepare("select 1, 2 from dual")

start = time.time()
i = 0
write = sys.stderr.write
while i < 10000:
    c.execute()
    if i % 100 == 0:
        f = open("/proc/self/status")
        l = f.readlines()
        vmsize = l[10][10:-1]
        vmrss = l[12][10:-1]
        f.close()
        write("%d %.3f vsz: %s rss: %s \n" % (i, time.time() - start, vmsize,
                                              vmrss))
    i = i + 1
#    time.sleep(.01)
  070701000001ED000081B40000000000000000000000015FBBE8EE000006FC000000000000000000000000000000000000004300000000spacewalk-backend/server/test/test_list_missing_source_packages.py    #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
import unittest
from TestServer import TestServer
from spacewalk.server import xp, rhnSQL

#   Tests the functionality of the listMissingSourcePackages function of the packages.py file


class ListMissingTestCase(unittest.TestCase):

    def setUp(self):
        self.directory = '/home/devel/wregglej/downloads/srcrpms'
        self.myserver = TestServer()
        self.myserver.upload_packages(self.directory, source=1)
        self.packageobj = xp.packages.Packages()

    def tearDown(self):
        rhnSQL.rollback()

    def testPresence(self):
        if self.packageobj.listMissingSourcePackages:
            assert 1
        else:
            assert 0

    def testlistMissingSourcePackages(self):
        channel = self.myserver.getChannel()
        package_list = self.packageobj.listMissingSourcePackages([channel.get_label()],
                                                                 self.myserver.getUsername(),
                                                                 self.myserver.getPassword())
        if type(package_list) == type([]):
            assert 1
        else:
            assert 0

if __name__ == "__main__":
    unittest.main()
070701000001EE000081B40000000000000000000000015FBBE8EE000007CE000000000000000000000000000000000000002F00000000spacewalk-backend/server/test/test_make_evr.py    #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
import unittest
from spacewalk.server import rhnDependency


class MakeEvrTestCase(unittest.TestCase):

    def setUp(self):
        self.make_evr = rhnDependency.make_evr

    def testEvr1(self):
        ret = self.make_evr('100:testcase1-0-0')
        assert ret['epoch'] == '100' and ret['name'] == 'testcase1' and ret['version'] == '0' and ret['release'] == '0'

    def testEvr2(self):
        ret = self.make_evr('testcase1-0-0:100')
        assert ret['epoch'] == '100' and ret['name'] == 'testcase1' and ret['version'] == '0' and ret['release'] == '0'

    def testEvr3(self):
        ret = self.make_evr('testcase1-0-0')
        assert ret['epoch'] is None and ret['name'] == 'testcase1' and ret['version'] == '0' and ret['release'] == '0'

    def testEvr4(self):
        ret = self.make_evr('100000000000000000:a.b.c.d.e.f.g.h.i.j.k.l-m.n.o.p.q.r.s.t.u.v-w.x.y.z')
        assert ret['epoch'] == '100000000000000000' and\
            ret['name'] == 'a.b.c.d.e.f.g.h.i.j.k.l' and\
            ret['version'] == 'm.n.o.p.q.r.s.t.u.v' and\
            ret['release'] == 'w.x.y.z'

    def testEvr5(self):
        ret = self.make_evr('Bbbb.a111-cccC-qwerty:500')
        assert ret['epoch'] == '500' and\
            ret['name'] == 'Bbbb.a111' and\
            ret['version'] == 'cccC' and\
            ret['release'] == 'qwerty'

if __name__ == "__main__":
    unittest.main()
  070701000001EF000081B40000000000000000000000015FBBE8EE00000577000000000000000000000000000000000000003400000000spacewalk-backend/server/test/test_malformed_xml.py   #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
from rhn.rpclib import transports

httplib = transports.connections.httplib

#server = "rhn.webdev.redhat.com"
server = "coyote.devel.redhat.com"
#server = "rhn.webqa.redhat.com"

data = """
    <?xml version='1.0'?>
    <methodCall>
    <methodName>abc</methodName>
    <params>
    <param>
    <value><string>a</string></value>
    </param>
    <param>
    <value><string>b</string></value>
    </param>
    </params>

    </methodCall>
    ember>
    <name>count</name>
    <value><int>1</int></value>
    </member>
    </struct></value>
    <value><struct>
    <member>
"""

h = httplib.HTTPConnection(server)

h.putrequest("POST", "/XMLRPC")

h.putheader('Content-Length', str(len(data)))
h.endheaders()

h.send(data)

r = h.getresponse()
print((r.msg.headers))

print((r.read()))
 070701000001F0000081B40000000000000000000000015FBBE8EE000003D0000000000000000000000000000000000000002E00000000spacewalk-backend/server/test/test_message.py #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
from spacewalk.common.rhnConfig import initCFG
from spacewalk.server import rhnSQL, rhnServer


initCFG("server.xmlrpc")
rhnSQL.initDB("rhnuser/rhnuser@webdev")

print((rhnServer.search(1003485567).fetch_registration_message()))
print((rhnServer.search(1003485558).fetch_registration_message()))
print((rhnServer.search(1003485584).fetch_registration_message()))
070701000001F1000081B40000000000000000000000015FBBE8EE00000433000000000000000000000000000000000000003200000000spacewalk-backend/server/test/test_next_action.py #
# Copyright (c) 2008--2013 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
from spacewalk.common import rhnFlags
from spacewalk.server import rhnSQL
from spacewalk.server.action_extra_data import packages, kickstart, reboot

rhnSQL.initDB('rhnuser/rhnuser@webdev')
rhnFlags.set('action_id', 11921273)
rhnFlags.set('action_status', 2)

try:
    packages.update(1003485866, 11921273, {})
    kickstart.initiate(1003485866, 11921274, {})
    reboot.reboot(1003485866, 11921275, {})
except:
    rhnSQL.rollback()
    raise
rhnSQL.rollback()
 070701000001F2000081B40000000000000000000000015FBBE8EE000003C4000000000000000000000000000000000000003100000000spacewalk-backend/server/test/test_procedures.py  #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#


from spacewalk.server import rhnSQL

rhnSQL.initDB('rhnuser/rhnuser@phx')

counter = 0
while 1:
    #p = rhnSQL.Procedure('rhn_entitlements.get_server_entitlement')
    p = rhnSQL.Procedure('rhn_entitlements.upgrade_server')
    ret = p(1000102174)
    print((counter, ret))
    counter = counter + 1
    # if counter > 700:
    #    time.sleep(.5)
070701000001F3000081B40000000000000000000000015FBBE8EE00000461000000000000000000000000000000000000003000000000spacewalk-backend/server/test/test_queue_get.py   #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
from spacewalk.server import rhnSQL
from spacewalk.common.rhnLog import initLOG
from spacewalk.common.rhnConfig import initCFG
from spacewalk.server.xmlrpc import queue

initLOG("stderr", 4)
initCFG('server.xmlrpc')
rhnSQL.initDB('rhnuser/rhnuser@webdev')

q = queue.Queue()
if 1:
    systemid = open("../../test/backend/checks/systemid-farm06").read()
    print((q.get(systemid, version=2)))
else:
    q.server_id = 1003485791

    q._invalidate_failed_prereq_actions()

# rhnSQL.rollback()
rhnSQL.commit()
   070701000001F4000081B40000000000000000000000015FBBE8EE0000041E000000000000000000000000000000000000003300000000spacewalk-backend/server/test/test_registration.py    #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

from spacewalk.common.rhnConfig import initCFG
from spacewalk.server.rhnSQL import initDB
from spacewalk.server.xmlrpc import registration

initCFG("server.xmlrpc")
initDB('rhnuser/rhnuser@webdev')

r = registration.Registration()

data = {
    'os_release': '8.0',
    'profile_name': 'test local',
    'architecture': 'i686',
    'token': '382c712e94b2505f6070f011e8ec1a7e',
}

open("/tmp/rereg-systemid", "w+").write(r.new_system(data))
  070701000001F5000081B40000000000000000000000015FBBE8EE0000039F000000000000000000000000000000000000003400000000spacewalk-backend/server/test/test_rhnCapability.py   #
# Copyright (c) 2008--2013 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
import rhnSQL
from rhnCapability import set_client_capabilities, update_client_capabilities

if __name__ == '__main__':
    rhnSQL.initDB('rhnuser/rhnuser@webdev')

    set_client_capabilities([
        "caneatCheese(1)=1", "caneatMeat(22)=3", "a(3)=4", "b(3)=5",
    ])
    update_client_capabilities(1000102174)
 070701000001F6000081B40000000000000000000000015FBBE8EE00000B31000000000000000000000000000000000000003100000000spacewalk-backend/server/test/test_rhnChannel.py  #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
import sys
import time
from spacewalk.common import rhnFlags
from spacewalk.common.rhnConfig import initCFG
from spacewalk.server import rhnSQL, rhnChannel, rhnServer, rhnUser


def test_server_search(use_key=0):
    if use_key:
        user = None
    else:
        user = 'mibanescu-plain'
    u = rhnUser.search(user)
    s = rhnServer.Server(u, arch="athlon")
    s.server["release"] = "2.1AS"
    s.server["name"] = "test 1"
    if use_key:
        rhnFlags.set("registration_token", 'a02487cf77e72f86338f44212d23140d')
    s.save()
    print((s.server["id"]))


if __name__ == "__main__":
    initCFG("server.xmlrpc")
    rhnSQL.initDB('rhnuser/rhnuser@webdev')

    if 1:
        test_server_search(use_key=1)
        sys.exit(1)

    print((rhnChannel.get_server_channel_mappings(1000102174, release='2.1AS')))
    print((rhnChannel.get_server_channel_mappings(1000102174, release='2.1AS',
                                                 user_id=2825619, none_ok=1)))

    print((rhnChannel.channels_for_release_arch('2.1AS', 'athlon-redhat-linux')))
    print((rhnChannel.channels_for_release_arch('2.1AS', 'athlon-redhat-linux', user_id=575937)))
    print((rhnChannel.channels_for_release_arch('2.1AS', 'XXXX-redhat-linux', user_id=575937)))
    # mibanescu-2
#    print rhnChannel.channels_for_release_arch('9', 'i386-redhat-linux', user_id=2012148)
    # mibanescu-plain
    print((rhnChannel.channels_for_release_arch('2.1AS', 'athlon-redhat-linux', user_id=2825619)))
    sys.exit(1)

    channel = "redhat-linux-i386-7.1"

    start = time.time()
    ret = rhnChannel.list_packages(channel)
    print(("Took %.2f seconds to list %d packages in %s" % (
        time.time() - start, len(ret), channel)))
    # pprint.pprint(ret)

    start = time.time()
    ret = rhnChannel.list_obsoletes(channel)
    print(("Took %.2f seconds to list %d obsoletes in %s" % (
        time.time() - start, len(ret), channel)))
    # pprint.pprint(ret)

    server_id = 1002156837
    channels = rhnChannel.channels_for_server(server_id)

    s = rhnServer.search(server_id)
    s.change_base_channel("2.1AS-foobar")
    print([x['label'] for x in channels])
    print([x['label'] for x in rhnChannel.channels_for_server(server_id)])
    rhnSQL.commit()
   070701000001F7000081B40000000000000000000000015FBBE8EE00000340000000000000000000000000000000000000003700000000spacewalk-backend/server/test/test_rhnSQL_Procedure.py    #
# Copyright (c) 2008--2013 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

from spacewalk.server import rhnSQL

rhnSQL.initDB("rhnuser/rhnuser@webdev")

p = rhnSQL.Procedure("rhn_channel.subscribe_server")

try:
    p(1003486745, 33)
except:
    rhnSQL.rollback()
    raise

rhnSQL.rollback()
070701000001F8000081B40000000000000000000000015FBBE8EE000003CC000000000000000000000000000000000000003100000000spacewalk-backend/server/test/test_rhnSession.py  #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

from spacewalk.common.rhnConfig import initCFG
from spacewalk.server import rhnSQL, rhnUser

rhnSQL.initDB("rhnuser/rhnuser@webdev")
initCFG('server.xmlrpc')

u = rhnUser.search("mibanescu-channel-admin")
session = u.create_session()

s = session.get_session()

print(("Checking with session", s))

u = rhnUser.session_reload(s)
print(u)
print((u.username))
070701000001F9000081B40000000000000000000000015FBBE8EE00004CE8000000000000000000000000000000000000003900000000spacewalk-backend/server/test/test_solve_dependencies.py  #!/usr/bin/python
#
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

from spacewalk.server import rhnDependency, rhnSQL
import unittest
from TestServer import TestServer
import rpm


def make_nvre_dict(epoch, version, release):
    return {
        'epoch':   epoch,
        'version':   version,
        'release':   release
    }


class SolveDependenciesTestCase(unittest.TestCase):
    # this class assumes that:
    # mozilla-1.3.1-0.dag.rhel3.i386.rpm
    # mozilla-1.5-2.rhfc1.dag.i386.rpm
    # mozilla-1.6-0.rhfc1.dag.i386.rpm
    # mozilla-1.7.1-1.1.el3.test.i386.rpm
    # are all available in self.directory.

    def setUp(self):
        self.directory = '/home/devel/wregglej/testrpms'
        self.filename = 'libcaps.so'
        self.arch = 'i386'
        self.myserver = TestServer()
        self.serv_id = self.myserver.getServerId()
        self.myserver.upload_packages(self.directory)
        self.up2date = self.myserver.getUp2date()
        self.solve_deps_arch = rhnDependency.solve_dependencies_arch
        self.solve_deps_with_limits = rhnDependency.solve_dependencies_with_limits
        self.up2date = self.myserver.getUp2date()

    def tearDown(self):
        rhnSQL.rollback()

    def testReturnType(self):
        assert type(self.solve_deps_arch(self.serv_id, [], 2)) == type({})

    def testKeyType(self):
        assert type(list(self.solve_deps_arch(self.serv_id, [self.filename], 2).keys())[0]) == type('a')

    def testValueType(self):
        assert type(self.solve_deps_arch(self.serv_id, [self.filename], 2)[self.filename]) == type([])

    def testNestedValueType(self):
        assert type(self.solve_deps_arch(self.serv_id, [self.filename], 2)[self.filename][0]) == type([])

    def testNestedValueLength(self):
        assert len(self.solve_deps_arch(self.serv_id, [self.filename], 2)[self.filename][0]) > 0

    def testNestedValueLength2(self):
        assert len(self.solve_deps_arch(self.serv_id, [self.filename], 2)[self.filename][0]) == 5

    def testNestedValueType0(self):
        assert type(self.solve_deps_arch(self.serv_id, [self.filename], 2)[self.filename][0][0]) == type('a')

    def testNestedValueType1(self):
        assert type(self.solve_deps_arch(self.serv_id, [self.filename], 2)[self.filename][0][1]) == type('a')

    def testNestedValueType2(self):
        assert type(self.solve_deps_arch(self.serv_id, [self.filename], 2)[self.filename][0][2]) == type('a')

    def testNestedValueType3(self):
        assert type(self.solve_deps_arch(self.serv_id, [self.filename], 2)[self.filename][0][3]) == type('a')

    def testNestedValueType4(self):
        assert type(self.solve_deps_arch(self.serv_id, [self.filename], 2)[self.filename][0][4]) == type('a')

    def testVerifyArch(self):
        assert self.solve_deps_arch(self.serv_id, [self.filename], 2)[self.filename][0][4] == self.arch

    def testReturnTypeLimit(self):
        assert type(self.solve_deps_with_limits(self.serv_id, [], 2)) == type({})

    def testKeyTypeLimit(self):
        assert type(list(self.solve_deps_with_limits(self.serv_id, [self.filename], 2).keys())[0]) == type('a')

    def testValueTypeLimit(self):
        assert type(self.solve_deps_with_limits(self.serv_id, [self.filename], 2)[self.filename]) == type([])

    def testNestedValueTypeLimit(self):
        assert type(self.solve_deps_with_limits(self.serv_id, [self.filename], 2)[self.filename][0]) == type([])

    def testNestedValueLengthLimit(self):
        assert len(self.solve_deps_with_limits(self.serv_id, [self.filename], 2)[self.filename][0]) > 0

    def testNestedValueLengthLimit2(self):
        assert len(self.solve_deps_with_limits(self.serv_id, [self.filename], 2)[self.filename][0]) == 5

    def testNestedValueTypeLimit0(self):
        assert type(self.solve_deps_with_limits(self.serv_id, [self.filename], 2)[self.filename][0][0]) == type('a')

    def testNestedValueTypeLimit1(self):
        assert type(self.solve_deps_with_limits(self.serv_id, [self.filename], 2)[self.filename][0][1]) == type('a')

    def testNestedValueTypeLimit2(self):
        assert type(self.solve_deps_with_limits(self.serv_id, [self.filename], 2)[self.filename][0][2]) == type('a')

    def testNestedValueTypeLimit3(self):
        assert type(self.solve_deps_with_limits(self.serv_id, [self.filename], 2)[self.filename][0][3]) == type('a')

    def testNestedValueTypeLimit4(self):
        assert type(self.solve_deps_with_limits(self.serv_id, [self.filename], 2)[self.filename][0][4]) == type('a')

    def testVerifyArchLimit(self):
        assert self.solve_deps_with_limits(self.serv_id, [self.filename], 2)[self.filename][0][4] == self.arch

    def testAllReturn(self):
        pack = self.solve_deps_with_limits(self.serv_id,
                                           [self.filename],
                                           2,
                                           all=1)
        if pack is not None:
            assert 1
        else:
            assert 0

    def testAllReturn1(self):
        pack = self.solve_deps_with_limits(self.serv_id,
                                           [self.filename],
                                           2,
                                           all=1)
        exp_ret = ['mozilla', '1.3.1', '0.dag.rhel3', '34', 'i386']
        if exp_ret in pack[self.filename]:
            assert 1
        else:
            assert 0

    def testAllReturn2(self):
        pack = self.solve_deps_with_limits(self.serv_id,
                                           [self.filename],
                                           2,
                                           all=1)
        exp_ret = ['mozilla', '1.7.1', '1.1.el3.dag', '37', 'i386']
        if exp_ret in pack[self.filename]:
            assert 1
        else:
            assert 0

    def testAllReturn3(self):
        pack = self.solve_deps_with_limits(self.serv_id,
                                           [self.filename],
                                           2,
                                           all=1)
        exp_ret = ['mozilla', '1.5', '2.rhfc1.dag', '38', 'i386']
        if exp_ret in pack[self.filename]:
            assert 1
        else:
            assert 0

    def testAllReturn4(self):
        pack = self.solve_deps_with_limits(self.serv_id,
                                           [self.filename],
                                           2,
                                           all=1)
        exp_ret = ['mozilla', '1.6', '0.rhfc1.dag', '38', 'i386']
        if exp_ret in pack[self.filename]:
            assert 1
        else:
            assert 0

    def testNotAllReturn(self):
        pack = self.solve_deps_with_limits(self.serv_id,
                                           [self.filename],
                                           2)

        exp_ret = ['mozilla', '1.6', '0.rhfc1.dag', '38', 'i386']
        if exp_ret in pack[self.filename]:
            assert 1
        else:
            assert 0

    def testMakeEvr(self):
        nlimitstr = '38:mozilla-1.5-2.rhfc1.dag'
        nlimit = rhnDependency.make_evr(nlimitstr)
        assert nlimit['epoch'] == '38' and\
            nlimit['name'] == 'mozilla' and\
            nlimit['version'] == '1.5' and\
            nlimit['release'] == '2.rhfc1.dag'

    def testMakeEvr1(self):
        nlimitstr = 'mozilla-1.5-2.rhfc1.dag:38'
        nlimit = rhnDependency.make_evr(nlimitstr)
        assert nlimit['epoch'] == '38' and\
            nlimit['name'] == 'mozilla' and\
            nlimit['version'] == '1.5' and\
            nlimit['release'] == '2.rhfc1.dag'

    def testMakeEvr2(self):
        nlimitstr = 'mozilla-1.5-2.rhfc1.dag'
        nlimit = rhnDependency.make_evr(nlimitstr)
        assert nlimit['epoch'] is None and\
            nlimit['name'] == 'mozilla' and\
            nlimit['version'] == '1.5' and\
            nlimit['release'] == '2.rhfc1.dag'

    def testEvrFilterE(self):
        nlimitstr = '38:mozilla-1.5-2.rhfc1.dag'
        nlimit = rhnDependency.make_evr(nlimitstr)
        pack = self.solve_deps_with_limits(self.serv_id,
                                           [self.filename],
                                           2,
                                           limit_operator='==',
                                           limit=nlimitstr)
        assert pack[self.filename][0][1] == nlimit['version'] and\
            pack[self.filename][0][2] == nlimit['release'] and\
            pack[self.filename][0][3] == nlimit['epoch']

    def testEvrFilterGT(self):
        nlimitstr = '38:mozilla-1.5-2.rhfc1.dag'
        nlimit = rhnDependency.make_evr(nlimitstr)
        pack = self.solve_deps_with_limits(self.serv_id,
                                           [self.filename],
                                           2,
                                           limit_operator='>',
                                           limit=nlimitstr)
        assert rpm.labelCompare((pack[self.filename][0][3], pack[self.filename][0][1], pack[self.filename][0][2]),
                                (nlimit['epoch'], nlimit['version'], nlimit['release'])) == 1

    def testEvrFilterGTE(self):
        nlimitstr = '38:mozilla-1.5-2.rhfc1.dag'
        nlimit = rhnDependency.make_evr(nlimitstr)
        pack = self.solve_deps_with_limits(self.serv_id,
                                           [self.filename],
                                           2,
                                           limit_operator='>=',
                                           limit=nlimitstr)
        ret = rpm.labelCompare((pack[self.filename][0][3], pack[self.filename][0][1], pack[self.filename][0][2]),
                               (nlimit['epoch'], nlimit['version'], nlimit['release']))
        assert ret == 1 or ret == 0

    def testEvrFilterLT(self):
        nlimitstr = '38:mozilla-1.5-2.rhfc1.dag'
        nlimit = rhnDependency.make_evr(nlimitstr)
        pack = self.solve_deps_with_limits(self.serv_id,
                                           [self.filename],
                                           2,
                                           limit_operator='<',
                                           limit=nlimitstr)
        ret = rpm.labelCompare((pack[self.filename][0][3], pack[self.filename][0][1], pack[self.filename][0][2]),
                               (nlimit['epoch'], nlimit['version'], nlimit['release']))
        assert ret == -1

    def testEvrFilterLTE(self):
        nlimitstr = '38:mozilla-1.5-2.rhfc1.dag'
        nlimit = rhnDependency.make_evr(nlimitstr)
        pack = self.solve_deps_with_limits(self.serv_id,
                                           [self.filename],
                                           2,
                                           limit_operator='<=',
                                           limit=nlimitstr)
        ret = rpm.labelCompare((pack[self.filename][0][3], pack[self.filename][0][1], pack[self.filename][0][2]),
                               (nlimit['epoch'], nlimit['version'], nlimit['release']))
        assert ret == -1 or ret == 0

    def testUp2dateObj(self):
        pack = self.up2date.solveDependencies(self.myserver.getSystemId(), [self.filename])
        if pack is not None:
            assert 1
        else:
            assert 0

    def testUp2dateObjReturnLength(self):
        pack = self.up2date.solveDependencies_arch(self.myserver.getSystemId(), [self.filename])
        assert len(pack[self.filename][0]) == 5

    def testUp2dateObjArchReturnType(self):
        pack = self.up2date.solveDependencies_arch(self.myserver.getSystemId(), [self.filename])
        assert pack[self.filename][0][4] == 'i386'

    def testUp2dateFilterEq(self):
        nlimitstr = '38:mozilla-1.5-2.rhfc1.dag'
        nlimit = rhnDependency.make_evr(nlimitstr)
        pack = self.up2date.solveDependencies_with_limits(self.myserver.getSystemId(),
                                                          [self.filename],
                                                          2,
                                                          limit_operator='==',
                                                          limit=nlimitstr)
        ret = rpm.labelCompare((pack[self.filename][0][3], pack[self.filename][0][1], pack[self.filename][0][2]),
                               (nlimit['epoch'], nlimit['version'], nlimit['release']))

        assert ret == 0

    def testUp2dateFilterGT(self):
        nlimitstr = '35:mozilla-0-0'
        nlimit = rhnDependency.make_evr(nlimitstr)
        pack = self.up2date.solveDependencies_with_limits(self.myserver.getSystemId(),
                                                          [self.filename],
                                                          2,
                                                          limit_operator='>',
                                                          limit=nlimitstr)
        ret = rpm.labelCompare((pack[self.filename][0][3], pack[self.filename][0][1], pack[self.filename][0][2]),
                               (nlimit['epoch'], nlimit['version'], nlimit['release']))
        assert ret == 1

    def testUp2dateFilterGTE(self):
        nlimitstr = '35:mozilla-1-1'
        nlimit = rhnDependency.make_evr(nlimitstr)
        pack = self.up2date.solveDependencies_with_limits(self.myserver.getSystemId(),
                                                          [self.filename],
                                                          2,
                                                          limit_operator='>',
                                                          limit=nlimitstr)
        ret = rpm.labelCompare((pack[self.filename][0][3], pack[self.filename][0][1], pack[self.filename][0][2]),
                               (nlimit['epoch'], nlimit['version'], nlimit['release']))
        assert ret == 1 or ret == 0

    def testUp2dateFilterLT(self):
        nlimitstr = '35:mozilla-1-1'
        nlimit = rhnDependency.make_evr(nlimitstr)
        pack = self.up2date.solveDependencies_with_limits(self.myserver.getSystemId(),
                                                          [self.filename],
                                                          2,
                                                          limit_operator='<',
                                                          limit=nlimitstr)
        ret = rpm.labelCompare((pack[self.filename][0][3], pack[self.filename][0][1], pack[self.filename][0][2]),
                               (nlimit['epoch'], nlimit['version'], nlimit['release']))
        assert ret == -1

    def testUp2dateFilterLTE(self):
        nlimitstr = '35:mozilla-1-1'
        nlimit = rhnDependency.make_evr(nlimitstr)
        pack = self.up2date.solveDependencies_with_limits(self.myserver.getSystemId(),
                                                          [self.filename],
                                                          2,
                                                          limit_operator='<=',
                                                          limit=nlimitstr)
        ret = rpm.labelCompare((pack[self.filename][0][3], pack[self.filename][0][1], pack[self.filename][0][2]),
                               (nlimit['epoch'], nlimit['version'], nlimit['release']))
        assert ret == -1 or ret == 0

    def testUp2dateFilterEq1(self):
        nlimitstr = '38:mozilla-1.5-2.rhfc1.dag'
        nlimit = rhnDependency.make_evr(nlimitstr)
        pack = self.up2date.solveDependencies_with_limits(self.myserver.getSystemId(),
                                                          [self.filename],
                                                          2,
                                                          limit_operator='==',
                                                          limit=nlimitstr)
        ret = rpm.labelCompare((pack[self.filename][0][3], pack[self.filename][0][1], pack[self.filename][0][2]),
                               (nlimit['epoch'], nlimit['version'], nlimit['release']))

        assert ret == 0

    def testUp2dateFilterGT1(self):
        nlimitstr = 'mozilla-0-0:35'
        nlimit = rhnDependency.make_evr(nlimitstr)
        pack = self.up2date.solveDependencies_with_limits(self.myserver.getSystemId(),
                                                          [self.filename],
                                                          2,
                                                          limit_operator='>',
                                                          limit=nlimitstr)
        ret = rpm.labelCompare((pack[self.filename][0][3], pack[self.filename][0][1], pack[self.filename][0][2]),
                               (nlimit['epoch'], nlimit['version'], nlimit['release']))
        assert ret == 1

    def testUp2dateFilterGTE1(self):
        nlimitstr = 'mozilla-1-1:35'
        nlimit = rhnDependency.make_evr(nlimitstr)
        pack = self.up2date.solveDependencies_with_limits(self.myserver.getSystemId(),
                                                          [self.filename],
                                                          2,
                                                          limit_operator='>',
                                                          limit=nlimitstr)
        ret = rpm.labelCompare((pack[self.filename][0][3], pack[self.filename][0][1], pack[self.filename][0][2]),
                               (nlimit['epoch'], nlimit['version'], nlimit['release']))
        assert ret == 1 or ret == 0

    def testUp2dateFilterLT1(self):
        nlimitstr = 'mozilla-1-1:35'
        nlimit = rhnDependency.make_evr(nlimitstr)
        pack = self.up2date.solveDependencies_with_limits(self.myserver.getSystemId(),
                                                          [self.filename],
                                                          2,
                                                          limit_operator='<',
                                                          limit=nlimitstr)
        ret = rpm.labelCompare((pack[self.filename][0][3], pack[self.filename][0][1], pack[self.filename][0][2]),
                               (nlimit['epoch'], nlimit['version'], nlimit['release']))
        assert ret == -1

    def testUp2dateFilterLTE1(self):
        nlimitstr = 'mozilla-1-1:35'
        nlimit = rhnDependency.make_evr(nlimitstr)
        pack = self.up2date.solveDependencies_with_limits(self.myserver.getSystemId(),
                                                          [self.filename],
                                                          2,
                                                          limit_operator='<=',
                                                          limit=nlimitstr)
        ret = rpm.labelCompare((pack[self.filename][0][3], pack[self.filename][0][1], pack[self.filename][0][2]),
                               (nlimit['epoch'], nlimit['version'], nlimit['release']))
        assert ret == -1 or ret == 0


if __name__ == "__main__":
    unittest.main()

    rhnSQL.rollback()
070701000001FA000081B40000000000000000000000015FBBE8EE00000526000000000000000000000000000000000000003100000000spacewalk-backend/server/test/test_test_login.py  #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
import unittest
import TestServer
import server.app.packages


class TestLoginTestCase(unittest.TestCase):

    def setUp(self):
        self.myserver = TestServer.TestServer()
        self.packages = server.app.packages.Packages()

    def tearDown(self):
        pass

    def testReturnType(self):
        assert type(self.packages.test_login(self.myserver.getUsername(), self.myserver.getPassword())) == type(1)

    def testReturnValue(self):
        assert self.packages.test_login(self.myserver.getUsername(), self.myserver.getPassword()) == 1

    def testReturnValue2(self):
        assert self.packages.test_login("afdafdsfasdf", "afdfadfa") == 0

if __name__ == "__main__":
    unittest.main()
  070701000001FB000081B40000000000000000000000015FBBE8EE00000315000000000000000000000000000000000000003500000000spacewalk-backend/server/test/test_upload_imports.py  #
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

from spacewalk.server import rhnImport

root_dir = "/var/www/rhns"

print((rhnImport.load("upload_server/handlers",
                     interface_signature='upload_class')))
   070701000001FC000081B40000000000000000000000015FBBE8EE00000B4F000000000000000000000000000000000000003500000000spacewalk-backend/server/test/test_xmlrpc_up2date.py  #!/usr/bin/python
#
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

from spacewalk.server import rhnSQL
import unittest
from TestServer import TestServer


def make_nvre_dict(epoch, version, release):
    return {
        'epoch':   epoch,
        'version':   version,
        'release':   release
    }


class SolveDependenciesTestCase(unittest.TestCase):
    # this class assumes that:
    # mozilla-1.3.1-0.dag.rhel3.i386.rpm
    # mozilla-1.5-2.rhfc1.dag.i386.rpm
    # mozilla-1.6-0.rhfc1.dag.i386.rpm
    # mozilla-1.7.1-1.1.el3.test.i386.rpm
    # are all available in self.directory.

    def setUp(self):
        self.directory = '/home/devel/wregglej/testrpms'
        self.filename = 'libcaps.so'
        self.arch = 'i386'
        self.myserver = TestServer()
        self.serv_id = self.myserver.getServerId()
        self.myserver.upload_packages(self.directory)
        self.up2date = self.myserver.getUp2date()
        self.sysid = self.myserver.getSystemId()
        self.sd2 = self.up2date.solveDependencies_v2  # returns arch info
        self.sd4 = self.up2date.solveDependencies_v4  # returns arch info, has better filtering

    def tearDown(self):
        rhnSQL.rollback()

    def testGetArchSd2(self):
        ret = self.sd2(self.sysid, [self.filename])
        assert len(ret[self.filename][0]) == 5

    def testGetArchSd4(self):
        ret = self.sd4(self.sysid, [self.filename])
        assert len(ret[self.filename][0]) == 5

    def testArchTypeSd2(self):
        ret = self.sd2(self.sysid, [self.filename])
        assert type(ret[self.filename][0][4]) == type('a')

    def testArchTypeSd4(self):
        ret = self.sd4(self.sysid, [self.filename])
        assert type(ret[self.filename][0][4]) == type('a')

    def testArchValueSd2(self):
        ret = self.sd2(self.sysid, [self.filename])
        assert ret[self.filename][0][4] == 'i386'

    def testArchValueSd4(self):
        ret = self.sd4(self.sysid, [self.filename])
        assert ret[self.filename][0][4] == 'i386'

    def testAllTrueSd4(self):
        ret = self.sd4(self.sysid, [self.filename], all=1)
        assert len(ret[self.filename]) > 1

    def testAllFalseSd4(self):
        ret = self.sd4(self.sysid, [self.filename], all=0)
        assert len(ret[self.filename]) == 1

if __name__ == "__main__":
    unittest.main()
 070701000001FD000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002800000000spacewalk-backend/server/test/unit-test   070701000001FE000081B40000000000000000000000015FBBE8EE00000366000000000000000000000000000000000000003100000000spacewalk-backend/server/test/unit-test/Makefile  # Docker tests variables
DOCKER_CONTAINER_BASE = manager_python_testing
DOCKER_TESTED_BRANCH  = head
DOCKER_REGISTRY       = registry.mgr.suse.de
DOCKER_RUN_EXPORT     = "PYTHONPATH=/manager/client/rhel/rhnlib/:/manager/client/rhel/rhn-client-tools/src"
DOCKER_VOLUMES        = -v "$(CURDIR)/../../../../:/manager"

DB_TESTS       = \
        test_capabilities.py \
        test_misc_functions.py \
        test_rhnActivationKey.py \
        test_rhnChannel.py \
        test_rhnServerGroup.py \
        test_server_registration.py


TESTS       = \
        test_rhnLib_timestamp.py

all:	$(addprefix test-,$(TESTS))

test-%:
	@echo Running $*
	PYTHONPATH=$(PYTHONPATH):../../../ $(PYTHON_BIN) $*

docker_shell ::
	docker run --rm=true -t -i -e $(DOCKER_RUN_EXPORT) $(DOCKER_VOLUMES) $(DOCKER_REGISTRY)/$(DOCKER_CONTAINER_BASE)_oracle_$(DOCKER_TESTED_BRANCH) /bin/bash

  070701000001FF000081B40000000000000000000000015FBBE8EE000B2D26000000000000000000000000000000000000003E00000000spacewalk-backend/server/test/unit-test/rhn-package-78527.xml <rhn-package id="rhn-package-78527" build-host="stripples.devel.redhat.com" source-rpm="tetex-1.0.7-38.4.src.rpm" release="38.4" cookie="stripples.devel.redhat.com 1031312621" version="1.0.7" epoch="" last-modified="1059409136" rpm-version="4.0.4" package-arch="i386" payload-format="cpio" checksum-type="md5" checksum="2f65aac0c10b5bf20cb1bd0d2c71c5e3" build-time="1031330621" package-group="Applications/Publishing
" package-size="20874090" name="tetex-doc" payload-size="48908784" compat="0"><rhn-package-summary>The documentation files for the TeX text formatting system.
</rhn-package-summary><rhn-package-description>The tetex-doc package contains documentation for the TeX text
formatting system.

If you want to use TeX and you are not an expert at it, you should
install the tetex-doc package. You also need to install the tetex
package, tetex-afm (a PostScript font converter for TeX), tetex-dvilj
(for converting .dvi files to HP PCL format for printing on HP and HP
compatible printers), tetex-dvips (for converting .dvi files to
PostScript format for printing on PostScript printers), tetex-latex (a
higher level formatting package which provides an easier-to-use
interface for TeX), and tetex-xdvi (for previewing .dvi files).
</rhn-package-description><rhn-package-vendor>Red Hat, Inc.</rhn-package-vendor><rhn-package-copyright>distributable</rhn-package-copyright><rhn-package-header-sig><rhn-null/></rhn-package-header-sig><rhn-package-changelog><rhn-package-changelog-entry><rhn-package-changelog-entry-name>- David BAUDENS &lt;baudens@mandrakesoft.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- AMD K6 is not an i686 processor (another)
- Replace $RPM_ARCH by %{_target_cpu}</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>944708400</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Bill Nottingham &lt;notting@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- remove explicit xpm-devel prereq (subsumed into XFree86)
- fixes for ia64</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>957582000</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Cristian Gafton &lt;gafton@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- I think I have got the buildroot problems right this time
- auto rebuild in the new build environment (release 15)</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>922244400</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Cristian Gafton &lt;gafton@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- add patch to make it compile on the arm (RmS)
- build for glibc 2.1
- use tar hack instead of the cp -a to overcome cp&apos;s brokeness re: symlinks
  handling</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>916110000</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Cristian Gafton &lt;gafton@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- fix buildroot problems</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>921898800</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Cristian Gafton &lt;gafton@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- requires ed
- Fixed obsoletes line
- credted the doc subpackage
- fully buildroot
- require dialog in the main package
- add support for wmconfig in for the xdvi package</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>907642800</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Cristian Gafton &lt;gafton@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- slight changes in the packaging (unpack texmf directly into the buildroot
  and build it there)
- added texmfsrc source tarball to comply with the license</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>921207600</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Cristian Gafton &lt;gafton@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- strip binaries
- enable italian formatting</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>908074800</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Cristian Gafton &lt;gafton@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- upgrade to 0.9
- texmf-src package is gone
- use /var/lib/texmf instead of /var/tmp/texmf</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>905569200</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Cristian Gafton &lt;gafton@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- upgraded snapshot</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>923022000</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Crutcher Dunnavant &lt;crutcher@redhat.com&gt; 1.0.7-15</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- add PAGEsize to mf40-tetex_filters</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>985748400</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Erik Troan &lt;ewt@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- built against glibc</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>868590000</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Erik Troan &lt;ewt@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- set limits for jadetex</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>922244400</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Giuseppe GhibÃ² &lt;ghibo@caesar.polito.it&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- fixed and removed unneeded things in teTeX-1.0-texmfcnf.patch,
  according to Thomas Esser suggestions.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>930193200</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Giuseppe GhibÃ² &lt;ghibo@caesar.polito.it&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- fixed new bugs reported by Thomas Esser (included
  patch 1.0.5-1.0.6-pre).
- added amstex, bamstex and bplain to the list of format files to build.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>930366000</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Giuseppe GhibÃ² &lt;ghibo@caesar.polito.it&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- mandrake adaptions.
- speed up TEXMFCNF path.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>930452400</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Giuseppe GhibÃ² &lt;ghibo@caesar.polito.it&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- upgraded to teTeX 1.0 final.
- removed texmf.cnf external config file, and provided
  as patch.
- removed ``texconfig init&apos;&apos; (now it&apos;s included into &apos;make install&apos;).
- moved texmf unpacking to buildroot before &apos;make install&apos;.
- added italian hyphenation.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>929329200</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Giuseppe GhibÃ² &lt;ghibo@caesar.polito.it&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- upgraded to teTeX 1.0.5.
- merged .spec file with Jeff Johnson&apos;s 1.0.1 .spec file from rawhide.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>929934000</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Giuseppe GhibÃ² &lt;ghibo@linux-mandrake.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- cleaned %clean. Now spec file support buildroot.
- added support for &apos;resolution&apos; in dvi-to-ps.fpi as well as
  the config.generic file.
- fixed a problem in manpage links (reported by Dusan
  Gabrijelcic &lt;dusan@kamra.e5.ijs.si&gt;).</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>935636400</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Giuseppe GhibÃ² &lt;ghibo@linux-mandrake.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- fine tuning subpackage package list.
- added teTeX dependence to package xdvi (it cannot works without fonts).</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>935722800</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Giuseppe GhibÃ² &lt;ghibo@linux-mandrake.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- fixed VARTEXFONTS path in config file.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>933822000</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Giuseppe GhibÃ² &lt;ghibo@linux-mandrake.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- mark also config.pdf, config.www and config.generic as %config.
- added BuildPreReq.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>942375600</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Giuseppe GhibÃ² &lt;ghibo@mandrakesoft.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- updated to version 1.0.7.
- merged k6 and arm patches into teTeX-1.0-arch.patch
- sligtly increased internal array main_memory, so that latex
  doesn&apos;t have problems with big macro packages such as pstricks
  or Xy-TeX.
- integrate teTeX-1.0-tektrokix.patch (fixes a typo) from Jeff
  Johnson &lt;jbj@redhat.com&gt;.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>950324400</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Giuseppe GhibÃ² &lt;ghibo@mandrakesoft.com&gt; 1.0.7-5mdk</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- changed arrays texmf.cnf the array value for jadetex, pdfjadetex, according to  the Christoph, Rahtz, Pepping&apos;s &quot;Installing JadeTeX&quot; document.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>957063600</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Giuseppe GhibÃ² &lt;ghibo@mandrakesoft.com&gt; 1.0.7-7mdk</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- updated the LaTeX hyperref package to version 6.70f for getting jadetex
  working.
- added support for spanish, portuguese and sweden pattern hyphenation in the
  default LaTeX format files (hope trie values are enough...).</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>960001200</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Giuseppe GhibÃ² &lt;ghibo@mandrakesoft.com&gt; 1.0.7-8mdk</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- increased trie size for allowing more hyphenation patterns (i18n).</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>967258800</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>ISHIKAWA Mutsumi &lt;ishikawa@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Japanese enbaled</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>967172400</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>ISHIKAWA Mutsumi &lt;ishikawa@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- rebuilt on RedHat7.0 again</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>967604400</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Jakub Jelinek &lt;jakub@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Rebuild with new C++</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>962593200</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Jeff Johnson &lt;jbj@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Create tetex-fonts to remove dependendency of xdvi on main tetex package.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>936414000</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Jeff Johnson &lt;jbj@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Integrate Giuseppe&apos;s latest. Thanks for the fixes!</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>936068400</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Jeff Johnson &lt;jbj@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Sync with Mandrake (tetex-1.0.7-2mdk).
- update to teTeX-texmf-1.0.2.tar.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>953607600</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Jeff Johnson &lt;jbj@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- build for Red Hat 6.2 (and sync with Mandrake tetex-1.0.6-6mdk).
- always apply AMD K6 patch; won&apos;t hurt, and removes platform dependency.
- spelling correction (#7085).</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>947991600</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Jeff Johnson &lt;jbj@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- build root</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>903409200</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Jeff Johnson &lt;jbj@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- compress man pages.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>949978800</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Jeff Johnson &lt;jbj@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- eliminate environment when running texhash (problem #849)</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>903754800</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Jeff Johnson &lt;jbj@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- make sub-packages depend on teTeX (problem #214)</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>903841200</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Jeff Johnson &lt;jbj@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- mark /usr/share/texmf/dvips/config/config.ps as %config (#4842).</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>936414000</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Jeff Johnson &lt;jbj@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- merge japanese changes (disabled for now, per msw@redhat.com).
- add support for Icelandic (Richard Allen &lt;ra@hp.is&gt;).</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>972010800</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Jeff Johnson &lt;jbj@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- move /usr/bin/mfw to tetex-xdvi to remove tetex dependence on XFree86.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>934945200</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Jeff Johnson &lt;jbj@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- rebuild for sparc baud rates &gt; 38400.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>952484400</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Jeff Johnson &lt;jbj@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- rebuild with VARTEXFONTS configured correctly.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>934772400</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Jeff Johnson &lt;jbj@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- sync with Mandrake version.
- Revert gcc296 patch, no longer needed.
- Enable i18n hyphenation for several languages (#11570,#17040).
- jadetex hash is now 50000 (#9092)
- create symlinks for Euler fonts (#9782).
- correct comment tetex.cron (#10022).
- unset TEXINPUTS in %build/%install (#10412).
- use Xaw3d rather than Xaw (#17415).
- insert thumbnails into pdflatex correctly (#19278).
- update to texi2html-1.64 (#20604).
- add latex2html (but not on ia64) (#16966).
- hacks to avoid accidental version clash with system libraries (#21263).
- rebuild with gcc-2.96-69 so that latex.fmt is built (#22838).</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>978145200</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Jeff Johnson &lt;jbj@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- update to 1.0.6.
- merge in Giuseppe GhibÃ² changes from mandrake package.
- dvi-to-ps.fpi: read postcript configuration settings (#3379).</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>934513200</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Jeff Johnson &lt;jbj@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- upgrade to 1.0.1.
- add buildroot translated texmfmain for install (#1719)
- mark /usr/share/texmf/xdvi/XDvi as %config (#1067)
- generate texmf.cnf and then merge in old conventions</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>928897200</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Jens Petersen &lt;petersen@redhat.com&gt; 1.0.7-29</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- fix dvipsk-j Makemake.in so that prologues install in right place (#52490)</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>999572400</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Kayvan A. Sylvan &lt;kayvan@sylvan.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- upgraded snapshot
- Fixed PATH setting for ``texconfig init&apos;&apos;. As it was, you could
  not build a working teTeX on a machine with tetex installed.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>928465200</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Masato Taruishi &lt;taru@debian.org&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Fixed xdvik-ja to work in 1.0.7 correctly.
- Added a Japanese fontdata for a Japanized dvipsk.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>967518000</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Matt Wilson &lt;msw@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- patched for NORETURN functions in gcc 2.96, rebuilt against new libstdc++</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>959828400</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Michael Fulbright &lt;msf@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Fixed dvi-to-ps.fpi to create temp files more safely.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>876884400</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Michael Fulbright &lt;msf@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Removed afmdoit from file list (mistakenly added in release 3 rpm)</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>860554800</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Michael Fulbright &lt;msf@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Upgraded to 0.4pl6, and fixed file permissions on /var/lib/texmf/texfonts
  so normal users could create fonts on demand.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>856234800</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Michael Fulbright &lt;msf@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Upgraded to 0.4pl7.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>857790000</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Michael Fulbright &lt;msf@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Upgraded to tetex-lib to 0.4pl8 and fixed cron tmpwatch entry to not
  delete /var/lib/texmf/fonts and /var/lib/texmf/texfonts</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>859258800</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Michael Maher &lt;mike@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- fixed BUG: 978</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>921553200</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Michael Maher &lt;mike@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- updated package</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>920862000</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Otto Hammersmith &lt;otto@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- added install-info support (dvips, fontname and kpathsea)
- combined the two changelogs in the spec file.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>886734000</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Preston Brown &lt;pbrown@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- noreplace *.cnf</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>961642800</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Preston Brown &lt;pbrown@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- use _infodir</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>961729200</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Preston Brown &lt;pbrown@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- wmconfig entry gone.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>950151600</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Prospector &lt;bugzilla@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- automatic rebuild</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>963457200</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Prospector System &lt;bugs@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- translations modified for de, fr, tr</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>894596400</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Tim Powers &lt;timp@redhat.com&gt; 1.0.7-30</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- rebuild to see if that tempfile in /usr/bin doesn&apos;t go away (possible build anomoly that can&apos;t be reproduced)</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>999918000</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Tim Waugh &lt;twaugh@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Turn on Japanese changes (bug #26249).
- Japanese support clashed with xaw3d patch; fixed up.
- Replace dvi-to-ps (rhs-printfilters) with mf40-tetex_filters
  (printconf).  Create testpage.dvi (from tex/latex/base/testpage.tex).
- Default to lj instead of cx in gray.mf and black.mf (bug #25988).
- Build requires VFlib2-devel.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>981514800</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Tim Waugh &lt;twaugh@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Update tetex-dvilj description.
- Patch latex2html to support tabularx environments better (bug #24852).
- Make xdvi work with files that end in &apos;.&apos; (bug #11478).
- Mark ls-R as %ghost (bug #12275).
- Build requires w3c-libwww-devel.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>980391600</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Tim Waugh &lt;twaugh@redhat.com&gt; 1.0.7-14</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Update dvipsk-jpatch to p1.5d (fixes bug #32121).</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>985057200</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Tim Waugh &lt;twaugh@redhat.com&gt; 1.0.7-16</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Updated texinfo translation files (bug #8682).
- Make tetex-dvips require psutils (bug #13216).
- Don&apos;t ship backup file from cx patch.
- Make japanese.map work (bug #32134).
- Make xdvi prettier (bug #17415).
- Fix PDF images (bug #32703).</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>986871600</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Tim Waugh &lt;twaugh@redhat.com&gt; 1.0.7-17</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- More backup files not to ship (bug #35801).
- Remove the ^Z from picins.sty (bug #36497).
- Run updmap to get psfonts.map updated (bugs #17333, #37513).</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>989377200</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Tim Waugh &lt;twaugh@redhat.com&gt; 1.0.7-18</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Don&apos;t use PID in temporary file names for scripts (bug #41269).</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>990241200</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Tim Waugh &lt;twaugh@redhat.com&gt; 1.0.7-19</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Revert &apos;Run updmap to get psfonts.map updates&apos;, it breaks dvips
  completely (bug #42255).</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>990846000</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Tim Waugh &lt;twaugh@redhat.com&gt; 1.0.7-20</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- LaTeX 01/06/2000.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>992055600</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Tim Waugh &lt;twaugh@redhat.com&gt; 1.0.7-21</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Use Guiseppe GhibÃ²&apos;s texmf-gg archive.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>992314800</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Tim Waugh &lt;twaugh@redhat.com&gt; 1.0.7-22</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- XDvi resources: mfmode back to cx (bug #44182).
- Patch from Oliver Paukstadt &lt;oliver.paukstadt@millenux.com&gt;:
  - ported to IBM zSeries (s390x, 64 bit)</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>992487600</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Tim Waugh &lt;twaugh@redhat.com&gt; 1.0.7-23</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Spec file clean-ups (texmf-gg includes LaTeX 01/06/2000).</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>992660400</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Tim Waugh &lt;twaugh@redhat.com&gt; 1.0.7-24</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Change Copyright: to License:.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>994474800</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Tim Waugh &lt;twaugh@redhat.com&gt; 1.0.7-25</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Build requires Xaw3d-devel (bug #49718).</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>996030000</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Tim Waugh &lt;twaugh@redhat.com&gt; 1.0.7-26</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Don&apos;t put texi2html.html in /usr/html (bug #50643).
- Newer Japanese dvipsk patch (bug #46785).
- Build Japanese-patched dvipsk as &apos;pdvips&apos; like SuSE (bug #46785).
- Don&apos;t apply patch 46, and hopefully fix bug #48842.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>996894000</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Tim Waugh &lt;twaugh@redhat.com&gt; 1.0.7-27</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- updmap is a config file (bug #50854).
- Use a different config.ps for pdvips (bug #48842).
- Run updmap in dvips/config and pdvips/config (bug #37513).
- Put pdvips-specific settings in texmf.cnf (various, incl. bug #48842).</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>997239600</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Tim Waugh &lt;twaugh@redhat.com&gt; 1.0.7-28</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Don&apos;t ship backup file texmf.cnf.pdvips (bug #52174).
- Actually ship the patched texmf.cnf file (bug #48842).
- Japanese xdvik patch version 1.04.
- Build Japanese-patched xdvik as &apos;pxdvik&apos; bug (bug #52089).</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>998449200</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Tim Waugh &lt;twaugh@redhat.com&gt; 1.0.7-31</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Choose a package for files owned by multiple packages (bug #51584).
- Updated pTeX to 2.1.11, using patch from MATSUURA Takanori (bug #51817).
- Updated pdftex to 0.14h (bug #48261, bug #46067, bug #52902).
- Run texconfig init again at the end of installation, to take account of
  things installed by hand (like pdftex).
- Don&apos;t run reautoconf; it shouldn&apos;t be needed anyway.
- Fix build problems arising when Japanese is disabled.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>1000782000</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Tim Waugh &lt;twaugh@redhat.com&gt; 1.0.7-32</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Fix up configure scripts for libwww detection in pxdvik.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>1001473200</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Tim Waugh &lt;twaugh@redhat.com&gt; 1.0.7-33</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Move XDvi app-defaults file to main package (bug #45865).
- Rebuild to fix bug #54336.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>1002510000</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Tim Waugh &lt;twaugh@redhat.com&gt; 1.0.7-34</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Adjust resource limits for pdfxmltex.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>1002682800</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Tim Waugh &lt;twaugh@redhat.com&gt; 1.0.7-35</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Set up TEXINPUTS for pdfxmltex.
- Own more directories (bug #51381, bug #54527).</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>1002942000</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Tim Waugh &lt;twaugh@redhat.com&gt; 1.0.7-36</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Rebuild in sane build environment (bug #54961).
- Enable HOMETEXMF (bug #55286).
- More texmf.cnf modifications for xmltex.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>1005015600</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Tim Waugh &lt;twaugh@redhat.com&gt; 1.0.7-37</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Update texdoc default helper applications (bug #55874).
- Make pxdvi generate fonts when they&apos;re missing (bug #55883).
- Mention &apos;texconfig&apos; in main package %description.
- Mark dvips config.* noreplace.
- Mark pdvips config files %config(noreplace).
- Sanity check the file lists.
- Set TEXMFLOCAL.
- Fix comment in tetex.cron (bug #56115).
- Adjust unused font removal time to 180 days (bug #56115).
- Add comment in texmf.cnf about how to use HOMETEXMF (bug #57063).</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>1005620400</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Tim Waugh &lt;twaugh@redhat.com&gt; 1.0.7-38</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Rebuild with new gcc.
- Don&apos;t specify system include directories explicitly.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>1007694000</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Tim Waugh &lt;twaugh@redhat.com&gt; 1.0.7-38.2</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Build in Red Hat Linux 7.2 environment.
- Put TEXMFLOCAL in the search path.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>1008126000</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Tim Waugh &lt;twaugh@redhat.com&gt; 1.0.7-38.4</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- Prevent insecure use of system() in dvips.
- Fix /var/lib/texmf/ls-R permissions.
- Build requires netpbm-progs.</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>1031367600</rhn-package-changelog-entry-time></rhn-package-changelog-entry><rhn-package-changelog-entry><rhn-package-changelog-entry-name>Trond Eivind GlomsrÃ¸d &lt;teg@redhat.com&gt;</rhn-package-changelog-entry-name><rhn-package-changelog-entry-text>- fix man pages in man, not man1
- use %{_tmppath}</rhn-package-changelog-entry-text><rhn-package-changelog-entry-time>964062000</rhn-package-changelog-entry-time></rhn-package-changelog-entry></rhn-package-changelog><rhn-package-requires><rhn-package-requires-entry version="4.0-1" sense="16777290" name="rpmlib(PayloadFilesHavePrefix)"/><rhn-package-requires-entry version="3.0.4-1" sense="16777290" name="rpmlib(CompressedFileNames)"/><rhn-package-requires-entry version="" sense="16384" name="/bin/sh"/><rhn-package-requires-entry version="" sense="16384" name="/usr/bin/perl"/></rhn-package-requires><rhn-package-provides><rhn-package-provides-entry version="1.0.7-38.4" sense="8" name="tetex-doc"/></rhn-package-provides><rhn-package-conflicts/><rhn-package-obsoletes/><rhn-package-files><rhn-package-file checksum-type="md5" checksum="3c9038d64545ef9c3f493efdd07e6899" inode="2982425" device="2304" mtime="890178801" flags="0" name="/usr/share/texmf/doc/Makefile" file_size="101" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="66d0d42997deceb2d271eec973ff3f72" inode="2982476" device="2304" mtime="783020248" flags="0" name="/usr/share/texmf/doc/README" file_size="577" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="1231489" device="2304" mtime="855846948" flags="0" name="/usr/share/texmf/doc/amstex" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="44acaca4cb489c305960dc4496fb5f24" inode="1231493" device="2304" mtime="854501340" flags="0" name="/usr/share/texmf/doc/amstex/READ.ME" file_size="9244" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b01af2533a8f506900a11ab158142e46" inode="1231490" device="2304" mtime="855021288" flags="0" name="/usr/share/texmf/doc/amstex/amsguide.dvi" file_size="114792" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="acbfc75a4bf1fde68e87ce53d7cdd6b9" inode="1231492" device="2304" mtime="853019400" flags="0" name="/usr/share/texmf/doc/amstex/amstex.bug" file_size="22668" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="552cb90eebd776b2be7f485e2567c841" inode="1231491" device="2304" mtime="844012920" flags="0" name="/usr/share/texmf/doc/amstex/joyerr.tex" file_size="13910" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="1231494" device="2304" mtime="909264903" flags="0" name="/usr/share/texmf/doc/bibtex" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="1231495" device="2304" mtime="930415271" flags="0" name="/usr/share/texmf/doc/bibtex/base" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bd3c5520a504e60057e9c4da26d038bf" inode="1231496" device="2304" mtime="930415271" flags="0" name="/usr/share/texmf/doc/bibtex/base/README" file_size="294" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5edce75a2d50726f6ac8738bf3483147" inode="1231499" device="2304" mtime="773278962" flags="0" name="/usr/share/texmf/doc/bibtex/base/bibshare" file_size="2783" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2ccd43c3a9641ec01ce32f9bfe1e1101" inode="1231500" device="2304" mtime="711646318" flags="0" name="/usr/share/texmf/doc/bibtex/base/btxdoc.bib" file_size="2306" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b36915eb59773c92520254be6e05a1bb" inode="1231501" device="2304" mtime="800804220" flags="0" name="/usr/share/texmf/doc/bibtex/base/btxdoc.dvi" file_size="53592" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f37a9df86abaf231b598a42ad2c403ec" inode="1231502" device="2304" mtime="711646322" flags="0" name="/usr/share/texmf/doc/bibtex/base/btxdoc.tex" file_size="41569" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0b1cc2c6af407e7197797ddc4013a6f6" inode="1231497" device="2304" mtime="800804255" flags="0" name="/usr/share/texmf/doc/bibtex/base/btxhak.dvi" file_size="33120" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="daf206448e421ce87cf3998920160a0f" inode="1231498" device="2304" mtime="711646327" flags="0" name="/usr/share/texmf/doc/bibtex/base/btxhak.tex" file_size="25553" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3111897" device="2304" mtime="946946583" flags="0" name="/usr/share/texmf/doc/context" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3113023" device="2304" mtime="946946583" flags="0" name="/usr/share/texmf/doc/context/base" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0f1d9afb8de136330ec20e39e905b9b8" inode="3113030" device="2304" mtime="898722000" flags="0" name="/usr/share/texmf/doc/context/base/1998-001.pdf" file_size="481607" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b6fc7963762918bc207665d6c8344bf3" inode="3113029" device="2304" mtime="939234046" flags="0" name="/usr/share/texmf/doc/context/base/context.rme" file_size="1372" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a7c02e65e9f58bb1b48742b8f1e6da11" inode="3113026" device="2304" mtime="944024954" flags="0" name="/usr/share/texmf/doc/context/base/minstall.pdf" file_size="86492" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7bd6c33d3f32f1fb41572b47530f03d3" inode="3113024" device="2304" mtime="939224020" flags="0" name="/usr/share/texmf/doc/context/base/mreadme.pdf" file_size="73809" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="896d3556447fbb162cff0fb437c8b1f4" inode="3113027" device="2304" mtime="902890958" flags="0" name="/usr/share/texmf/doc/context/base/ms-cb-en.pdf" file_size="2823070" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="402cc9f2248d568c37a9af89ca53326c" inode="3113028" device="2304" mtime="922568912" flags="0" name="/usr/share/texmf/doc/context/base/readme.pdf" file_size="149965" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f85abad01fe67ef41ab3854c917a3d0e" inode="3113031" device="2304" mtime="902779326" flags="0" name="/usr/share/texmf/doc/context/base/setup-en.pdf" file_size="322561" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3064226" device="2304" mtime="922752893" flags="0" name="/usr/share/texmf/doc/context/ppchtex" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1371ce392ac7f36d66d9c20d1e42e0ec" inode="3064227" device="2304" mtime="894051720" flags="0" name="/usr/share/texmf/doc/context/ppchtex/mp-ch-en.pdf" file_size="773238" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="14fa803b281d58ff73378cd30f435467" inode="3113032" device="2304" mtime="922753011" flags="0" name="/usr/share/texmf/doc/context/subset.rme" file_size="422" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3352810" device="2304" mtime="934161442" flags="0" name="/usr/share/texmf/doc/cyrplain" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d2cd8fa7c654d6a358a2f4bc0c4c4049" inode="3358556" device="2304" mtime="932862180" flags="0" name="/usr/share/texmf/doc/cyrplain/README" file_size="4219" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="575e0c12ffa96546451e46e38758d460" inode="3358557" device="2304" mtime="924239220" flags="0" name="/usr/share/texmf/doc/cyrplain/makefmts.sh" file_size="214" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3783718" device="2304" mtime="886464042" flags="0" name="/usr/share/texmf/doc/eplain" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="443a5b8d0e8ab1375bac0c48ab9f3d2a" inode="3783719" device="2304" mtime="886464030" flags="0" name="/usr/share/texmf/doc/eplain/eplain.dvi" file_size="370948" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3358558" device="2304" mtime="889757547" flags="0" name="/usr/share/texmf/doc/etex" file_size="4096" groupname="root" linkto="" rdev="909" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3831131" device="2304" mtime="928111589" flags="0" name="/usr/share/texmf/doc/etex/base" file_size="4096" groupname="root" linkto="" rdev="911" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a127c3a8599d11a8bef0f6ed8313ed6d" inode="3831132" device="2304" mtime="899065043" flags="0" name="/usr/share/texmf/doc/etex/base/etex-man.dvi" file_size="68492" groupname="root" linkto="" rdev="912" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bb111ebaea7699726fd4b068eb6b7767" inode="3831133" device="2304" mtime="928111691" flags="0" name="/usr/share/texmf/doc/etex/base/etex-man.pdf" file_size="204476" groupname="root" linkto="" rdev="2816" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="1231484" device="2304" mtime="923184274" flags="0" name="/usr/share/texmf/doc/fontinst" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="1231485" device="2304" mtime="923184274" flags="0" name="/usr/share/texmf/doc/fontinst/base" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2a57558a0fcf920c202ea1c3acb28ebe" inode="1231488" device="2304" mtime="899830680" flags="0" name="/usr/share/texmf/doc/fontinst/base/CHANGES" file_size="31817" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="dd600e2107c7372bbaf0c1268475f289" inode="1231487" device="2304" mtime="899828520" flags="0" name="/usr/share/texmf/doc/fontinst/base/fontinst.dvi" file_size="126352" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4752451f0e53eaed1a800a96089cc444" inode="1231486" device="2304" mtime="811227600" flags="0" name="/usr/share/texmf/doc/fontinst/base/roadmap.eps" file_size="8475" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3538435" device="2304" mtime="984184487" flags="0" name="/usr/share/texmf/doc/fonts" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3816419" device="2304" mtime="915694377" flags="0" name="/usr/share/texmf/doc/fonts/ae" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="361b6b837cad26c6900a926b62aada5f" inode="3816421" device="2304" mtime="911503020" flags="0" name="/usr/share/texmf/doc/fonts/ae/COPYING" file_size="18043" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4c421d90348be6c54d4770216e9a0f0e" inode="3816420" device="2304" mtime="912787560" flags="0" name="/usr/share/texmf/doc/fonts/ae/README" file_size="1156" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="380171c66d1ea3a36f54aa0de72ce1b4" inode="3816422" device="2304" mtime="905017852" flags="0" name="/usr/share/texmf/doc/fonts/ae/README2" file_size="390" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3831134" device="2304" mtime="922841645" flags="0" name="/usr/share/texmf/doc/fonts/amsfonts" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0a841bc0ac58f32faf5c4268823583f9" inode="3831137" device="2304" mtime="791698755" flags="0" name="/usr/share/texmf/doc/fonts/amsfonts/amsfndoc.dvi" file_size="146636" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c4670222265e511c7c2f3eef8979e23f" inode="3831138" device="2304" mtime="882207900" flags="0" name="/usr/share/texmf/doc/fonts/amsfonts/amsfonts.bug" file_size="8741" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e3395a791c08a7d99c377c660080d329" inode="3831139" device="2304" mtime="876084348" flags="0" name="/usr/share/texmf/doc/fonts/amsfonts/amsfonts.dvi" file_size="18908" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="83fe3f0c172e9d8159dd2b58ebd2d987" inode="3831140" device="2304" mtime="853297200" flags="0" name="/usr/share/texmf/doc/fonts/amsfonts/amsfonts.faq" file_size="6229" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d37ba96e07325ff39a22a8b2fc8066c8" inode="3831136" device="2304" mtime="876084351" flags="0" name="/usr/share/texmf/doc/fonts/amsfonts/eufrak.dvi" file_size="5292" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8f59bc37c770a068b44c60c8d6393dc1" inode="3831135" device="2304" mtime="876084354" flags="0" name="/usr/share/texmf/doc/fonts/amsfonts/euscript.dvi" file_size="6036" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="2555192" device="2304" mtime="949259993" flags="0" name="/usr/share/texmf/doc/fonts/belleek" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="41bf54d3394bba94416e460d49f7c29c" inode="2555193" device="2304" mtime="949259993" flags="0" name="/usr/share/texmf/doc/fonts/belleek/README" file_size="1570" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="2702509" device="2304" mtime="908061417" flags="0" name="/usr/share/texmf/doc/fonts/bluesky" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="30cdb9ff40f1d26a49663dab5dbfed2e" inode="2702580" device="2304" mtime="857269190" flags="0" name="/usr/share/texmf/doc/fonts/bluesky/readme" file_size="3206" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="2555199" device="2304" mtime="949166246" flags="0" name="/usr/share/texmf/doc/fonts/cbgreek" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="dafbd33f5193385e63382ca7129e7694" inode="2555200" device="2304" mtime="943539720" flags="0" name="/usr/share/texmf/doc/fonts/cbgreek/cbgreek.txt" file_size="11829" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3618735" device="2304" mtime="919362262" flags="0" name="/usr/share/texmf/doc/fonts/cc-pl" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9230b289e2ab7fe284864330b2ca7241" inode="3618736" device="2304" mtime="897364920" flags="0" name="/usr/share/texmf/doc/fonts/cc-pl/00readme" file_size="2824" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="2982426" device="2304" mtime="905018446" flags="0" name="/usr/share/texmf/doc/fonts/cm" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f3c7b3737e14de20b797f4dc34dcd460" inode="2982427" device="2304" mtime="741162635" flags="0" name="/usr/share/texmf/doc/fonts/cm/README" file_size="3607" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3914530" device="2304" mtime="919648133" flags="0" name="/usr/share/texmf/doc/fonts/cmbright" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6e6018482a638b1c7ec1a22cf9ca6d85" inode="3914531" device="2304" mtime="913403710" flags="0" name="/usr/share/texmf/doc/fonts/cmbright/README" file_size="13913" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="54ff30c51c36740e636dacf87671ab11" inode="3914532" device="2304" mtime="926896489" flags="0" name="/usr/share/texmf/doc/fonts/cmbright/cmbright.dvi" file_size="26916" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3618737" device="2304" mtime="905097372" flags="0" name="/usr/share/texmf/doc/fonts/dstroke" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3b52656e3f8477f408bcc7dd794c1dec" inode="3618739" device="2304" mtime="905097319" flags="0" name="/usr/share/texmf/doc/fonts/dstroke/dsdoc.dvi" file_size="14112" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d5e9d89018ecd7f897f599f4674a88d5" inode="3618738" device="2304" mtime="905097372" flags="0" name="/usr/share/texmf/doc/fonts/dstroke/readme" file_size="4039" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="2459199" device="2304" mtime="918957888" flags="0" name="/usr/share/texmf/doc/fonts/ec" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="98563f1462496cf798058b7b1ef502fe" inode="2459200" device="2304" mtime="917972570" flags="0" name="/usr/share/texmf/doc/fonts/ec/changelog" file_size="11775" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7f06a4706b69c6168e39effb5aebcd32" inode="2459204" device="2304" mtime="917845956" flags="0" name="/usr/share/texmf/doc/fonts/ec/description" file_size="3897" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fb9e9fce1b778774e0a52edc74fb2381" inode="2459205" device="2304" mtime="916899153" flags="0" name="/usr/share/texmf/doc/fonts/ec/readme.2_0" file_size="3518" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="07a7eec378fa207cc564b9c7f97d8d78" inode="2459201" device="2304" mtime="916899153" flags="0" name="/usr/share/texmf/doc/fonts/ec/release.2_3" file_size="1096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9d3b6cd543fa615581bf2cb09337d527" inode="2459202" device="2304" mtime="916899153" flags="0" name="/usr/share/texmf/doc/fonts/ec/release.2_4" file_size="778" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1218badcba2baae0f3483278d9c4f09e" inode="2459203" device="2304" mtime="917972536" flags="0" name="/usr/share/texmf/doc/fonts/ec/release.2_5" file_size="1817" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3914527" device="2304" mtime="920635199" flags="0" name="/usr/share/texmf/doc/fonts/ecc" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4eaa4dac05cf8e34ad3738674c8ec0e6" inode="3914529" device="2304" mtime="920406138" flags="0" name="/usr/share/texmf/doc/fonts/ecc/liesmich" file_size="5321" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a2fde2cf4d5a521b4a9888aeba9ad43e" inode="3914528" device="2304" mtime="920406086" flags="0" name="/usr/share/texmf/doc/fonts/ecc/readme" file_size="4372" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="2818946" device="2304" mtime="934155379" flags="0" name="/usr/share/texmf/doc/fonts/fontname" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="34b63d1f5028e3ddd30a07764b189407" inode="2818949" device="2304" mtime="915425760" flags="0" name="/usr/share/texmf/doc/fonts/fontname/ChangeLog" file_size="15233" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ff6ecd4519ed8bf747e6b5728ef325e2" inode="2818947" device="2304" mtime="899355420" flags="0" name="/usr/share/texmf/doc/fonts/fontname/README" file_size="696" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d4352aa319fad29f4f4e13c3bb820f7b" inode="2818948" device="2304" mtime="934155128" flags="0" name="/usr/share/texmf/doc/fonts/fontname/fontname.dvi" file_size="687444" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="2555197" device="2304" mtime="936381072" flags="0" name="/usr/share/texmf/doc/fonts/hoekwater" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4d629d4c568fe3dbc57bc71998bec581" inode="2555198" device="2304" mtime="936381072" flags="0" name="/usr/share/texmf/doc/fonts/hoekwater/README" file_size="1305" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="2830165" device="2304" mtime="909264655" flags="0" name="/usr/share/texmf/doc/fonts/lucidabr" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9012e9c1189099ad568c5ad84a162b9d" inode="2833273" device="2304" mtime="855004170" flags="0" name="/usr/share/texmf/doc/fonts/lucidabr/ly1.txt" file_size="6792" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="2410147" device="2304" mtime="1031330502" flags="0" name="/usr/share/texmf/doc/fonts/marvosym" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6102fcc7aef7db9957a094cfffec4455" inode="2410149" device="2304" mtime="900903600" flags="0" name="/usr/share/texmf/doc/fonts/marvosym/PROBLEMS" file_size="740" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d8f9a3fada5fa5bab06ba4871716a858" inode="2410152" device="2304" mtime="900903600" flags="0" name="/usr/share/texmf/doc/fonts/marvosym/README.1st" file_size="1262" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="2410148" device="2304" mtime="1031330502" flags="0" name="/usr/share/texmf/doc/fonts/marvosym/astro.README" file_size="10" groupname="root" linkto="README.1st" rdev="0" verifyflags="-1" file_mode="-24065" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="2410151" device="2304" mtime="1031330502" flags="0" name="/usr/share/texmf/doc/fonts/marvosym/euro.README" file_size="10" groupname="root" linkto="README.1st" rdev="0" verifyflags="-1" file_mode="-24065" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a0c5441ffbdbebb6aaef950d6a078d30" inode="2410150" device="2304" mtime="905106662" flags="0" name="/usr/share/texmf/doc/fonts/marvosym/marvodoc.dvi" file_size="10808" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="2555194" device="2304" mtime="791174069" flags="0" name="/usr/share/texmf/doc/fonts/oldgerman" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1a7712dcac8c6d69e4cead266acf3490" inode="2555195" device="2304" mtime="782112978" flags="0" name="/usr/share/texmf/doc/fonts/oldgerman/corkpaper.dvi" file_size="35036" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3ca501b5d5d4d642a6f9cbe1dbb23530" inode="2555196" device="2304" mtime="782112980" flags="0" name="/usr/share/texmf/doc/fonts/oldgerman/suet.dvi" file_size="3876" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3701947" device="2304" mtime="924994752" flags="0" name="/usr/share/texmf/doc/fonts/pl" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7b8e5ae4f21ca020f2b579f5a76d027f" inode="3701954" device="2304" mtime="876549900" flags="0" name="/usr/share/texmf/doc/fonts/pl/readme.eng" file_size="11246" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="21a93d0c0d4f2dbe348b55b550a943d6" inode="3701955" device="2304" mtime="876549900" flags="0" name="/usr/share/texmf/doc/fonts/pl/readme.pol" file_size="14868" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="2459206" device="2304" mtime="934158404" flags="0" name="/usr/share/texmf/doc/generic" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3618740" device="2304" mtime="984183724" flags="0" name="/usr/share/texmf/doc/generic/babel" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a64804dc06b974f935861527d9177a31" inode="3618744" device="2304" mtime="982891800" flags="0" name="/usr/share/texmf/doc/generic/babel/00readme.txt" file_size="2712" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="df32d3f9613d332660d4acd3de608309" inode="3618741" device="2304" mtime="923115600" flags="0" name="/usr/share/texmf/doc/generic/babel/GreekFonts.txt" file_size="957" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e04fffe3648b77b43ff13118d36debcb" inode="3618749" device="2304" mtime="980915160" flags="0" name="/usr/share/texmf/doc/generic/babel/bugs.txt" file_size="3186" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1b2a73cc16de0954eaa3a8b71eee6492" inode="3618755" device="2304" mtime="983851140" flags="0" name="/usr/share/texmf/doc/generic/babel/changes.txt" file_size="81861" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="dc330c40333f06cb87dcc8ccd145e7a6" inode="3618751" device="2304" mtime="983850840" flags="0" name="/usr/share/texmf/doc/generic/babel/fixes.txt" file_size="561" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b0a9397192d5b52af0829273cca7a3fa" inode="3618748" device="2304" mtime="980915160" flags="0" name="/usr/share/texmf/doc/generic/babel/howtoget.txt" file_size="1473" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b592dcd9a198e13886305340c277df95" inode="3618742" device="2304" mtime="984181708" flags="0" name="/usr/share/texmf/doc/generic/babel/tb1202.dvi" file_size="43388" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="69da0abf5e8b21c924778a9557002d05" inode="3618745" device="2304" mtime="984181707" flags="0" name="/usr/share/texmf/doc/generic/babel/tb1401.dvi" file_size="10044" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="834dfca94ba42fccf4057a02d56d1fc5" inode="3618753" device="2304" mtime="984181709" flags="0" name="/usr/share/texmf/doc/generic/babel/tb1604.dvi" file_size="20148" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c52007308b49291c793c3590f4727485" inode="3618747" device="2304" mtime="982891800" flags="0" name="/usr/share/texmf/doc/generic/babel/todo.txt" file_size="1729" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8115a5a82f76413bb210068c902a9863" inode="3618752" device="2304" mtime="982893780" flags="0" name="/usr/share/texmf/doc/generic/babel/user.dvi" file_size="169604" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="1231519" device="2304" mtime="839481814" flags="0" name="/usr/share/texmf/doc/generic/localloc" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="36047485be1e15133c0a3e6aac6e7f65" inode="1231520" device="2304" mtime="839481794" flags="0" name="/usr/share/texmf/doc/generic/localloc/localloc.dvi" file_size="37408" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3f7f65bfa4fedd4b9324f3818d8faf7c" inode="1231521" device="2304" mtime="839481685" flags="0" name="/usr/share/texmf/doc/generic/localloc/localtst.tex" file_size="3999" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3080582" device="2304" mtime="926183323" flags="0" name="/usr/share/texmf/doc/generic/pstricks" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="68ecd577a3fe7a5a82ba6ecf1ef2af1c" inode="3080586" device="2304" mtime="926183257" flags="0" name="/usr/share/texmf/doc/generic/pstricks/CHANGES" file_size="10272" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b4d669daac7ed36b1676774890cbb333" inode="3080584" device="2304" mtime="905381651" flags="0" name="/usr/share/texmf/doc/generic/pstricks/README" file_size="2087" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="730b0674b2c509fff5352c24a76d2100" inode="3080583" device="2304" mtime="926183257" flags="0" name="/usr/share/texmf/doc/generic/pstricks/VERSIONS" file_size="1804" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8f2c39f3196b5923a230c0e6590904fc" inode="3080585" device="2304" mtime="900376399" flags="0" name="/usr/share/texmf/doc/generic/pstricks/doc-fill.ps" file_size="979782" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3358566" device="2304" mtime="900376869" flags="0" name="/usr/share/texmf/doc/generic/pstricks/obsolete" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a8e8499dcac38bb08ce32a7b06c37b71" inode="3358571" device="2304" mtime="888454020" flags="0" name="/usr/share/texmf/doc/generic/pstricks/obsolete/README" file_size="913" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6a8b53f3cb37302dda651151f43d5bdb" inode="3358572" device="2304" mtime="735188400" flags="0" name="/usr/share/texmf/doc/generic/pstricks/obsolete/betadoc1.ps" file_size="186875" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c27c9c85a271e20c59fc87f06a79278b" inode="3358573" device="2304" mtime="735188400" flags="0" name="/usr/share/texmf/doc/generic/pstricks/obsolete/betadoc2.ps" file_size="239153" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bc5177c1334a34c284d6aefaa4425d0d" inode="3358575" device="2304" mtime="859694400" flags="0" name="/usr/share/texmf/doc/generic/pstricks/obsolete/pst-doc.err" file_size="2762" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="723ffbf7eac463097926f6f5dbf15828" inode="3358574" device="2304" mtime="858830400" flags="0" name="/usr/share/texmf/doc/generic/pstricks/obsolete/pst-quik.ps" file_size="57218" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="be8d7eff84203208b179f4e44fdf7981" inode="3358567" device="2304" mtime="858830400" flags="0" name="/usr/share/texmf/doc/generic/pstricks/obsolete/pst-usr1.ps" file_size="117506" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2c8a28b7726e21cc11874ac146553048" inode="3358568" device="2304" mtime="858830400" flags="0" name="/usr/share/texmf/doc/generic/pstricks/obsolete/pst-usr2.ps" file_size="128593" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="53e5123f1be7b3e5b5fc8d155764b691" inode="3358569" device="2304" mtime="858830400" flags="0" name="/usr/share/texmf/doc/generic/pstricks/obsolete/pst-usr3.ps" file_size="146106" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8c814f75fbf1e378f7c484e1d4e23c71" inode="3358570" device="2304" mtime="858830400" flags="0" name="/usr/share/texmf/doc/generic/pstricks/obsolete/pst-usr4.ps" file_size="109055" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="169906" device="2304" mtime="928721734" flags="0" name="/usr/share/texmf/doc/generic/ruhyphen" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4e4ef0deca74bbcecb63cfe7914a0492" inode="169907" device="2304" mtime="922033548" flags="0" name="/usr/share/texmf/doc/generic/ruhyphen/BUGS" file_size="1683" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8172e1e85001c87c45514e5dca40cdec" inode="169908" device="2304" mtime="927340927" flags="0" name="/usr/share/texmf/doc/generic/ruhyphen/Makefile" file_size="163" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b20fe5e345a51d3268c906e7dc176b10" inode="169912" device="2304" mtime="928676465" flags="0" name="/usr/share/texmf/doc/generic/ruhyphen/README" file_size="11959" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="425c4db888756c2831cd6e8f7d9c9b36" inode="169916" device="2304" mtime="899661860" flags="0" name="/usr/share/texmf/doc/generic/ruhyphen/mkcyryo" file_size="691" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32275" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="31456a5d1eea57ec3e24147e9cf29494" inode="169914" device="2304" mtime="899661860" flags="0" name="/usr/share/texmf/doc/generic/ruhyphen/sorthyph" file_size="295" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32275" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="83c69583daa53b3a10e6fb6b5de31f9c" inode="169915" device="2304" mtime="902189394" flags="0" name="/usr/share/texmf/doc/generic/ruhyphen/sortkoi8" file_size="583" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32275" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d8009e2fc612de240a18237f92f95f14" inode="169910" device="2304" mtime="916280148" flags="0" name="/usr/share/texmf/doc/generic/ruhyphen/trans" file_size="419" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32275" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="1231516" device="2304" mtime="924216436" flags="0" name="/usr/share/texmf/doc/generic/styles" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e1d8fbc33bbb6a071242900e6b150c84" inode="1231517" device="2304" mtime="924216428" flags="0" name="/usr/share/texmf/doc/generic/styles/gerdoc.dvi" file_size="83212" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6b3ba02ad4b71ec02cf1c714ed774686" inode="1231518" device="2304" mtime="905103772" flags="0" name="/usr/share/texmf/doc/generic/styles/germdoc.dvi" file_size="79368" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="447910" device="2304" mtime="890591072" flags="0" name="/usr/share/texmf/doc/generic/texdraw" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="56920bec8980d5540037c05b7a7c2f72" inode="447912" device="2304" mtime="819412635" flags="0" name="/usr/share/texmf/doc/generic/texdraw/ChangeLog" file_size="1108" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f235afeb6cb34223ebc7f6e1b119dea5" inode="447913" device="2304" mtime="890177588" flags="0" name="/usr/share/texmf/doc/generic/texdraw/texdraw.ps" file_size="427763" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="20e97a3facc8f4d0065f0eae499604db" inode="447911" device="2304" mtime="819412619" flags="0" name="/usr/share/texmf/doc/generic/texdraw/txdexamp.latex" file_size="14681" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="1231503" device="2304" mtime="949319875" flags="0" name="/usr/share/texmf/doc/generic/ukrhyph" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="430de44ff992511b5e74506b1cab0646" inode="1231506" device="2304" mtime="933455760" flags="0" name="/usr/share/texmf/doc/generic/ukrhyph/README" file_size="4414" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="168110f426160e71432474b6a0932dc3" inode="1231510" device="2304" mtime="931276880" flags="0" name="/usr/share/texmf/doc/generic/ukrhyph/rules.ps" file_size="79932" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="eea222655a28c8ef1e37bbe705fd036f" inode="1231509" device="2304" mtime="931276928" flags="0" name="/usr/share/texmf/doc/generic/ukrhyph/rules.tex" file_size="5313" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="dec4127d6674c56e934e279ab9d8b76e" inode="1231504" device="2304" mtime="933455880" flags="0" name="/usr/share/texmf/doc/generic/ukrhyph/rules60.pdf" file_size="106565" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9f161911b776286e939d8760bb0abf1a" inode="1231511" device="2304" mtime="933456000" flags="0" name="/usr/share/texmf/doc/generic/ukrhyph/rules60.ps" file_size="111402" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="14b7b5348dbee91600a6cd5a6fa41676" inode="1231505" device="2304" mtime="933463265" flags="0" name="/usr/share/texmf/doc/generic/ukrhyph/rules60.tex" file_size="7667" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2335d3ad28c79eb8694c5b13227ebc43" inode="1231507" device="2304" mtime="933455940" flags="0" name="/usr/share/texmf/doc/generic/ukrhyph/rules90.pdf" file_size="105735" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="159ac22960e6aea3759c874d2a656876" inode="1231512" device="2304" mtime="933456000" flags="0" name="/usr/share/texmf/doc/generic/ukrhyph/rules90.ps" file_size="77929" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="961acc813419cb275fd5979c04dabba6" inode="1231508" device="2304" mtime="933463277" flags="0" name="/usr/share/texmf/doc/generic/ukrhyph/rules90.tex" file_size="5581" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="043639c3b402ec367b732d43d62246b4" inode="1231513" device="2304" mtime="933455820" flags="0" name="/usr/share/texmf/doc/generic/ukrhyph/rules_ph.pdf" file_size="70816" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="166cfdb4222d59b492507059de87a216" inode="1231515" device="2304" mtime="933455940" flags="0" name="/usr/share/texmf/doc/generic/ukrhyph/rules_ph.ps" file_size="76256" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="29f86affd98d5525e01077aeddce56ac" inode="1231514" device="2304" mtime="933463256" flags="0" name="/usr/share/texmf/doc/generic/ukrhyph/rules_ph.tex" file_size="3632" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="2818950" device="2304" mtime="920340090" flags="0" name="/usr/share/texmf/doc/generic/xypic" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3e90ad859c815aabfd33b8e8f268b7a5" inode="2818955" device="2304" mtime="919193100" flags="0" name="/usr/share/texmf/doc/generic/xypic/CATALOG" file_size="929" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8ca43cbc842c2336e835926c2166c28b" inode="2818957" device="2304" mtime="919195320" flags="0" name="/usr/share/texmf/doc/generic/xypic/COPYING" file_size="17982" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4e9c02da8460acebaefab52345503889" inode="2818958" device="2304" mtime="919968180" flags="0" name="/usr/share/texmf/doc/generic/xypic/MANIFEST" file_size="9111" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="719ae80819234ab91205db9087590f5a" inode="2818952" device="2304" mtime="919193100" flags="0" name="/usr/share/texmf/doc/generic/xypic/README" file_size="4025" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c68e1b64bff41d8e2381012656b26431" inode="2818953" device="2304" mtime="919193100" flags="0" name="/usr/share/texmf/doc/generic/xypic/TRAILER" file_size="4176" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d28aaeff8978418785fde92f3fb04c6b" inode="2818951" device="2304" mtime="919968180" flags="0" name="/usr/share/texmf/doc/generic/xypic/VERSIONS" file_size="5848" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a857d6e13fed9b70065bc894661ddf19" inode="2818954" device="2304" mtime="920340020" flags="0" name="/usr/share/texmf/doc/generic/xypic/xyguide.ps" file_size="669930" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="53b15c3f7690a20762ef88805c630edf" inode="2818956" device="2304" mtime="920340030" flags="0" name="/usr/share/texmf/doc/generic/xypic/xyrefer.ps" file_size="1861099" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3718299" device="2304" mtime="949400459" flags="0" name="/usr/share/texmf/doc/help" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="2670227" device="2304" mtime="949401548" flags="0" name="/usr/share/texmf/doc/help/Catalogue" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="05edf82e7aca32b5c99b388f3813e5dc" inode="2670350" device="2304" mtime="927169200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/README" file_size="1457" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2f776da75e208974b55613a7d953a8ec" inode="2670354" device="2304" mtime="941540160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/acroread.png" file_size="247" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d4ddf47edf7577cc8a4f29dd649868a5" inode="2672590" device="2304" mtime="949333980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/alpha.html" file_size="85898" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2c3cf290e08e565bee1f257ab3c76e99" inode="2672600" device="2304" mtime="941540160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/art.png" file_size="1105" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0a7aedbd53cc34fe54d965c448b9bd7d" inode="2672575" device="2304" mtime="941540160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/au.png" file_size="281" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="25375e7409fea201b249cb2ec585dd57" inode="2672596" device="2304" mtime="949333920" flags="0" name="/usr/share/texmf/doc/help/Catalogue/brief.html" file_size="321193" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b3a6c60420972ba61df87b420e2b9440" inode="2672574" device="2304" mtime="929535480" flags="0" name="/usr/share/texmf/doc/help/Catalogue/catalogue.dtd" file_size="3426" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="45d8987c78be5e93f6aadb130f0ae3fc" inode="2670352" device="2304" mtime="949065180" flags="0" name="/usr/share/texmf/doc/help/Catalogue/catalogue.html" file_size="7628" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="189a8729320118be3476f38aeb70bdbe" inode="2672577" device="2304" mtime="941540160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/ch.png" file_size="135" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e0b8c683a38f9a2b2726f845a70b1ac6" inode="2672579" device="2304" mtime="941540160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/cz.png" file_size="292" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0226b96e0eef74431740b10aedaf8e95" inode="2672578" device="2304" mtime="941540160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/de.png" file_size="136" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a45f434d56022e1b62f6c8e906aa9350" inode="2670347" device="2304" mtime="941540160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/dir.png" file_size="191" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c197b14bdf7406d5a8cea69ca0e6b1b1" inode="2670349" device="2304" mtime="941540160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/doc.png" file_size="240" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="2670355" device="2304" mtime="949400179" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries" file_size="28672" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="677e40ae1408bd1512a076341e29a8e6" inode="2671785" device="2304" mtime="941535600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/a0poster.html" file_size="2196" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="33dd5cff24b54de76971d3fd0d0a48f9" inode="2671862" device="2304" mtime="941535660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/a2ac.html" file_size="2165" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f752b8757d66956fab9a0ca577405d40" inode="2672442" device="2304" mtime="941535660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/a4.html" file_size="2420" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bce7e57b6cbcbaf3606924ab8f8129e4" inode="2671942" device="2304" mtime="941535660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/a4wide.html" file_size="1984" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5cefa0b36690bfe6ea55ea1de4436c17" inode="2672455" device="2304" mtime="941535660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/a5.html" file_size="1811" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="425278c4e53e472f4b38dbc519f6f073" inode="2671521" device="2304" mtime="941535660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/a5comb.html" file_size="1746" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="39753d914e7f50e48d159b7ba35468b8" inode="2672333" device="2304" mtime="941537940" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/aaai.html" file_size="1790" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5e8cc1341d72ae0d50c741270a0e8bc9" inode="2672183" device="2304" mtime="941537940" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/aastex.html" file_size="1885" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a31117e5560b03af6e11996b7701aee9" inode="2671571" device="2304" mtime="941538000" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/abbrevs.html" file_size="2807" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4c060285b16573225ea4fd6a2b4bdcb9" inode="2671445" device="2304" mtime="941538000" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/abc2mtex.html" file_size="2364" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0738e1e90906e707adbd784ca34536a3" inode="2671859" device="2304" mtime="941538000" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/abstbook.html" file_size="2051" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0dad629589d204bbf0f3f6f7586e7e95" inode="2671890" device="2304" mtime="941538000" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/abstyles.html" file_size="1311" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="18b54e0c21e44e09bd8e4cafd08a5b48" inode="2672228" device="2304" mtime="941538000" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/accents.html" file_size="1852" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="65db30cf0e99fb0188972ce78ba40df6" inode="2672429" device="2304" mtime="941661720" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/accfonts.html" file_size="1854" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="70b16b3fb71a52ed38206e8ddcbb2609" inode="2671620" device="2304" mtime="941538000" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/achemso.html" file_size="1871" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="98d989002b7883871b415e2bf672494e" inode="2672224" device="2304" mtime="941538000" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/achicago-bst.html" file_size="2518" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1499e52ec08cda85a998cc5d4fe17548" inode="2672310" device="2304" mtime="941538000" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/achicago.html" file_size="2458" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6c53859c7db7c91cf02903c70567ef17" inode="2672130" device="2304" mtime="941538000" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/acmconf.html" file_size="2034" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2e304286bc52de5fc09a4dab1e6fa79a" inode="2672375" device="2304" mtime="941538060" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/acronym.html" file_size="2059" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="28fb54a0efbda49a05aa7ae7299660d3" inode="2672008" device="2304" mtime="941538060" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/acroread.html" file_size="1876" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="91681133ea54238a040692bfb40f903c" inode="2672286" device="2304" mtime="941538060" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/acrotex.html" file_size="1503" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9ab9fe9636240fc98b3a4dccbdabac54" inode="2672112" device="2304" mtime="942750180" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/adfathesis.html" file_size="1918" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="49bee46f68c2871137b0d0813977364c" inode="2672089" device="2304" mtime="941538060" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/adobe.html" file_size="1690" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2c312a751f1d6110cad2590c11a3bb35" inode="2671574" device="2304" mtime="941538060" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/adobeother.html" file_size="1321" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6f7931645cf6e95bd7bfacfde7d18efb" inode="2671496" device="2304" mtime="941538060" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/adobestd.html" file_size="1315" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c20d23582df59c9a9d98928b85aff5be" inode="2671563" device="2304" mtime="941538060" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/adrlist.html" file_size="2027" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="344ee84972b4c1f446ff83b96f7b0e28" inode="2672255" device="2304" mtime="941538060" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/advdate.html" file_size="1977" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9ef8dfde71d219335428a770fffbce1f" inode="2672054" device="2304" mtime="948382980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ae.html" file_size="2031" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0cc9c80e68033d03f7c2438d9e283907" inode="2672118" device="2304" mtime="941538120" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/afterpage.html" file_size="2562" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="26eb78a81978829148669c8649481439" inode="2672472" device="2304" mtime="941538120" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/afthesis.html" file_size="1832" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ca2a2adc8eac79bd07b5811ed74ebb21" inode="2672013" device="2304" mtime="941538120" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/aguplus.html" file_size="1894" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="65d254da8a28494a2451c1da2883d47e" inode="2671986" device="2304" mtime="941538120" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/aiaa.html" file_size="2416" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bc294e4278ebe9b01165b18f88a3b7cf" inode="2672126" device="2304" mtime="941538120" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/akletter.html" file_size="2223" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="331908571b00b876524fdc0ea43a948b" inode="2671523" device="2304" mtime="941538120" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/alatex.html" file_size="2317" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="108edcfb050f002e4f00c37ef956edc5" inode="2672206" device="2304" mtime="941538120" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/alg.html" file_size="1998" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b34093b6919586d3f39162e1f2dba73d" inode="2672032" device="2304" mtime="941538120" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/algorithmic.html" file_size="1880" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="17ddd2ab0d7ee1a8bc0b96581361f24b" inode="2672194" device="2304" mtime="941538120" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/algorithms.html" file_size="1973" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="455c535b9ee77b88565e22407ca7727f" inode="2671606" device="2304" mtime="941538120" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/alltt.html" file_size="1940" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2a8608487f8a7397483a559581bd050d" inode="2672531" device="2304" mtime="941538180" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/alphalph.html" file_size="2053" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b492842f61b24119e06013c939f02d56" inode="2672517" device="2304" mtime="941538180" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/alphanum.html" file_size="1821" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d953848ac0f0db4f8053707fc170e94b" inode="2672505" device="2304" mtime="941538180" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/altfont.html" file_size="1978" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="83d3b71619e12dd60cda88144ab97857" inode="2671520" device="2304" mtime="941538180" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/amiweb2c.html" file_size="1770" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1ae8b8307eef3805fd3d82ac617495fb" inode="2672397" device="2304" mtime="941538180" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/amsbsy.html" file_size="2340" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="137c9eda6504f5f529c3c2ed14b87c42" inode="2671789" device="2304" mtime="941538180" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/amscd.html" file_size="1949" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c75c1590d4a20708eefbe2473ab30265" inode="2672201" device="2304" mtime="941538180" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/amsfonts.html" file_size="2377" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d59a0846558df32e5a56e80ef53bda12" inode="2672303" device="2304" mtime="944168940" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/amslatex.html" file_size="2406" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e866c4d42a1fc36feb07f0fb530849ec" inode="2672049" device="2304" mtime="941538180" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/amsltx11.html" file_size="2078" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="694752baaf1755c3d998e68568f6aae2" inode="2672302" device="2304" mtime="941538180" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/amsmath.html" file_size="2180" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="853de850d41f570ec427478d6e6b00a1" inode="2672338" device="2304" mtime="941538240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/amsppt.html" file_size="1723" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="276c2c93b662b92a8a580ec8bcbd2cb8" inode="2672454" device="2304" mtime="941538240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/amsppt1.html" file_size="1831" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="799cae42c6819e4276215b2dc5a23e64" inode="2672344" device="2304" mtime="941538240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/amssym.html" file_size="1983" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c2a34414ef7e8142e48c178873eca6fc" inode="2672141" device="2304" mtime="941538240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/amssymb.html" file_size="2110" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d8d2d9566c6b468897d0fc58af85a691" inode="2672167" device="2304" mtime="941538240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/amstex.html" file_size="1971" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fe53600edd3e2cbe9ffd0d43a2b6e963" inode="2672539" device="2304" mtime="941538240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/amstext.html" file_size="2193" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bb8e24fc618c297262b47d5770020a25" inode="2672044" device="2304" mtime="941538240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/answers.html" file_size="1980" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6d3fdad24ee45944d0aaf55142b07009" inode="2672225" device="2304" mtime="941538240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/anttvf.html" file_size="1963" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="500cf98951c132f77b684d9f7606212e" inode="2672562" device="2304" mtime="941538240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/antyktor.html" file_size="2111" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4e4e408af17a902989c227fb6afa52f9" inode="2671669" device="2304" mtime="941538240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/apa.html" file_size="2276" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0175255d90fdd7591de118966bf4882f" inode="2671833" device="2304" mtime="941538300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/apacite.html" file_size="1823" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e0634215e06598cefb8cb445a19f454c" inode="2671764" device="2304" mtime="941538300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/apasoft.html" file_size="1682" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d7684ea588a2cae18ecdc9c5fb3f0b3e" inode="2671828" device="2304" mtime="941538300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/apl.html" file_size="1736" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ff221f93136dceab4b9f2ce61a01b45c" inode="2672476" device="2304" mtime="941538300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/appendix.html" file_size="2243" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2c4101ede8a3df39701c2ccc13543119" inode="2672237" device="2304" mtime="941538300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ar.html" file_size="1989" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4b2ed0e3dfa7a18befab94030eb72650" inode="2672552" device="2304" mtime="941538300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/arabtex.html" file_size="2009" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="dc19dbcf8be25d7e1b830558eed80e11" inode="2672275" device="2304" mtime="941538300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/archaic.html" file_size="1934" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="455e06e76ccffbb7368a1195ff34f72a" inode="2672295" device="2304" mtime="941538300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/armenian.html" file_size="1967" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="97ecc03667a8ba1e6ecddbe1217f493c" inode="2671977" device="2304" mtime="941538300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/armtex.html" file_size="2021" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b956df5a3e0a16b4a3f5e6a46e2548e1" inode="2671628" device="2304" mtime="941538300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/arosgn.html" file_size="1759" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2e63aaabcc29cf1ad99f9afe31312788" inode="2672155" device="2304" mtime="941538360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/array.html" file_size="2049" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d90cc1081ce1c474d283a53771226a71" inode="2672160" device="2304" mtime="941538360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/arrow.html" file_size="1714" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7c08215fe0816a6b7f205a56cdc74029" inode="2671642" device="2304" mtime="941538360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/arydshln.html" file_size="2339" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="104dfaecb52b6a28d0a1eb7f997e83d6" inode="2672502" device="2304" mtime="941538360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/asaetr.html" file_size="1863" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3b6e60e047864d6e675770fdea4d6f89" inode="2672221" device="2304" mtime="941538360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ascelike.html" file_size="2096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e14f6e562cd91466517cb94674f516a0" inode="2671545" device="2304" mtime="941538360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ascii.html" file_size="1749" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7c45cf58475fa1a243949ac3e54de145" inode="2672261" device="2304" mtime="941538360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/astro.html" file_size="1779" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a8e15ea0347d5664b3ca73d927d93744" inode="2672264" device="2304" mtime="941538360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/at.html" file_size="2252" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3252ce327d17fff1c5a305eb9ef0d97c" inode="2671580" device="2304" mtime="941538360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/attrib.html" file_size="2322" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a06748789caf5dbdc1237375842a2eed" inode="2672037" device="2304" mtime="941538360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/auctex.html" file_size="1888" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="72b7efa0c73537978dc82fcf33b14672" inode="2672120" device="2304" mtime="941538420" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/auncial.html" file_size="1969" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="256330a881fa957f54cc1d61f833a9a3" inode="2672175" device="2304" mtime="941538420" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/aurora.html" file_size="1368" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0561f4a50f30792957e8a1e3a81527ac" inode="2671483" device="2304" mtime="941538420" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/authorindex.html" file_size="1891" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a07fcabf24d0f6e992ab3dabee0989fa" inode="2672024" device="2304" mtime="941538420" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/autotab.html" file_size="1823" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7ff0068061bd4e9f16b14a3ffc242fc2" inode="2672430" device="2304" mtime="941538420" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/babel.html" file_size="1841" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6d448687ebda127dd52f524d33f715ef" inode="2671893" device="2304" mtime="941538420" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/backgammon.html" file_size="1835" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b0a58bf6254c40a63dcd2aaa44b406ef" inode="2671439" device="2304" mtime="943522860" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/backgrnd.html" file_size="1948" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="570f66922ed1120d4f25c5c69f7af77b" inode="2672171" device="2304" mtime="941538420" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bakoma-fonts.html" file_size="1715" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7a8afb7e3edee413965afb1c1bbdfb47" inode="2671897" device="2304" mtime="941538420" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bakoma-malvern.html" file_size="2276" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="00882111c0ac738c5fdbacf44aebbc48" inode="2672036" device="2304" mtime="944655660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bakoma.html" file_size="2628" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8baec5688e959a2ea167e26ebdcac1da" inode="2672362" device="2304" mtime="941538420" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bar.html" file_size="1705" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9e869b788bf5f4febca031fe27ebd094" inode="2671500" device="2304" mtime="941538480" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/barcode2.html" file_size="1310" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="93f2d36af00f574747a601b5bdb05694" inode="2672475" device="2304" mtime="941538480" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/barcodes.html" file_size="1874" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="323cd5ffec28442b56997e664641502a" inode="2672528" device="2304" mtime="941538480" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/barr.html" file_size="1813" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="79a7423fdbda869227a1a72295e1e0b7" inode="2671516" device="2304" mtime="941538480" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/barracuda.html" file_size="2222" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ffba91ac6bb1bda3bda6dd3b5a84ab12" inode="2672497" device="2304" mtime="941538480" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/base.html" file_size="1705" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="70e45b1218c54cb37f19e9d650f20b63" inode="2671956" device="2304" mtime="941538480" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bbding.html" file_size="1841" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="16a08f37cfe2bf55c4ac5d21e6f9f298" inode="2672459" device="2304" mtime="941538480" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bbm.html" file_size="1928" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="eed99071f6235a81415107d46140600f" inode="2671573" device="2304" mtime="941538480" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bbold.html" file_size="1373" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4d8fac5be3014dc1484c05cff6810908" inode="2671920" device="2304" mtime="941538480" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/beebe.html" file_size="1394" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a2f1e1f2726a054fb421cea1a1582429" inode="2671643" device="2304" mtime="941538480" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/beletter.html" file_size="1707" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fe12b0689c67075e4e0a0e7666e4bed6" inode="2672376" device="2304" mtime="941538540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/belleek.html" file_size="1366" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="863f5f98581da3ae74b479f688ff3620" inode="2671987" device="2304" mtime="941538540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/beton.html" file_size="1986" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="75b14627b95583c591a316f58dadb84e" inode="2672147" device="2304" mtime="941538540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bez123.html" file_size="2044" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="50318dca1b979ee7947e227014551005" inode="2671577" device="2304" mtime="941538540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bezos.html" file_size="1921" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="dbebe81a0a3d19bc1e591d987e276cb2" inode="2671686" device="2304" mtime="941538540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bibarts.html" file_size="1908" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ca4b257295ac55ca1aa22fb905e95889" inode="2671610" device="2304" mtime="941538540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bibdb.html" file_size="1646" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9ecc2c7e3d0345913e8427a1756ebec7" inode="2671750" device="2304" mtime="941538540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bibhtml.html" file_size="2362" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4700a4e77998fa46e7784d4cd1a35c43" inode="2671631" device="2304" mtime="941538540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bibindex.html" file_size="1484" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fa3a0063987a41e45ccbc4701071f874" inode="2671692" device="2304" mtime="941538540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/biblio.html" file_size="2089" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b5fe6ad8f81a8c3096982e8d04db9edb" inode="2671731" device="2304" mtime="941538540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/biblios.html" file_size="1830" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6842ca58936abf242f9e32f83969c83f" inode="2672395" device="2304" mtime="941538600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/biblist.html" file_size="1829" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b0dd485c20a2f59125b09085bb16636a" inode="2672251" device="2304" mtime="941538600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/biblook.html" file_size="1506" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f44856eafd76dd13102d6f861982148a" inode="2671864" device="2304" mtime="941538600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bibsort.html" file_size="1404" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6ce8c8b6a3395c5a49b4da337d5b7a3f" inode="2672157" device="2304" mtime="941538600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bibtex.html" file_size="1240" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d67ea69d739037715164c43d47d13acb" inode="2671553" device="2304" mtime="941538600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bibtex8bit.html" file_size="1676" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1d20b4130e27151c407e4df9afd7e983" inode="2671886" device="2304" mtime="941538600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bibtool.html" file_size="2655" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="77dde15782a9f755d4f149a27f6d9858" inode="2671560" device="2304" mtime="947800440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bibtopic.html" file_size="2453" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="27cb1d2754a5d10ce189d480d478d0c8" inode="2671818" device="2304" mtime="941538600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bibunits.html" file_size="2248" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="aea41bdf5874051566b27acae20d424b" inode="2671587" device="2304" mtime="941538600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bibweb.html" file_size="2175" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7e992628189ae60428c0234d9f87cb5f" inode="2671443" device="2304" mtime="941538600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bidstobibtex.html" file_size="1785" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c1c1ffa5ea57b99788dc42369b58927f" inode="2672223" device="2304" mtime="942060300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bigdelim.html" file_size="1842" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1fbf8f17458e693ea600fa951045d4ca" inode="2672181" device="2304" mtime="942060300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bigstrut.html" file_size="1836" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="adfc7b6a15c440616c19a533c06e7ae1" inode="2671488" device="2304" mtime="941538660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bits.html" file_size="2648" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f16cceda7ce3b772e233a5968ddc710b" inode="2672028" device="2304" mtime="941538660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bitstrea.html" file_size="1728" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3b5e5bd3616e16788fbacc0c5eddd66f" inode="2672178" device="2304" mtime="942750180" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bizcard.html" file_size="1720" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a1615dbcf8a227125b696f16bdb67150" inode="2672150" device="2304" mtime="941538660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/blackboard.html" file_size="2046" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4ae8bce9408f27b0416a0cff9fae87b7" inode="2671912" device="2304" mtime="941538660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/blkarray.html" file_size="2128" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fbbe61f16d37d597eeec40b402d1b55a" inode="2671476" device="2304" mtime="941538660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/blkcntrl.html" file_size="2508" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="03b72029438eb231d036ecf4b023341a" inode="2672110" device="2304" mtime="941538660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/block.html" file_size="1976" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3addae93a2d704c079a732d614f85fab" inode="2671980" device="2304" mtime="941538660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/blu.html" file_size="1649" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3a4fb9a2091834bb455b9db9726d980b" inode="2672330" device="2304" mtime="941538660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/blue.html" file_size="1837" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a5c516c9e8b0ba572df7f1c77039c013" inode="2672411" device="2304" mtime="941538660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bluesky.html" file_size="1801" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="52c5b7d3d1f258cbd708a7895b6f323b" inode="2672320" device="2304" mtime="941538720" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bm.html" file_size="1991" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d55cedbfe096a4a7bdb28f8c13b86ec9" inode="2671804" device="2304" mtime="941538720" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bookhands.html" file_size="1766" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ac65fd26710021a41902710d6c99b429" inode="2671601" device="2304" mtime="941538720" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/booktabs.html" file_size="1854" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="89ecd5477061f2ad509ca27f91add5f1" inode="2671657" device="2304" mtime="941538720" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/borceux.html" file_size="1835" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="048936509739201ccd6f60e5887cba3d" inode="2671931" device="2304" mtime="941538720" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bosisio.html" file_size="2272" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="063eb2f63b0a3534320230cf5bf29b79" inode="2671548" device="2304" mtime="941538720" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/boxedminipage.html" file_size="1730" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b7d492a5059aaa3427528aea4c735653" inode="2672523" device="2304" mtime="941538720" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/braille.html" file_size="1732" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="494e883bbaf1808ca114b92ec579bfa8" inode="2672402" device="2304" mtime="944655660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/braket.html" file_size="1834" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cc5446d4ccd0c59f7a70d2c5d87867e3" inode="2671581" device="2304" mtime="941538720" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/brclc.html" file_size="2256" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="34f58610922e1cbc5b486a63f6e8486c" inode="2671681" device="2304" mtime="942153300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/breqn.html" file_size="1517" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0b3e33fd18352382be85353552215c53" inode="2671799" device="2304" mtime="941538780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/bridge.html" file_size="1850" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a5060800a2dec866b3d7e1338f424ebf" inode="2672259" device="2304" mtime="941538780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/brief.html" file_size="1773" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7162cad457693cbc18e0ecb937de2049" inode="2671832" device="2304" mtime="941538780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/brushscr.html" file_size="1842" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a6e8697790f5e0ebdf24b95d54ab5a9b" inode="2672549" device="2304" mtime="941661720" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/btool.html" file_size="2510" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="867f26a239c0c73edfc838b6d686974f" inode="2672143" device="2304" mtime="941538780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/c-pascal.html" file_size="1942" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a2474dc6df3b883907faf52dd1571c3b" inode="2672020" device="2304" mtime="941538780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/c2cweb.html" file_size="1731" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="739780fb945aa43c9e0b4a5a5d54ee8a" inode="2671973" device="2304" mtime="941538780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/calc.html" file_size="1954" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a31a658ab072837484ac0160e5e394cf" inode="2671697" device="2304" mtime="941538780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/calendar.html" file_size="2409" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6d11153c6804be13ab6ff14e6de95872" inode="2671641" device="2304" mtime="941538780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/calligra.html" file_size="2100" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d6d27047d379c72912242bb7e1e3876c" inode="2671701" device="2304" mtime="941538780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/calrsfs.html" file_size="1877" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="40a71560fefa13608e0e03b18f45bc70" inode="2672216" device="2304" mtime="941538840" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/camel.html" file_size="1989" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="141d59e28f63ed4be0d4b719b9a72a92" inode="2672313" device="2304" mtime="948382980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cancel.html" file_size="1816" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b7871d8622150f4f56e28c0ea97ee763" inode="2671761" device="2304" mtime="941538840" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/capt-of.html" file_size="1784" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="84be2b22bac5d31e004a1702614413a4" inode="2672131" device="2304" mtime="941538840" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/caption.html" file_size="2176" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e005438d2ab86661114b1d8296e3b73a" inode="2672139" device="2304" mtime="941538840" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/caption2.html" file_size="2090" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="68d55fb26a3ea003473b8cfe44e7b542" inode="2672436" device="2304" mtime="941538840" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/carlisle.html" file_size="2263" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b8a9e32c0d3d0146a33373e5494cdf29" inode="2671985" device="2304" mtime="941538840" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cases.html" file_size="1786" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ce601062325324b6e137f12512f44eb2" inode="2671782" device="2304" mtime="941538840" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/casyl.html" file_size="1931" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="04c56e44efde8bc91623d3d3a6536c1d" inode="2671756" device="2304" mtime="949069140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/catalogue.html" file_size="2241" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bb8a965ffd8f0e24ed2ea0d3c5f8540e" inode="2671703" device="2304" mtime="941538840" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/catdoc.html" file_size="1858" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="08cb1d1d5df41e9b32ef742ce55ae9fa" inode="2671816" device="2304" mtime="947170020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/catdvi.html" file_size="1937" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9302f0f801e4b9c560d4dbd04520f348" inode="2671430" device="2304" mtime="948898920" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cbgreek.html" file_size="1850" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ee10dec59e6a6797e9b4cfac84db4d58" inode="2672357" device="2304" mtime="941538900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cc-pl.html" file_size="1819" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b08be77b1a7f31d777efd00c771565ad" inode="2672148" device="2304" mtime="941538900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ccaption.html" file_size="2207" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cf208b5869eab52cbb7b4bfc5389442f" inode="2671857" device="2304" mtime="943451640" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ccfonts.html" file_size="2196" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="00a7d0811777e7fda1a6e8c3b44554ae" inode="2671683" device="2304" mtime="941538900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cchess.html" file_size="1354" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bed97061cc11c92a818e0dd69cbaf918" inode="2671459" device="2304" mtime="941538900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cdcover.html" file_size="1858" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="59083f9584258dfa59e39e80d9fdcf7c" inode="2671805" device="2304" mtime="941538900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cdlabeler.html" file_size="1697" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="21e3508b29919774c707bfa8d07834d3" inode="2671757" device="2304" mtime="941538900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cellular.html" file_size="1819" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bb93b31401413ee8f34b8565835277e6" inode="2672544" device="2304" mtime="941538900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cep.html" file_size="1895" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e84b0487a2d12be1ab5f3b7701b03083" inode="2671836" device="2304" mtime="941538900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/changebar.html" file_size="1998" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="257e6a6f765a1e4f6e89ba5d02ce3166" inode="2672062" device="2304" mtime="942060300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/chappg.html" file_size="1830" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="be479e3939df5029c92fb360b2b4e3aa" inode="2671478" device="2304" mtime="941538960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/chapterbib.html" file_size="1875" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ef5c77b1e026aa18c39d41147320ca3a" inode="2671437" device="2304" mtime="941538960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/chemcono.html" file_size="2177" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ed8264c4316a0256b3c4432e0c58edb7" inode="2671901" device="2304" mtime="941538960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/chemsym.html" file_size="1853" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a6c3712ab227bd923bd19b5ed3770c71" inode="2672336" device="2304" mtime="941538960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cheq.html" file_size="1724" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a6c3831500ce23961b87a8a889945fc4" inode="2671811" device="2304" mtime="941538960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cherokee.html" file_size="1758" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="33762d0207fb221dfc628f1e0ad9a421" inode="2671470" device="2304" mtime="941538960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/chess.html" file_size="1748" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cc20a79df66a810b55c573aa9024e7d3" inode="2671753" device="2304" mtime="941538960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/chicago.html" file_size="1659" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3a4d7668becebf1c9d27538be65d5143" inode="2672180" device="2304" mtime="941538960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/china2e.html" file_size="1926" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fa9f37867a69ab1445bc658d0a56e677" inode="2671710" device="2304" mtime="941538960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/chktex.html" file_size="1791" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7b455ec224b261c8085c84470b19d297" inode="2671567" device="2304" mtime="941538960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/circ.html" file_size="1992" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="865b332240f0e7e6b3b814ea1cadd6ad" inode="2671517" device="2304" mtime="941539020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/circle.html" file_size="2109" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bb8ca69995818c6ac14734d90c0f83c7" inode="2672499" device="2304" mtime="947165640" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/circuit-macros.html" file_size="2585" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a0a738e638b99fa9b63beb9bb4e6e64a" inode="2671976" device="2304" mtime="941539020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cirth.html" file_size="1729" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="72ab4f2ac16b3ae7622554469af3e8f5" inode="2671863" device="2304" mtime="941539020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/citation.html" file_size="1387" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e2221e7378c7e1f01848c455da38a210" inode="2671940" device="2304" mtime="941539020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cite.html" file_size="1895" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="342f80604522ef99c92ecc0dfdaf8b15" inode="2672321" device="2304" mtime="941539020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/citeref.html" file_size="1731" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="241267241c6de01f77354667dcb85f0f" inode="2672543" device="2304" mtime="941539020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cjk-fonts.html" file_size="1786" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="dc59522e8a0bda53b01ad08a00f36065" inode="2672163" device="2304" mtime="941539020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cjk.html" file_size="1804" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d87bfe5e5170ddffd6efab1c276e95bd" inode="2672491" device="2304" mtime="941539020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cm.html" file_size="1717" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e5adf1f2cf687c9cd48354312bb45c65" inode="2671711" device="2304" mtime="941539020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cmactex.html" file_size="1966" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bc7d4ca25c1155bb9f6573dbf49cf8e4" inode="2672018" device="2304" mtime="941539080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cmbright.html" file_size="2074" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="655b6c85f2b9e7e60d8dccf0259a5353" inode="2672043" device="2304" mtime="941539080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cmcyr.html" file_size="1843" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1c34425b2371a7b11d3a5cb9182a5737" inode="2671678" device="2304" mtime="941539080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cmcyralt.html" file_size="1804" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="18084ffc33b8d32dc6fd0b3950514373" inode="2671759" device="2304" mtime="941539080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cmdtrack.html" file_size="2323" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5172f670c5329a67062e1595c05d0925" inode="2672385" device="2304" mtime="941539080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cmextra.html" file_size="1820" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="23f7aed5a98e459b945ec9eb650ab9fe" inode="2672422" device="2304" mtime="941539080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cmolddig.html" file_size="2083" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5522c5b63801315ac2b51b0c3a463cc4" inode="2671622" device="2304" mtime="941539080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cmpica.html" file_size="1750" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f190c1586b0971d5343687914c02b32c" inode="2671929" device="2304" mtime="941539080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cmps.html" file_size="1705" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="05dc01bc0239571792c0ea2b08bd8c3b" inode="2672187" device="2304" mtime="941539080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cmsd.html" file_size="2390" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b8e40c1a29947abb5890db91f18a9f09" inode="2671454" device="2304" mtime="941539080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cmtt.html" file_size="1954" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0693f9ae1a3becdff6915049ebbea3bd" inode="2672198" device="2304" mtime="941539140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cmyk-hax.html" file_size="2143" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="85ae5c872c5e09b9eca234020f800380" inode="2672458" device="2304" mtime="941539140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/code128.html" file_size="1763" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8c4b656a8bf0896c1f41e0878377c5fe" inode="2671489" device="2304" mtime="941539140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/codepage.html" file_size="1862" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3533bcc6cf649259ef2ebb4a83770e13" inode="2672105" device="2304" mtime="941539140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/color.html" file_size="2221" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ae3d30764b38d7dec173ec3b8bb8327f" inode="2671769" device="2304" mtime="941539140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/colorsep.html" file_size="1366" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="091eabcd6d35d8178b4ea5074257f7be" inode="2671562" device="2304" mtime="941539140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/colortab.html" file_size="1923" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="228cf890d5370ae63bf276f40861a251" inode="2671894" device="2304" mtime="941539140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/colortbl.html" file_size="1989" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d804e0e637687b8c8775d1953f7bb0f0" inode="2672192" device="2304" mtime="941539140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/comma.html" file_size="1891" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3a9c5dd89fff482edc5a31e8803f87bb" inode="2672093" device="2304" mtime="941539140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/comment.html" file_size="2009" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cc6d1c53c012e9d75ce169bef3d9fff5" inode="2671546" device="2304" mtime="941539140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/compsci.html" file_size="2864" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="44245bb31228ac13bcf2f384a8ae0074" inode="2671507" device="2304" mtime="941539200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/concmath.html" file_size="2156" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7c1c33231fc041d973b5d8cadde7f1b5" inode="2671868" device="2304" mtime="941539200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/concprog.html" file_size="1810" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fa634bf4c8e4b9b333474f487139487a" inode="2672296" device="2304" mtime="941539200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/concrete-wrap.html" file_size="1892" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="241e2ff8bc99ec5738706bd477773724" inode="2671844" device="2304" mtime="941539200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/concrete.html" file_size="1999" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c762993d3d17cd8528abe158e1178980" inode="2671432" device="2304" mtime="941539200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/consdiag.html" file_size="1741" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0b012c684e355fcabd51e04640ea7e61" inode="2671860" device="2304" mtime="941539200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/context.html" file_size="2079" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b526e35a79d6b47bbc91f2966d32456a" inode="2672416" device="2304" mtime="945256920" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/contour.html" file_size="1896" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e595ad4efac48b515df19674c6e5dd6b" inode="2671618" device="2304" mtime="941539200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cooking.html" file_size="1713" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b05cc41b0c81fb065da331cd04cdc604" inode="2671582" device="2304" mtime="941539200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/corelpak.html" file_size="1820" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ac23e30e84ab9044f16d80d4ac8089be" inode="2671466" device="2304" mtime="941539200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/count1to.html" file_size="1959" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bebfe652e7dede05c84378f58e6462c3" inode="2672490" device="2304" mtime="941539260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/covington.html" file_size="2214" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cc7f3d6e4e51d5423fda7609736ce5a8" inode="2671732" device="2304" mtime="941539260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/croatian.html" file_size="1781" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="dab6a8c123677c23c5d6c02e01ade767" inode="2671802" device="2304" mtime="941539260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/crop.html" file_size="2069" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="570076ae507ed90cd2424e6cfd7f7cba" inode="2671795" device="2304" mtime="941539260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/crossword.html" file_size="1858" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="41ace66195b4d7807140893cabc09577" inode="2671484" device="2304" mtime="941539260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/crosswrd.html" file_size="1894" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a257f589552935df69737de2a13e9237" inode="2672414" device="2304" mtime="941539260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cryst.html" file_size="1635" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="541d673177bcc8c941733f3c2c47f99c" inode="2671452" device="2304" mtime="941539260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/csfonts.html" file_size="1325" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1b2a39a5c869ddf1c6402a3ae502e288" inode="2671572" device="2304" mtime="941539260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cslatex.html" file_size="1317" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="56b063f437997f98de3e9ac9d82ff4ab" inode="2671961" device="2304" mtime="941539260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/csplain.html" file_size="1321" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8aeaa357e4f56b321f9f920f3351642e" inode="2671490" device="2304" mtime="941539260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cspsfonts.html" file_size="1316" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0358c3002fed1a3439420a128cdc9b0c" inode="2672084" device="2304" mtime="941539320" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cstug.html" file_size="1302" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c00540dfac0d6c24242ff2c32a97801b" inode="2671579" device="2304" mtime="941539320" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/csx.html" file_size="1795" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5d5fe317ef18efd92e2b8841acf9f087" inode="2672487" device="2304" mtime="941539320" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ctib4tex.html" file_size="1862" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5e9a8e8baf9880599b07a6cb0bacdaa8" inode="2672229" device="2304" mtime="941539320" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/currvita.html" file_size="1746" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a3ec0d26ccab9390416789845499bd7f" inode="2671905" device="2304" mtime="941539320" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cursor.html" file_size="1936" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6eb16e87affed8f94b604b31958fde57" inode="2672277" device="2304" mtime="941539320" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/curves.html" file_size="2005" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5b4c7e41b2a786923e7c9ddb22d1af8d" inode="2671513" device="2304" mtime="944168940" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/custom-bib.html" file_size="2035" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a72491b44da85c3a852d20290dd9f787" inode="2672000" device="2304" mtime="941539320" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cwebbin.html" file_size="2034" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="48e24c8b79f8b1a306df25eb6ce1822a" inode="2671720" device="2304" mtime="941539320" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cwebx.html" file_size="2193" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fa6eebecb85fa8f1be44751bd1f30bd3" inode="2672140" device="2304" mtime="941539320" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cwpuzzle.html" file_size="1746" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6ccaa7f06c44382f7f1474037b3703ed" inode="2671555" device="2304" mtime="941539380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cypriot.html" file_size="2108" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4aa373da0ef71ca8224050bccee4ec4c" inode="2671766" device="2304" mtime="941539380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cyrillic.html" file_size="1301" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="57597531b2cd0113897821bab0cfa4e4" inode="2672248" device="2304" mtime="941539380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/cyrtug.html" file_size="1759" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="df8f9af019c46e193779eaae913664af" inode="2672425" device="2304" mtime="941539380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/czech.html" file_size="1673" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d5ea8a2267ea94bfc52d54c23b35d43b" inode="2672011" device="2304" mtime="941539380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dancers.html" file_size="1768" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="81a309eab31bbd64c18f4db8c1ba54e1" inode="2672482" device="2304" mtime="941539380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dante-src.html" file_size="1824" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5d14d73045d5daeca303cd8c37ad0389" inode="2671807" device="2304" mtime="941539380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dates.html" file_size="1726" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d2d932b3e00e8ae1f3476da3ac8baa56" inode="2672380" device="2304" mtime="941539380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dblfont.html" file_size="2069" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8b2a151645eea49ab324e50d73205013" inode="2672363" device="2304" mtime="941539380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dbprocess.html" file_size="1774" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="be56385b6c8047af7cc3b6058a0aa400" inode="2671671" device="2304" mtime="941539440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dcolumn.html" file_size="1942" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="55b7629f43b4449ba49af004aedc206b" inode="2671679" device="2304" mtime="941539440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dcounter.html" file_size="2044" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fb48e0f294d79376140056c13346390a" inode="2671569" device="2304" mtime="941539440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/default.html" file_size="1668" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="02f19554b75db6a051731161b8ad3948" inode="2672387" device="2304" mtime="941539440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/delarray.html" file_size="1774" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0fcca90024d347f2d513f51fd2d3eded" inode="2672209" device="2304" mtime="941539440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/deleq.html" file_size="1983" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="967339770cffa1599ffbe2cc9eb205cd" inode="2671881" device="2304" mtime="941539440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/delimtxt.html" file_size="1898" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="481df9895d230066578c785662b42349" inode="2671584" device="2304" mtime="948898920" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/devanagari.html" file_size="1957" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5dcf0bb7b77c33c08de9a1fe19adcd48" inode="2672075" device="2304" mtime="941539440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dialogl.html" file_size="1875" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bda0c2a72e23de5667ed3c36afba84d9" inode="2671556" device="2304" mtime="941539440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dialogue.html" file_size="2493" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8bea12856081444cdaf173bd19d924bf" inode="2672432" device="2304" mtime="948461400" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dinbrief.html" file_size="2558" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="108d5f4baa5a7bd1294404171967eb35" inode="2671468" device="2304" mtime="941539500" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/directory.html" file_size="2151" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a87d56512d42b076ff570a9cf66b952e" inode="2671508" device="2304" mtime="948898980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dn2.html" file_size="1805" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2e53c7fd90a4e5c0dfd3e1af72a41668" inode="2672405" device="2304" mtime="941539500" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/doc.html" file_size="1801" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="90fcd54808436e05b3e2cfe69b450c84" inode="2672481" device="2304" mtime="942423780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/docmfp.html" file_size="1868" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9aaf8766febb135b4c0d4a2a85e92b94" inode="2671535" device="2304" mtime="941539500" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/docstrip.html" file_size="1757" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="80f13493081ab5878286bd0125163fc1" inode="2671434" device="2304" mtime="941539500" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dotlessi.html" file_size="1796" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="51c2ce1b352b9110f850697c866e3555" inode="2671455" device="2304" mtime="941539500" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dotlessj.html" file_size="1814" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8bc12b568e44bf354ecc37332f1de587" inode="2671879" device="2304" mtime="941539500" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dotseqn.html" file_size="1865" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f18ad66e9425dd406fc32614bd603b31" inode="2672022" device="2304" mtime="941539500" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/doublespace.html" file_size="1867" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3fdce701a8df9fc9cf2ff292ce5b68fb" inode="2671611" device="2304" mtime="941539500" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/doublestroke.html" file_size="1928" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="20ba0c4598f73975aa2c41c21ff5eaba" inode="2672317" device="2304" mtime="941539560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/draftcopy.html" file_size="2231" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="58610f954644397095608f3cbfc5eccc" inode="2671670" device="2304" mtime="941539560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/drafthead.html" file_size="1755" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ab976e72ff7f92f531315fb7e547bf1e" inode="2672069" device="2304" mtime="941539560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/drama.html" file_size="2712" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8af5193c85d4f5634b07bb2f51a4d3c3" inode="2672408" device="2304" mtime="947000880" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dratex.html" file_size="1791" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9f4fc62a1fffa9c3dd5c5ddcd7a16afc" inode="2672081" device="2304" mtime="941539560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/drftcite.html" file_size="1757" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c16fb1131211dd4f194ac6f0b15e72f4" inode="2671472" device="2304" mtime="941539560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dropcaps.html" file_size="1775" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8ec1759811e22756bac34b10725d3e18" inode="2672367" device="2304" mtime="941539560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dropping.html" file_size="2048" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a44f27ee0517c3e1f38de5dabe49e98b" inode="2672115" device="2304" mtime="941539560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dstroke.html" file_size="1463" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fa58a4baf427087b31026895a0778f63" inode="2672134" device="2304" mtime="941539560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/duerer.html" file_size="1741" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8cece130094eb43b16ecb899ae884d54" inode="2672082" device="2304" mtime="941539620" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dvgtk.html" file_size="1735" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8bbe694b088356981b92cce1f6e15799" inode="2672453" device="2304" mtime="941539620" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dvi2tty.html" file_size="1846" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b28297fbce288a7f980d189021823909" inode="2672556" device="2304" mtime="941539620" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dviconcat.html" file_size="1674" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bf9879cc4b9d2e33ce5f0c47731680ba" inode="2671870" device="2304" mtime="941539620" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dvicopy.html" file_size="1644" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4cda896ce67272182b2d5336248968f2" inode="2671796" device="2304" mtime="945653040" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dvii.html" file_size="2369" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0448eca463a13094654d5edee85aed0e" inode="2671566" device="2304" mtime="948115020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dviincl.html" file_size="2119" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f3f6f4e185cfaef14d99ffb3ac690cf5" inode="2671525" device="2304" mtime="941539620" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dviljk.html" file_size="1687" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2b41c7473ff86eda6c4c426645f04427" inode="2672114" device="2304" mtime="941539620" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dviout.html" file_size="1858" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0acbacbdb1f602209232025a804cef1b" inode="2671645" device="2304" mtime="941539620" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dvipaste.html" file_size="2009" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7c0f5c6eac844526273b0cc520355415" inode="2672189" device="2304" mtime="941539620" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dvipdfm.html" file_size="1968" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="942d7f2844782d0f4f89412685d832ca" inode="2671557" device="2304" mtime="941539620" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dvips-os2.html" file_size="1808" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="884bc870df26083162b37cb43bf74542" inode="2672245" device="2304" mtime="941544180" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dvips-shell.html" file_size="1664" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="df028c7fa0a28aa6c53a84bf89466014" inode="2671771" device="2304" mtime="941544180" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dvips.html" file_size="1766" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="55ae445596df0bc55bceaea7f2ac6ec0" inode="2672199" device="2304" mtime="941544240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dvipsdoc.html" file_size="1302" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="903c76f82198473e57bd372a6efe32b7" inode="2672428" device="2304" mtime="941544240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dvipsk.html" file_size="1755" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bd6be6e06c09abdced12eb1e9204b414" inode="2672159" device="2304" mtime="941544240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/dviwin.html" file_size="2477" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cdd0addd3cf30c04e49e89b3e7d0a36e" inode="2672086" device="2304" mtime="941544240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ean.html" file_size="1847" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="54ed65ab184161f567130be9d57a7af0" inode="2672465" device="2304" mtime="942750180" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/easy.html" file_size="2127" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="25eb083befa579cbc338109785559c51" inode="2671684" device="2304" mtime="941544240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/easybib.html" file_size="1918" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d92024386efcaa66594394caf4173c17" inode="2671878" device="2304" mtime="941544240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/easybmat.html" file_size="1937" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="838cd2eab088f090b5035a8d768cb5f0" inode="2671815" device="2304" mtime="941544240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/easyeqn.html" file_size="2101" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="22740dcc85b24b8d17cb622fb766bc6d" inode="2672389" device="2304" mtime="941544240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/easymat.html" file_size="1882" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e2caa4616007779a5432dbb23d61b5f5" inode="2671440" device="2304" mtime="941544300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/easytable.html" file_size="1974" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="af8788a1a2480b07fba1b21ea1b510ff" inode="2671840" device="2304" mtime="941544300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/easyvector.html" file_size="1806" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="de504f2590bdf90887f4e9fe704da370" inode="2671479" device="2304" mtime="941544300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ec-plain.html" file_size="1744" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d1b634ee0e98c88f06f9b2278a9dd5db" inode="2671550" device="2304" mtime="941544300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ec.html" file_size="2423" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d38ae48a64ab96ae1fa47aaabc76ca43" inode="2672236" device="2304" mtime="941544300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ecc.html" file_size="1960" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ba93bccf54767be7b724187716bcfb95" inode="2671586" device="2304" mtime="941544300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ecltree.html" file_size="1308" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fac0d028086f71ddc313136640500588" inode="2672420" device="2304" mtime="941544300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/eco.html" file_size="2149" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="83cf6347fe2c9cfa74525b0e79d8e67f" inode="2671992" device="2304" mtime="941544300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ecpk.html" file_size="1302" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="09cbca82cb2a66942d3414d302f7ee56" inode="2671675" device="2304" mtime="941544360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/edmac.html" file_size="1838" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1a3665e3032d76e0d7e5ddb09ad920cf" inode="2672350" device="2304" mtime="948382980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/eepic.html" file_size="2196" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e63dbbaf33b8045d8ea25abab4e0c2ca" inode="2672478" device="2304" mtime="941544360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/egplot.html" file_size="1971" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b79ffa8487144ccf7bd76352e7233d98" inode="2672314" device="2304" mtime="941544360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/eiad.html" file_size="1729" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c912ee4f39b05a573f36ec9eabbf711c" inode="2672265" device="2304" mtime="941544360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/eijkhout.html" file_size="1954" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="703c492270ff80eea7962451ecb4be9d" inode="2671674" device="2304" mtime="941544360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/elsevier.html" file_size="1874" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3ec96d17279cc4d6081a229742bb78ab" inode="2671688" device="2304" mtime="941544360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/elvish.html" file_size="1756" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f8cd435f2661259cc563ea70cd5163c9" inode="2671825" device="2304" mtime="941544360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/emp.html" file_size="2077" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5b609dbbd7936b3fbe7d1bafc667ded4" inode="2672204" device="2304" mtime="941544360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/emtex-os2.html" file_size="1647" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bcff61d3642bf7e71cd44c2c302da86a" inode="2671965" device="2304" mtime="941544420" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/emtex.html" file_size="1648" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="61e56c2ab65c5f59eb6158daaef4aae4" inode="2672433" device="2304" mtime="941544420" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/emtexgi.html" file_size="1726" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4a16412399a27d0172e60deebf8413d2" inode="2672247" device="2304" mtime="945185460" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/emtextds.html" file_size="2032" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0eed5c72a5551f57331ee57260a1b319" inode="2671469" device="2304" mtime="941544420" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/emulateapj.html" file_size="1953" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c936d74582e7004b28308945ea51257a" inode="2672415" device="2304" mtime="941544420" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/encodings.html" file_size="1312" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1e58f5c805a9e4c539e19c3f004a0666" inode="2671426" device="2304" mtime="941544420" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/endfloat.html" file_size="2125" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3e560458b15b262343ebbc3413cb2af6" inode="2671841" device="2304" mtime="941544420" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/endnotes.html" file_size="1874" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bfab3e207ead76059f775f891853e0c3" inode="2671506" device="2304" mtime="941544420" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/engwar.html" file_size="1791" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="53ee9fe65e7bf204b2c6234d1e44a879" inode="2671774" device="2304" mtime="941544420" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/enumerate.html" file_size="1785" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="aae93cfe3f769c8ebf6901dfa98fda68" inode="2671499" device="2304" mtime="941544480" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/envbig.html" file_size="1835" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cda0b14d1a53cb614005936523b1bad5" inode="2672331" device="2304" mtime="941544480" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/envlab.html" file_size="2458" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ec2fa7801935676f94cc80eb3c931490" inode="2671690" device="2304" mtime="941544480" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/epic.html" file_size="1750" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="96e08f4e06bd92e9c01ec585dad5f44d" inode="2672311" device="2304" mtime="944168940" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/epigraph.html" file_size="2083" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="53bdd4650a60671ef049612c94e04861" inode="2671843" device="2304" mtime="941544480" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/eplain.html" file_size="1968" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e604e3c3d90bb00c764ffbbd460ceaef" inode="2672337" device="2304" mtime="942060300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/epmtfe.html" file_size="1934" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="badabfb82439c3a5937bc274a33a2694" inode="2671803" device="2304" mtime="941544480" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/epsfig.html" file_size="1789" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a96dfed111c04a4cceef4f55569fbe04" inode="2672329" device="2304" mtime="941544480" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/epsfx.html" file_size="2139" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="aa88f8832343846ce72a4f671b323315" inode="2671867" device="2304" mtime="948115020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/epsincl.html" file_size="1806" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9b9f27ea85a830f9f7b2e4105466c343" inode="2672077" device="2304" mtime="941544480" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/epslatex.html" file_size="2007" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="078e989f2709b3de8de8eb51179b6944" inode="2671673" device="2304" mtime="941544540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/eqname.html" file_size="1862" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ad509ba15ae256b49c8026bdf6f95eaa" inode="2671884" device="2304" mtime="941544540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/eqnarray.html" file_size="1879" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7a343fc69ed8106bb39f9194074de838" inode="2672004" device="2304" mtime="941544540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/esieecv.html" file_size="1851" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ae06b9b5f9fa2d33a69f0cd160da0e81" inode="2671822" device="2304" mtime="941544540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/esindex.html" file_size="1734" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fce2444d9fc538c479ba0d19f26fa5ba" inode="2671526" device="2304" mtime="941544540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/eso-pic.html" file_size="1766" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2909c80244024fa3a50ccff6eb378123" inode="2671812" device="2304" mtime="941544540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/et.html" file_size="1666" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a3107ce47b0eae76818fe3ffb6b2dfcd" inode="2672335" device="2304" mtime="941544540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/etexbase.html" file_size="1309" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cab7965df40a102542fb8cd65af9c39c" inode="2672273" device="2304" mtime="941544540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ethiop.html" file_size="1917" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f9e9061afec3071ab2c6e8c56d92841f" inode="2672512" device="2304" mtime="941544540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/etruscan.html" file_size="1966" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0792b80bc0d1812209aebe52d4669d27" inode="2671593" device="2304" mtime="941544540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/euler.html" file_size="2287" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="958a305fe98600d1c58eccb6ddf70e72" inode="2671708" device="2304" mtime="948461400" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/eulervm.html" file_size="2222" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1646c2600cc5e125d20e00b5a548acb1" inode="2672200" device="2304" mtime="941544540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/euro.html" file_size="2247" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3020e9988ecdb4c0fceddbf4e2a8f2ae" inode="2671608" device="2304" mtime="941544600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/eurofont.html" file_size="3097" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9eeb1c5bbba7bd6fc976cc371bf96619" inode="2672071" device="2304" mtime="941544600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/europs.html" file_size="2459" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="31702d55250c30781810d4961d4fdb6f" inode="2671737" device="2304" mtime="941544600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/eurosans.html" file_size="2460" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7580df5045cbb0b71c9081386db7cb07" inode="2672021" device="2304" mtime="941544600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/eurosym.html" file_size="2159" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e6f18cab16303d07910ad1df66e1e6b6" inode="2672026" device="2304" mtime="941544600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/euxm.html" file_size="1351" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0362d24e6fafb0aba9bf7d2ac4342cf8" inode="2672132" device="2304" mtime="941544600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/everysel.html" file_size="1773" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7ec666afa60957844582bbb47c803edc" inode="2672569" device="2304" mtime="941544600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/everyshi.html" file_size="2026" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5b994c118daf79c18aaaedcaa34aa7f7" inode="2672521" device="2304" mtime="941544600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/exam.html" file_size="1882" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5dbd409ead07832132b9d0e96be8680e" inode="2671667" device="2304" mtime="941544600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/examdesign.html" file_size="1873" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0ff90f3afa52b298be6800a27cd6b789" inode="2671962" device="2304" mtime="941544600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/exams.html" file_size="2075" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7852fc2ac15900619858d9969ca4a80c" inode="2672306" device="2304" mtime="941544660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/excalibur.html" file_size="1746" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="46538a8b47ad8f75e331e17d2bed20bc" inode="2671727" device="2304" mtime="941544660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/exerquiz.html" file_size="1948" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1d69e45731340539776698f472b8bd35" inode="2672366" device="2304" mtime="941544660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/expdlist.html" file_size="2170" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cff34f447202f55ed8ba27013c09584d" inode="2672016" device="2304" mtime="941544660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/expl3.html" file_size="2030" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e2ae9cd547029290aa824cb2ea4a3d03" inode="2671981" device="2304" mtime="941544660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/export.html" file_size="2022" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="756b2808a09623b5f5345c22fababeb9" inode="2671806" device="2304" mtime="943451640" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/expressg.html" file_size="1946" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3115400a2917db9363bcaa9b5e5f7444" inode="2671797" device="2304" mtime="941544660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/exscale.html" file_size="1716" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7a72d3b7c741b364fd213c6cd67e3601" inode="2671668" device="2304" mtime="941544660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/extdash.html" file_size="1946" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="38ae745ea7d55da98980c882d431ec8d" inode="2671538" device="2304" mtime="944655660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/extsizes.html" file_size="1850" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="41932c507da3d2eb66e993431e8d0d0c" inode="2671687" device="2304" mtime="941544660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/fancybox.html" file_size="2068" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="386e624ec6ebd8801b6e061a41f651dd" inode="2671570" device="2304" mtime="941544660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/fancyhdr.html" file_size="2293" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d4d95182490e884dfc1af662e3a36992" inode="2671646" device="2304" mtime="941544660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/fancyref.html" file_size="1867" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="807c65dd716f3b470b89a9a67cab3a7e" inode="2671909" device="2304" mtime="941544720" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/fancyvrb.html" file_size="2208" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="49c6cd2f744c42ffc7ec718fb8972981" inode="2671682" device="2304" mtime="941544720" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/faq.html" file_size="1667" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="11c520a9988ba43566f3cccf5909b9d2" inode="2671786" device="2304" mtime="941544720" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/fax.html" file_size="2006" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ef4ccee423e54d8c56d66b13e495a61f" inode="2671724" device="2304" mtime="941544720" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/fc.html" file_size="1841" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a5a57715b385499bd1ce690ffd7dbb40" inode="2670357" device="2304" mtime="941544720" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/fepslatex.html" file_size="1600" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0b2f04928b36804a5d411d065daab4a9" inode="2672559" device="2304" mtime="941544720" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/feynmf.html" file_size="2147" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d8da8a49035de05e5a40d2e5d4778380" inode="2671871" device="2304" mtime="941544720" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/fihyph.html" file_size="1896" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e489e124ce8ae8a6125b2ca7e4b92909" inode="2671436" device="2304" mtime="941544720" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/filehdr.html" file_size="1700" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d34589b0db8ff9006d448f8afff804d1" inode="2672377" device="2304" mtime="941544720" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/finbib.html" file_size="1307" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a153660ef4560f9a978799c5717fec54" inode="2671837" device="2304" mtime="941544720" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/finplain.html" file_size="1673" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e4fe93ad4f4be8ddf9fddf710a1557a5" inode="2671827" device="2304" mtime="941544720" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/fix2col.html" file_size="1938" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="888342655240fc469736334bcb2d2004" inode="2671637" device="2304" mtime="941544780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/flabels.html" file_size="1894" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7d12a1262ce1746a56a71a1466109aab" inode="2672292" device="2304" mtime="941544780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/flatex.html" file_size="2175" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d600d7f7aae3860de24d88575003b866" inode="2671975" device="2304" mtime="941544780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/flatten.html" file_size="1759" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bd97732a724c0905dc16fd7cb670e1cb" inode="2671916" device="2304" mtime="941544780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/float.html" file_size="2434" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="abc5be50887dad19df113f98b9919a56" inode="2671615" device="2304" mtime="941544780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/floatfig.html" file_size="1903" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0b4a9657e4d505188b0e350f6b28143f" inode="2672287" device="2304" mtime="941544780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/floatflt.html" file_size="2236" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="346b68cab9fa0dda8aa073204221a920" inode="2672246" device="2304" mtime="941544780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/fltpage.html" file_size="1970" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1bb35dce019c004b3465904271895d31" inode="2672533" device="2304" mtime="941544780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/fncychap.html" file_size="2262" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4c7ddc4c4b5eb717bee5d89020320088" inode="2671460" device="2304" mtime="941544780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/fnpara.html" file_size="1885" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f5542e7d2c297fef0d7449cb24be56d6" inode="2672561" device="2304" mtime="941544780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/foilhtml.html" file_size="2287" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8789a3f7bdb4ac36379b724f5033ac2c" inode="2671621" device="2304" mtime="941544840" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/foiltex.html" file_size="2301" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="abeb71dba073e3473ada46c1efc663c5" inode="2672154" device="2304" mtime="941544840" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/fontinst.html" file_size="1872" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9905d5b71766f4bdd6cfe44aeb8e7a8b" inode="2672208" device="2304" mtime="941544840" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/fontmisc.html" file_size="1201" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b573c76789cc8a770654baa27dd0d001" inode="2672151" device="2304" mtime="941544840" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/fontname.html" file_size="1319" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="453f045c33933af51b26078446118240" inode="2671752" device="2304" mtime="941544840" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/fontsmpl.html" file_size="1683" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="299688bc7d8f98a89da6a544fa71ef2a" inode="2672254" device="2304" mtime="941544840" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/footbib.html" file_size="2069" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bbbe65a24dc4a40e1215795b84655fb3" inode="2671926" device="2304" mtime="941544840" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/footmisc.html" file_size="2133" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="21709b4c945173e5aeed624a995b2f9d" inode="2672220" device="2304" mtime="941544840" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/footnpag.html" file_size="2080" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1864a17b14392614994ffbc0e630c5bd" inode="2672238" device="2304" mtime="941544840" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/formats.html" file_size="1329" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5480ee660266d1da466ca1116f71e93e" inode="2671541" device="2304" mtime="941544840" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/formlett.html" file_size="1854" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ad14607cf4f2acb01f3e2de21c7d9664" inode="2671839" device="2304" mtime="941544840" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/formula.html" file_size="1975" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="25e789fa91e4bba2cd2eed69c7cd5e8e" inode="2671745" device="2304" mtime="941544900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/fourproject.html" file_size="1817" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4e4b9a9a8933e9694d68224e6077485e" inode="2672080" device="2304" mtime="941544900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/fourspell.html" file_size="1978" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="287b50c0f0e9f0d823f687369726e641" inode="2672249" device="2304" mtime="941544900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/fourtex.html" file_size="1855" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e203a0cc1489d6240dcacf2159fbe907" inode="2671919" device="2304" mtime="941544900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/fp.html" file_size="1895" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="174b9d7f8f9384215b4d5a6e11146bd4" inode="2672007" device="2304" mtime="941544900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/fptex.html" file_size="2201" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="964744cb596ef75becf0c930769adb10" inode="2672090" device="2304" mtime="941544900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/frankenbundle.html" file_size="3160" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="aee2575297524ad6d4d222278ca25756" inode="2671781" device="2304" mtime="941544900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/frankenstein.html" file_size="2907" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9573a539015438a7da9712b5553b95d7" inode="2671613" device="2304" mtime="941544900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/freefonts.html" file_size="1663" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="28b281618e40f1e658c0f676636ded91" inode="2671829" device="2304" mtime="941544900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/freetype.html" file_size="1785" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="38db7876a58be85109d70c2e34c59434" inode="2671922" device="2304" mtime="941544900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/french.html" file_size="1304" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="89636e1a82dd919322f585ff46f366b6" inode="2672211" device="2304" mtime="942060360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/frhyph.html" file_size="1862" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9e63ae4efc6d640e7eeb509ba8de5f39" inode="2671634" device="2304" mtime="941544960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/fribrief.html" file_size="2041" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0a7f4ca5d1007417d66ce69ba0d662a6" inode="2672448" device="2304" mtime="941544960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ftetx.html" file_size="1915" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="158111ab244c538ccddef9defa4dfd52" inode="2672484" device="2304" mtime="941544960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ftn.html" file_size="1815" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5814ca2d91e0bd9ab27b6c2e9798b134" inode="2671849" device="2304" mtime="941544960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ftnright.html" file_size="1817" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="75f3e00b3b36358811d36286a5669cd1" inode="2672103" device="2304" mtime="941544960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/fullblck.html" file_size="1948" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="96909d14dba04b0ce572a80823cef8d1" inode="2672520" device="2304" mtime="941544960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/fullpict.html" file_size="1850" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e1ec03aad89808f35f3cc61d7672274c" inode="2671528" device="2304" mtime="941544960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/fundus.html" file_size="1920" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="de26c11e9d8a05e17ddbb85f456ebda7" inode="2672190" device="2304" mtime="941544960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/funnelweb.html" file_size="1898" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3e6fb988dcf573e1862200d0a9abc96e" inode="2671748" device="2304" mtime="941544960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/futhark.html" file_size="1760" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a5b4cda11f07619f02ce47f9b1cee17e" inode="2671438" device="2304" mtime="941545020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/g-brief.html" file_size="2113" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5754748f60e98fcf4fdd906e1e9d45f5" inode="2671955" device="2304" mtime="941545020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/galois.html" file_size="1750" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6de2cc30dbee19d9846ab09b500d7c55" inode="2671672" device="2304" mtime="941545020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/gb4e.html" file_size="1833" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3a5a3a0b18e267a69dc1bebd5fc625d2" inode="2672144" device="2304" mtime="941545020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/genealogy.html" file_size="1971" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="00eed7b6b36d977fb7b283a5ead97ee8" inode="2672328" device="2304" mtime="941545020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/genmisc.html" file_size="1369" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e1820bd3c84d4e9ca0edcea9328559cb" inode="2671969" device="2304" mtime="941545020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/gentl-gr.html" file_size="1945" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="74cdaf872c472daeabf44347145431b0" inode="2672456" device="2304" mtime="941545020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/gentle.html" file_size="1673" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="94d60fefe2d70dcd2dbe7ee84083d8a4" inode="2672551" device="2304" mtime="941545020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/geometry.html" file_size="2275" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a369c6e727a35121f8401acfb974aa0b" inode="2672073" device="2304" mtime="941545020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/geomsty.html" file_size="2142" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6bb82f99bf3e9825168cbae4fe89a550" inode="2672025" device="2304" mtime="941545020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/german.html" file_size="1860" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1b32f886d828f7500f61315667ee24f8" inode="2671695" device="2304" mtime="941545020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/germbib.html" file_size="1832" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3683fe1a5160c054661ecd35aa56cdcf" inode="2671787" device="2304" mtime="941545080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/germdoc.html" file_size="1306" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7107e49df840a1f60c558ae70569b9d5" inode="2671716" device="2304" mtime="941545080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/getrefs.html" file_size="1788" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4e94729b1645fbf11b5de1f6c279aa40" inode="2671473" device="2304" mtime="941545080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ghostscript.html" file_size="1951" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9364c2388a90da4c701ff1e5265b007d" inode="2671709" device="2304" mtime="941545080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ghostview-mac.html" file_size="1703" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d41b2f80358d4241f0fa95bfadfd551f" inode="2671592" device="2304" mtime="941545080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ghyphen.html" file_size="1861" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ee4b303cbf67133c819b0c5ceae5e991" inode="2671665" device="2304" mtime="941545080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/gleitobjekte.html" file_size="2116" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1c3d3bd03b6957462502e7dfeca2b315" inode="2671762" device="2304" mtime="941545080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/gloss.html" file_size="1985" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="09772412d9d46c443abccb3b8d45be48" inode="2671999" device="2304" mtime="941545080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/glosstex.html" file_size="2247" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e7ff186229d1153f63abae369a7a3da5" inode="2672399" device="2304" mtime="941545080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/gn-logic.html" file_size="1310" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d22cb9acc8f2d625457efcd69d01248f" inode="2671850" device="2304" mtime="941545080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/gnhyph.html" file_size="1811" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="795485c0f9d0c1c37079c59dd57f0b8f" inode="2671518" device="2304" mtime="941545140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/gnuplot-ps.html" file_size="1439" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e8721a7dfb87b8095bdc8a876c670553" inode="2671994" device="2304" mtime="941545140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/gnuplot.html" file_size="1804" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e49b39b09cc7b4d48492c907a51708c4" inode="2672060" device="2304" mtime="941545140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/go.html" file_size="1726" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="95abbb44184a732137e80a086577466e" inode="2671650" device="2304" mtime="941545140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/gothic.html" file_size="1777" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="70c9565b2a22fb7032d8818137b7ad53" inode="2671549" device="2304" mtime="941545140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/graphfig.html" file_size="2489" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="11bcaa082532bd7f5c759ba61b6b9419" inode="2671649" device="2304" mtime="941545140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/graphics.html" file_size="2306" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="75fbb2da376fc2461df502b8021d1147" inode="2671722" device="2304" mtime="941545140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/graphicx.html" file_size="1989" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a26cad80c8ec15c666c09507c97e76b5" inode="2671575" device="2304" mtime="941545140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/graphpap.html" file_size="1650" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="99e76f14aa3d3430ad7109fb1cd6acac" inode="2672202" device="2304" mtime="941545140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/gray.html" file_size="1674" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b73af9e155ca493c8ea1659ba6fd39a9" inode="2672479" device="2304" mtime="941545140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/greek4cbc.html" file_size="1817" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8621c448ab8c4be37844ff1d647508bd" inode="2671501" device="2304" mtime="941545200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/greek6cbc.html" file_size="1864" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f6c049b38b3255a90ca71aaadb91c9ce" inode="2672555" device="2304" mtime="941545200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/grfguide.html" file_size="2034" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2af109330f5b8535bde4ee99a621bf1e" inode="2671730" device="2304" mtime="941545200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/grfpaste.html" file_size="1934" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2479adabebc1191cb2cdffaa2674e05d" inode="2671900" device="2304" mtime="941545200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/grnumalt.html" file_size="2029" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bdb9e8e5362dc03a6600056e448369da" inode="2671554" device="2304" mtime="941545200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/grtimes.html" file_size="2024" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="baaf37dfc2d05fe397254a9f36e9af08" inode="2671809" device="2304" mtime="941545200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/gsftopk.html" file_size="1869" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8a9889a80e5d3aa530cd726abb168854" inode="2672191" device="2304" mtime="941545200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/gsview.html" file_size="2410" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e37093cc1ed2204599d039b7d3eac9e7" inode="2671648" device="2304" mtime="941545200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/gustlib.html" file_size="1383" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="365d7fded10e1762a0e320b3860e7f04" inode="2671993" device="2304" mtime="941545200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/hands.html" file_size="1733" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e557b7236c7d3707302e8a5f6f3c869a" inode="2672278" device="2304" mtime="941545200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/hangcaption.html" file_size="1771" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="eb8e2aa9c4371e510f86374d6e3e4268" inode="2672421" device="2304" mtime="941545260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/hanging.html" file_size="2010" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3c1765be053028f1c6ae83c96b24869d" inode="2672536" device="2304" mtime="941545260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/harpoon.html" file_size="1868" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d1bb845812d318bbc968eba2ba9aa643" inode="2671826" device="2304" mtime="941545260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/harvard.html" file_size="1985" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="28ead7c8f2ebd20a630afdb386b5ddf2" inode="2671441" device="2304" mtime="941545260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/harvmac.html" file_size="1840" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="feac8c0f8901fd500d024af864275dfc" inode="2671699" device="2304" mtime="941545260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/hellas.html" file_size="1796" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="347d05d6fbad26e99c4ce4c5f1a228c5" inode="2672119" device="2304" mtime="941545260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/here.html" file_size="1575" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f4bee39072074ec2cb247bdf2c4967cd" inode="2672128" device="2304" mtime="941545260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/hh.html" file_size="1816" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="04f1f53ff0a9651d3028dd47e785478a" inode="2672427" device="2304" mtime="941545260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/hhline.html" file_size="1701" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f9bfddef1f7be0038ed71dbdb9cf644e" inode="2671578" device="2304" mtime="941545260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/hilowres.html" file_size="2133" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7b5b0c2f577c12b7a4adfde306d3a22a" inode="2671779" device="2304" mtime="941545260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/histogr.html" file_size="1879" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="31bafdc25ea944877720dfadc99eb048" inode="2671717" device="2304" mtime="949333980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/hlatex.html" file_size="1774" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="981222e30034421f394f3e41cfd2fffe" inode="2671741" device="2304" mtime="941545320" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/hoekwater.html" file_size="1992" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fe723abd9ee78951a3d4b25f184d624a" inode="2671639" device="2304" mtime="941545320" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/hrhyph.html" file_size="1280" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="129a86536bb0dfe6d112249905a78c77" inode="2671435" device="2304" mtime="941545320" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/html.html" file_size="1757" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c83b1d063e3b1ef538b10bd56949e6db" inode="2671494" device="2304" mtime="941545320" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/html2latex.html" file_size="1783" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e96fe8ba61465d1ba37cf05825af980a" inode="2672463" device="2304" mtime="941545320" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/huhyph.html" file_size="1843" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="de04eccb33ff18de09d87e09cc3600c9" inode="2671896" device="2304" mtime="941545320" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/huncial.html" file_size="2040" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="947d147502235c27301232968ff3b048" inode="2671760" device="2304" mtime="941545320" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/hvdashln.html" file_size="2066" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4e1892f438a876e68aee3ee1c7fbb4f7" inode="2671616" device="2304" mtime="941545320" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/hvmath.html" file_size="2110" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6e598c93a5e4b31707f0be80adf5ee27" inode="2672088" device="2304" mtime="941545320" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/hypbmsec.html" file_size="1984" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8e755da879be32f3b96cbaf3d6c70d83" inode="2672166" device="2304" mtime="941545380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/hyper.html" file_size="2177" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f80678c6c73cb333234b85a0b078ba32" inode="2671728" device="2304" mtime="941545380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/hyperlatex.html" file_size="1871" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="849b1421df0c923668ea1d59c95f2b15" inode="2672217" device="2304" mtime="948382980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/hyperref.html" file_size="2345" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="df1086e9f22c56e3112c8d5055eb6ae3" inode="2671527" device="2304" mtime="941545380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/hyphenat.html" file_size="2164" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d5aaa7bea91b418cbd4c0328356ebc66" inode="2671617" device="2304" mtime="941545380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/hypht1.html" file_size="1966" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7b91b814185ca28c0fa1998eef5db375" inode="2671540" device="2304" mtime="941545380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ibm.html" file_size="1300" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="aa92cb0aaa408fea2e329894ce4eba34" inode="2672079" device="2304" mtime="941545380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/idealfonts.html" file_size="1958" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="faf1c276890327352f56b1aedc65308a" inode="2672215" device="2304" mtime="941545380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ieeepes.html" file_size="2036" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a350edb4926af216c95464e0a10021e8" inode="2671943" device="2304" mtime="941545380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ifacmtg.html" file_size="1871" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="405258bcdb741e98994120a9e1cbb50c" inode="2672534" device="2304" mtime="941545380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ifthen.html" file_size="1654" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c501ebf4890ee561718cb8ddc07182c4" inode="2671944" device="2304" mtime="941545440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/imac.html" file_size="1937" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8d6e8d6ad151deb666f98fadccd67b8e" inode="2671467" device="2304" mtime="948115020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/includex.html" file_size="2659" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d7f94bc88bc53f5fcb051a3f4efcde9d" inode="2671453" device="2304" mtime="941545440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/indentfirst.html" file_size="1708" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c96ecd73a263a4cffd23e6524db81ff4" inode="2671937" device="2304" mtime="941545440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/indxcite.html" file_size="1998" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="89a42f0f489c0b685d1d9a74ad3c3ee1" inode="2672473" device="2304" mtime="941545440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/info.html" file_size="1306" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a6a39a65b90876aa0392716ad4f0dfce" inode="2672361" device="2304" mtime="941545440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/inhyph.html" file_size="1666" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2b62a877814c2068706906fa4a520f02" inode="2672297" device="2304" mtime="941545440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/initials.html" file_size="1713" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3025ba23863ac080d28764f1609266fd" inode="2672061" device="2304" mtime="941545440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/inlinebib.html" file_size="1693" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b1815e7d4cc4f4fbd5c62ea0986e4675" inode="2672396" device="2304" mtime="941545440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/inputenc.html" file_size="1641" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="673c837652ee717ec492d427e20e958d" inode="2671907" device="2304" mtime="941545440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/insbox.html" file_size="1840" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="984f04879e0cca0d20a9c6884560ccf2" inode="2672529" device="2304" mtime="941545500" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ipa.html" file_size="1300" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7cd93491d44b686598772abee5877195" inode="2672185" device="2304" mtime="941545500" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/isostds.html" file_size="2198" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e0e37b86aff79f23cc1ea3f04caed6f3" inode="2671906" device="2304" mtime="941545500" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ithyph.html" file_size="1673" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8d53501217e91057efb94326575ce37a" inode="2671733" device="2304" mtime="941545500" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/izhitsa.html" file_size="1773" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8be5abf60f2330e13746f747427a1237" inode="2671504" device="2304" mtime="941545500" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/jadetex.html" file_size="1817" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="42970a124619af73ba21e854c2a94b64" inode="2671835" device="2304" mtime="941545500" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/javatex.html" file_size="1662" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e46a61371850a47689b1036e960c25b5" inode="2672541" device="2304" mtime="944655660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/jeep.html" file_size="1672" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="72c71e398a8510b2dd535c8d8cadf525" inode="2672301" device="2304" mtime="941545500" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/jhep.html" file_size="1349" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="efbbece49b175fa481e4dd487400268f" inode="2672137" device="2304" mtime="941545500" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/jknappen.html" file_size="1990" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="62c4dc19fbe5a1c0c527b2412366713e" inode="2671514" device="2304" mtime="941545500" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/jpeg2ps-os2.html" file_size="1727" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="59296b2aa8e8957c9417f9d075b535fc" inode="2671551" device="2304" mtime="942060360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/jpeg2ps.html" file_size="2258" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="166d864c37bc75c08cd57ffb9faa1bc7" inode="2671515" device="2304" mtime="941545500" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/jqt1999.html" file_size="1951" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="83572732b942630e990e531ab2997a94" inode="2671960" device="2304" mtime="941545560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/jsmisc.html" file_size="1829" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1a165b0fe2010868c6899f4368a2685f" inode="2672511" device="2304" mtime="941545560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/jspell.html" file_size="1676" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bb53f2c27692eb3507ae70b7f8eeda62" inode="2671821" device="2304" mtime="941545560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/jura.html" file_size="2087" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f560e20a22fb6678041c01afe4062ae1" inode="2671908" device="2304" mtime="941545560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/jurabib.html" file_size="2265" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b1ed565ed729ad98a2e21d3711cd366e" inode="2671689" device="2304" mtime="941545560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/kalendar.html" file_size="1844" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d9dffdffb007eff1bacc70e2bcdea1c7" inode="2672322" device="2304" mtime="941545560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/kalender.html" file_size="1861" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0e2779d84b021a376018686a89bfbbf5" inode="2671831" device="2304" mtime="941545560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/karnaugh.html" file_size="2297" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="60c13b8c1b1ddcf44333eac4711a749d" inode="2671895" device="2304" mtime="941545560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/kdgreek.html" file_size="1788" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c0ad0e0d7d3a9dc064452556f267d888" inode="2671959" device="2304" mtime="941545560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/kix.html" file_size="1837" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c1e11b6cbad24edb26d884675acda26b" inode="2672149" device="2304" mtime="941545560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/kluwer.html" file_size="2133" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2a679809813d538a6789d8067f381c4b" inode="2671448" device="2304" mtime="941545620" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/knst.html" file_size="1795" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e369414117b1c5b2199e5007828e77c9" inode="2671533" device="2304" mtime="941545620" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/knuth.html" file_size="1798" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ed94ed1b5380ef92f3598fcea0d0e346" inode="2671852" device="2304" mtime="941545620" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/koi8.html" file_size="2117" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4cd1e537d3e5c812fc6f65d403288906" inode="2671458" device="2304" mtime="949333980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/koma-script.html" file_size="2265" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4d2b14d7a8aa5faeaf7cd895a96c41da" inode="2671509" device="2304" mtime="941545620" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/kpathsea.html" file_size="1365" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6143a223415d242c9734e644932e8a6b" inode="2671723" device="2304" mtime="941545620" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/kuvio.html" file_size="1820" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="44ee41fcdc5ef82a18f83b17c878bdd5" inode="2672466" device="2304" mtime="941545620" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/labels.html" file_size="2175" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8f4fe518c86a4d6d252c982819b7df94" inode="2672099" device="2304" mtime="941545620" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/lamstex.html" file_size="1772" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bf48b7c65fc676971bd9c61dd58d2464" inode="2671951" device="2304" mtime="941545620" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/lastpage.html" file_size="2343" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bc801bd4c3a92131e1b75214d53ca7b1" inode="2671561" device="2304" mtime="941545620" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/lated.html" file_size="1866" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c9e2934afb4f29dd5515a33db136ebeb" inode="2671875" device="2304" mtime="941545680" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/latex.html" file_size="1932" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c15e537edb2bf263eafc16de7076a0c1" inode="2672508" device="2304" mtime="941545680" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/latex209.html" file_size="1734" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a39323dd45cde4f93d4a949744636c22" inode="2671492" device="2304" mtime="941545680" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/latex2e.html" file_size="1952" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e1c8a09d9a5bec838226d0b7e7f6361c" inode="2671451" device="2304" mtime="947000880" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/latex2html.html" file_size="2283" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e2672abba317b596c96e0e8e2891bf59" inode="2672327" device="2304" mtime="941545680" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/latex2man.html" file_size="1883" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ec0f925ae4bf4718c733aaf83ae82568" inode="2672064" device="2304" mtime="942423780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/latex2rtf.html" file_size="1779" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="138dd84a11052a0a1faf93e13a08a13f" inode="2671693" device="2304" mtime="941545680" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/latexcad.html" file_size="1660" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="562be325a11141e7c00b57d59cdf1a21" inode="2672138" device="2304" mtime="941545680" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/latexfonts.html" file_size="1314" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="651878f5e112ed27604bf08fbfa46fef" inode="2672250" device="2304" mtime="941545680" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/latexmk.html" file_size="1964" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="76a82800f538891118200c34bd3099cb" inode="2672477" device="2304" mtime="941545740" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/latexn.html" file_size="1877" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3416e450845fd24b037e7f76ccf4afb9" inode="2671767" device="2304" mtime="941545740" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/latin2jk.html" file_size="1927" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="49f5e042f118e59adf726df8af4bbe58" inode="2671876" device="2304" mtime="941545740" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/layout.html" file_size="1798" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="342277957ca8cdc8ee4e0f24eb0974c3" inode="2672557" device="2304" mtime="941545740" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/layouts.html" file_size="2200" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="75bf79b291febdf7efd0ce1e54d0093e" inode="2671583" device="2304" mtime="941545740" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/leaflet.html" file_size="2066" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="13a6d0e7b3e3b8fc743703ce959367e3" inode="2672053" device="2304" mtime="941545740" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/leftidx.html" file_size="1956" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b2967486bf147fc4bb1be5a8ada9fcfd" inode="2671740" device="2304" mtime="941545740" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/letter.html" file_size="1662" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bb5cef5934c2d9b6d0eb136ccba10590" inode="2671819" device="2304" mtime="941545740" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/letterspacing.html" file_size="1630" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d130834d7a2d6bc08d3bf766616dd1ac" inode="2672078" device="2304" mtime="941545740" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/lettrine.html" file_size="1987" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="75ceaf50a8f513be9605bdda776b8400" inode="2672235" device="2304" mtime="941545800" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/levy.html" file_size="1850" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="62cdc8e456d742312671f0464cbdbf30" inode="2671915" device="2304" mtime="941545800" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/lexikon.html" file_size="1741" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0d7adc98d96397291b981792a61d6760" inode="2671982" device="2304" mtime="941545800" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/lgreek.html" file_size="1846" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b843821df139820cb2d12515e28ff020" inode="2671519" device="2304" mtime="945653040" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/lgrind.html" file_size="2157" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bd72234bcaec35b1a5f0674476d696c0" inode="2671654" device="2304" mtime="941545800" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/lh.html" file_size="1805" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="64a2b52d7905eef4b11283f6ef0b6cee" inode="2672488" device="2304" mtime="941545800" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/lhcyr.html" file_size="1969" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="db0c35d62155de2cb091c5bc5e397613" inode="2672483" device="2304" mtime="941545800" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/lilypond.html" file_size="2053" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0bd3f28563e4f30fda18c2c49279d388" inode="2672370" device="2304" mtime="941545800" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/linearb.html" file_size="1902" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f9e92c6ba13e5e2fae560e6e37da8809" inode="2672514" device="2304" mtime="941545860" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/lineno.html" file_size="2215" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e381f903603c63a4fcc10ebfdab7a58a" inode="2671914" device="2304" mtime="941545860" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/linguex.html" file_size="2064" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cedd2f4e3c5779b5c226358a4d79260c" inode="2672359" device="2304" mtime="941545860" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/lintex.html" file_size="1844" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c3347dc8aa63ebce7a3a1dfc26b635c5" inode="2671614" device="2304" mtime="941545860" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/lips.html" file_size="2468" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9b4be1148d92866dc69fc4289162349e" inode="2671471" device="2304" mtime="941545860" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/listing.html" file_size="2136" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c7bc4a53436b18e80c7ad929ffbc4e69" inode="2671696" device="2304" mtime="941545860" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/listings.html" file_size="2381" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9e152d5091766a5decb73f4516dbb744" inode="2672341" device="2304" mtime="941545860" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/lkort.html" file_size="1302" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b71faaea71b25db3e1fc38f743eec287" inode="2672107" device="2304" mtime="941545860" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/llncs.html" file_size="1805" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="302219ab40d931fb21b4f87c62846b02" inode="2672443" device="2304" mtime="941545920" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/localloc.html" file_size="1872" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="54b2c2e4350cb90461cb4c17eb2a8831" inode="2672298" device="2304" mtime="941545920" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/logic.html" file_size="1321" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="33595ad3c3ea30a3432bc222d3d2e33e" inode="2672210" device="2304" mtime="941545920" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/logo-ps.html" file_size="1760" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4914973ae8bd8f42dd9f256e7214bf7d" inode="2671705" device="2304" mtime="941545920" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/lollipop.html" file_size="1771" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f64c4da0371f985ac164cfac566deedc" inode="2672063" device="2304" mtime="941545920" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/longtable.html" file_size="2040" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="45dd0072f24a7e5e8d100012dd63d228" inode="2671810" device="2304" mtime="941545920" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/losymbol.html" file_size="1699" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bd8c21c264faf13672d50eec8e356a6b" inode="2671495" device="2304" mtime="941545920" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/lscape.html" file_size="2228" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="46966ce7cdeef07c609ce077445edf6e" inode="2672030" device="2304" mtime="941545920" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/lshort-english.html" file_size="2448" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3b9158c90d76a04056f9ed8e0282e8d6" inode="2672360" device="2304" mtime="941545920" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/lshort-finnish.html" file_size="2000" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="29eddab101890437ade6e1262688dc48" inode="2671450" device="2304" mtime="941545980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/lshort-french.html" file_size="1891" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="97a39a07d596f1e93beba586aa0ee518" inode="2671568" device="2304" mtime="941545980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/lshort-german.html" file_size="1726" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="639dc0ce194a43cb8ee097f1c148b0f6" inode="2671666" device="2304" mtime="941545980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/lshort-mongolian.html" file_size="1912" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="624a7f8bd53694f9bc79565fd5eca827" inode="2672274" device="2304" mtime="941545980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/lshort-polish.html" file_size="1879" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1fd8ed6ef604aa59c2aed4a1689e5377" inode="2671505" device="2304" mtime="941545980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/lshort-russian.html" file_size="1742" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a2fd1b37ace8ed6f2887e85efa649efd" inode="2672042" device="2304" mtime="941545980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/lshort-spanish.html" file_size="1742" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1c5e6dd82128296f080d9954c6c4d136" inode="2672365" device="2304" mtime="941545980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ltablex.html" file_size="2018" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="aaa68b67822c7028cc720adf83c25386" inode="2671603" device="2304" mtime="941545980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ltnews.html" file_size="1802" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="63df0a5dbc14da7021493404c1231692" inode="2672023" device="2304" mtime="941545980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ltoh.html" file_size="1995" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="516eb852a235ea09de0226c31825979e" inode="2672121" device="2304" mtime="947800440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ltt.html" file_size="1818" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ddeaddbc78fe19827a5b2779b951539b" inode="2672230" device="2304" mtime="941546040" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ltx2rtf.html" file_size="1787" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8ce69db57ffe39bc73e2edd62d7a657e" inode="2671702" device="2304" mtime="943959960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ltx2x.html" file_size="2147" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cd93d9fbc26f0ae2ec069e13895a7577" inode="2672406" device="2304" mtime="941546040" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ltxbase.html" file_size="1750" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ab483643bb54fc2903754aba91a173a9" inode="2672495" device="2304" mtime="941546040" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ltxdoc.html" file_size="1770" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c3d36c53d54d84e515aad4cb94865f45" inode="2672535" device="2304" mtime="941546040" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ltxinput.html" file_size="1945" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e7e8057573a392dc4daa35b82af62052" inode="2672403" device="2304" mtime="941546040" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ltxmisc.html" file_size="1818" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1c6217ae35833beb6a0408a81d7a28f8" inode="2671958" device="2304" mtime="941546040" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ltxsrc.html" file_size="1648" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d10aa72e728be37cb8dc8fd51d5a7395" inode="2671939" device="2304" mtime="941546040" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ltxtable.html" file_size="1861" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="48b47c550d38677d4d735b840dacb5fa" inode="2672033" device="2304" mtime="941546040" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/lucida.html" file_size="1773" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4e7982c701ff84a9b09a946086ab6dfa" inode="2671794" device="2304" mtime="941546100" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/lucold.html" file_size="2492" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ff414e09ece92e94b87519b3bbdbe783" inode="2672009" device="2304" mtime="941546100" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/lw35nfsx.html" file_size="2108" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9ba74cd43563226d49cf726c81998176" inode="2671941" device="2304" mtime="941546100" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ly1.html" file_size="1913" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fb5c4c9160cbee77750243cacd56fff3" inode="2672446" device="2304" mtime="941546100" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/m-pictex.html" file_size="1803" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7906106b4e872b9c135a72d5428c0702" inode="2672218" device="2304" mtime="941546100" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/macbibtex.html" file_size="2039" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b7e8ca8054502ad048bd5f9d9a40a337" inode="2671462" device="2304" mtime="941546100" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/macgreek.html" file_size="1730" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e4d8f6c3582831f707d26ae9e13504f3" inode="2671685" device="2304" mtime="941546100" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/magaz.html" file_size="1876" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ddb99e0ef5fe142d71cfa12b3f98b8cb" inode="2671477" device="2304" mtime="941546100" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mailing.html" file_size="1843" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="dcdddb526c9e8c1d32bdb81187336f93" inode="2672444" device="2304" mtime="942060360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/makefonts.html" file_size="1920" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5ef1e31563e37a7da4a2887ec895992a" inode="2672546" device="2304" mtime="941546160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/makeindex.html" file_size="2152" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="61c14e8ced8d15afb60cab750f048a05" inode="2672418" device="2304" mtime="941546160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/malayalam.html" file_size="1831" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="06caaa99b9d5610494efe32573c6a7a6" inode="2672400" device="2304" mtime="941546160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/malvern.html" file_size="1754" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c3f7cb91e37626949b45747932db2c7c" inode="2671866" device="2304" mtime="941546160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/manfnt.html" file_size="1832" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="63a0d60db944ad9e90444c65a609ea76" inode="2671814" device="2304" mtime="941546160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/manyfoot.html" file_size="2304" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="79147e9081f19b8a53a5bb6e8daf8924" inode="2671662" device="2304" mtime="941546160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mapcodes.html" file_size="1881" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b9815b5c0c7b68b4880160ed03efcff7" inode="2671425" device="2304" mtime="941546160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/maple.html" file_size="1858" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4a7a5c94bd9bcc633180382e66ff4904" inode="2671990" device="2304" mtime="941546160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/maplems.html" file_size="1199" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="64ac0227f32889d5862a188b4b43fdf5" inode="2672051" device="2304" mtime="941546160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/margbib.html" file_size="1921" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="486d29d2c8b9f357aa2a3458764fa4fe" inode="2672050" device="2304" mtime="941546160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/marvosym-mac.html" file_size="1942" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ed4288858b81b4dd8a06924dfc01775e" inode="2671853" device="2304" mtime="941546220" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/marvosym.html" file_size="2218" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9811c67185b064b8cf71713c00755085" inode="2672339" device="2304" mtime="941546220" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mathcmd.html" file_size="2042" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2dcee125e1cda73be0412571cfac8717" inode="2671735" device="2304" mtime="941546220" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mathcomp.html" file_size="2004" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="624f40b9eb6241fc221a084a87d163dc" inode="2671882" device="2304" mtime="941546220" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mathematica.html" file_size="2073" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1012ea75c4c3b751d9b0f807f56c44a0" inode="2671898" device="2304" mtime="941546220" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mathenv.html" file_size="2484" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6b8ac9851641a56a1368e5c1dd316c40" inode="2672568" device="2304" mtime="941546220" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mathinst.html" file_size="2110" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e4c3630c07a8c6739a004646a996e58d" inode="2671698" device="2304" mtime="941546220" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mathkit.html" file_size="1751" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d8439efeca5ad3ddf4da1843e6b5b39d" inode="2671604" device="2304" mtime="941546220" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mathpple.html" file_size="2130" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4ab27bc040d680a374c4d46c089fb7ac" inode="2672348" device="2304" mtime="941546280" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mathptm.html" file_size="1769" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="af2d7d14dd493bcd4c25c1a7d4e055ea" inode="2671887" device="2304" mtime="941546280" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mathrsfs.html" file_size="1844" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3495a200f6079880664482eb222e043a" inode="2671715" device="2304" mtime="941546280" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mathspad.html" file_size="1807" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c5e9acf8392abe651ebfa904106f89eb" inode="2671888" device="2304" mtime="941546280" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mathspic.html" file_size="2172" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="61144077e2cae59bbb23a48b5c4774e4" inode="2671770" device="2304" mtime="941546280" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mathtime.html" file_size="1968" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="815431666f07898aaef720ae23d592c0" inode="2671464" device="2304" mtime="941546280" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mcite.html" file_size="1903" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7d5220e1760b66cb0ec681505e68a495" inode="2672104" device="2304" mtime="941546280" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mdwtools.html" file_size="2218" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="58a23ae276bc722f6616ad4247e89376" inode="2672398" device="2304" mtime="941546280" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/meta-mode.html" file_size="2195" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="dc3b32d2223dc664f416080801b40497" inode="2671885" device="2304" mtime="941546340" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/metapost.html" file_size="1872" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d3e7ccfd5dd8f817f4fd293c78eaff01" inode="2672566" device="2304" mtime="941546340" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/method.html" file_size="1999" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1230d27e03d618216ff9a1558ea3be7b" inode="2671498" device="2304" mtime="941546340" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mex.html" file_size="2017" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="35e4916ec597b629c8a0983d3bc7541c" inode="2671564" device="2304" mtime="941546340" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mf-ps.html" file_size="2078" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fe470f6e709224e88c4b01654c871db8" inode="2671813" device="2304" mtime="941546340" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mf2pt3.html" file_size="1750" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7a671dd82ac4e046411eef43b8ade1a0" inode="2671952" device="2304" mtime="941546340" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mf2tex.html" file_size="1995" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7ea9cbeee7810bbf7c80479cb9f96370" inode="2672524" device="2304" mtime="941546340" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mff.html" file_size="2075" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b60a3eecdceb9e15d9fdb2a0be297771" inode="2672293" device="2304" mtime="941546340" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mflogo.html" file_size="2076" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fa050f2cfbf458239ac7d0049a6f38a3" inode="2671823" device="2304" mtime="941546400" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mfnfss.html" file_size="1887" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="75cc88f5f549977e7c4c7ca743344eb3" inode="2671877" device="2304" mtime="941546400" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mfpic.html" file_size="1828" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b377147a39487157cbd1d4ef0a0db0db" inode="2671933" device="2304" mtime="941546400" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mhs.html" file_size="1300" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0917aa85991b06cf9618a786f347c6cd" inode="2672513" device="2304" mtime="941546400" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/midnight.html" file_size="1797" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a2b4d486e709a972c17274bd226a5562" inode="2671739" device="2304" mtime="941546400" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mif2xfig.html" file_size="1445" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="80847f313ab65401f539fc34bfe9b00c" inode="2671784" device="2304" mtime="941546400" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/miktex-axp.html" file_size="1703" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2f58455de25e45749e2666dd94a63dba" inode="2672410" device="2304" mtime="945653100" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/miktex.html" file_size="2888" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="78ceaf9930dedae794e7a3c534d8dfb7" inode="2671873" device="2304" mtime="941546400" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/miniltx.html" file_size="1788" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="04c22bb7fcefc898bc7ebc7340dc8062" inode="2671719" device="2304" mtime="941546460" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/minitoc.html" file_size="1900" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="36a780022c5c2f9255089221f0af51f5" inode="2672563" device="2304" mtime="941546460" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mirr.html" file_size="1859" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0a1303202919b386aa5e7916d8c99a55" inode="2672326" device="2304" mtime="941546460" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mitpress.html" file_size="1690" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="40993d28f2e2f76a5f7bd5df01481576" inode="2671694" device="2304" mtime="941546460" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mkpic.html" file_size="2025" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e2c7120dd07f54b428148583dadfaac9" inode="2672299" device="2304" mtime="941546460" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mla.html" file_size="1732" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b771a89131414c29588e798a827d045f" inode="2671800" device="2304" mtime="941546460" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mlbib.html" file_size="1769" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="db9c3efffba13feb5920f93d0da77758" inode="2672423" device="2304" mtime="941546460" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mltex.html" file_size="1899" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1f701140116d2dfa6420117d032783a9" inode="2672409" device="2304" mtime="941546460" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mmtools.html" file_size="2089" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="51cc2d1b8c6fc2b1c31a0b1faba75e26" inode="2671644" device="2304" mtime="941546520" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mnras.html" file_size="1861" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f764784cd9b842c57aa3a81fbcbcbe89" inode="2672407" device="2304" mtime="941546520" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/modes.html" file_size="1934" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="55d101a03609a6fb696cec4dfeac08c0" inode="2671932" device="2304" mtime="941546520" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/monotype.html" file_size="1852" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7d4c00befa6388042b7ea248717b36cc" inode="2671663" device="2304" mtime="941546520" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/monster.html" file_size="1465" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f9b7c2b212ef7feeb6e8dc205a45b825" inode="2671497" device="2304" mtime="941546520" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/montex.html" file_size="1874" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ae6f605fa0b562b40c702b216d80b5ea" inode="2671726" device="2304" mtime="941546520" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/moredefs.html" file_size="2423" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="329db912e785dc1dbb65c139045e881e" inode="2671729" device="2304" mtime="944735160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/morefloats.html" file_size="2074" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="353c8da3b22bdb7aabb14e1e293937d7" inode="2671834" device="2304" mtime="941546520" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/morehelp.html" file_size="2232" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="463b23046fca76cd4b59558a1bce0f1f" inode="2672537" device="2304" mtime="941546520" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/moresize.html" file_size="2274" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9b5b9a281549dd2a47232a1fbf77b8ba" inode="2671544" device="2304" mtime="948115080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/moreverb.html" file_size="2098" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f21a64f8065a7d7928fde795ac10ac7b" inode="2671647" device="2304" mtime="941546580" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/morse.html" file_size="1753" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b5e4396e8e34e52ba534c917d4698b26" inode="2671536" device="2304" mtime="941546580" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mpattern.html" file_size="1938" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f87e1a3cef2811bdd68a14a7eaeb91f2" inode="2672219" device="2304" mtime="941546580" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mpfnmark.html" file_size="2177" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="32e8a0f46f2144facbe10adec8fc8089" inode="2671983" device="2304" mtime="941546580" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ms.html" file_size="1915" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4b1ca384984b74a49b2225ab17ec61f6" inode="2672390" device="2304" mtime="941546580" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mslapa.html" file_size="2047" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5f0c28d591fb4f744b0067c4bb09a9f4" inode="2671936" device="2304" mtime="941546580" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mt11p.html" file_size="2118" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="743458b543d2a97bfb243c787241cb9e" inode="2671626" device="2304" mtime="941546580" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mtbe.html" file_size="1825" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="80d1021e4c2b0106903e7972eb58ecd9" inode="2672500" device="2304" mtime="941546640" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/multenum.html" file_size="1861" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fd2b0bd04194c4bb59b36d4264a86ff5" inode="2671623" device="2304" mtime="948383040" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/multibib.html" file_size="2261" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8a17ef2001bca4bb7d694c9472a93b85" inode="2672282" device="2304" mtime="941546640" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/multicol.html" file_size="2003" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="63084a4fcabb3672abebf03d0fa6b1a3" inode="2672212" device="2304" mtime="941546640" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/multido.html" file_size="1674" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="79e79f410274917e00c734118ec6fb25" inode="2672515" device="2304" mtime="947800440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/multirow.html" file_size="1983" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1a8c720d4277878fa7922d3c44eb9cff" inode="2672434" device="2304" mtime="941546640" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/multitoc.html" file_size="1986" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9dac1075409bfde52461f4cf2aa0f7a6" inode="2671529" device="2304" mtime="941546640" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/musicref.html" file_size="1194" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7569d6b85ed0005c2ff8ec056e0d57cf" inode="2672014" device="2304" mtime="941546700" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/musictex.html" file_size="1813" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="289e698d53e3a4f824993ee425b5fb71" inode="2672046" device="2304" mtime="941546700" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/musixtex.html" file_size="1774" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1bc0c5e00f2be9cf19a0497b42331a18" inode="2671491" device="2304" mtime="941546700" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/muthesis.html" file_size="1919" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="dcd976706cc8ce55b154dc96b59b93af" inode="2671972" device="2304" mtime="941546700" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mxedruli.html" file_size="1729" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="223f566e37e07c1af3f5476f35e6a23d" inode="2672203" device="2304" mtime="941546700" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/mylatex.html" file_size="1712" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fe699c77cd953c0e30de9421a475d49a" inode="2672153" device="2304" mtime="941546700" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/myletter.html" file_size="1854" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6eba65ea17a836d22ddb0fe68fbb36c5" inode="2672426" device="2304" mtime="941546700" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/nassflow.html" file_size="1868" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="77779eb763c8d0f280d587edb5262785" inode="2671742" device="2304" mtime="941546700" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/natbib.html" file_size="2107" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a73406c8f90893a34cf3f59451b5d6a0" inode="2672413" device="2304" mtime="941546700" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/nb4latex.html" file_size="1674" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="504a7bcaa0244ebd38fb71ba372e8644" inode="2672240" device="2304" mtime="941546760" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/nccfoots.html" file_size="1869" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="42760229d57b19ec7cc200196ca688b5" inode="2671558" device="2304" mtime="941546760" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ncctools.html" file_size="1909" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0381388a6ec226af2ca5fcaf6d4a65c6" inode="2671861" device="2304" mtime="945256920" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/nestquot.html" file_size="1988" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6a50a83937e57ffdf88625c405bcc5b2" inode="2671627" device="2304" mtime="941546760" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/netpbm-win.html" file_size="1765" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2da8ca0471f93981b3de6d5d88482fc6" inode="2672412" device="2304" mtime="941546760" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/newalg.html" file_size="1871" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5e2af986c39e65c18978290100ea5b74" inode="2671758" device="2304" mtime="941546760" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/newclude.html" file_size="2880" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="87e1a0b11ceac67e576bae005e465b15" inode="2672161" device="2304" mtime="941546760" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/newlfm.html" file_size="2342" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e3674c170226525b8e1945aade4f5749" inode="2671655" device="2304" mtime="941546760" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/newsletr.html" file_size="1821" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="98a44e75c6e793b5a4a6110d7b8ce073" inode="2672334" device="2304" mtime="941546820" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/newthm.html" file_size="1969" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="358e8331134a31542f965cf95faba181" inode="2672068" device="2304" mtime="941546820" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/niceframe.html" file_size="1872" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d899363452988bfe8b817b403d79e605" inode="2671913" device="2304" mtime="941546820" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/noindent.html" file_size="1219" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e842de69f3de45285d3fec2c09c66617" inode="2672506" device="2304" mtime="943451700" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/nomencl.html" file_size="2023" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="495f7961b495dd351041592c2cdfefc9" inode="2672258" device="2304" mtime="941546820" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/nonfloat.html" file_size="1966" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="02afa93f13eea36c0111f72d8e6a6c3a" inode="2672364" device="2304" mtime="941546820" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/nopageno.html" file_size="2269" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0cdc6a917e02381f6d57e688a783a2a3" inode="2672136" device="2304" mtime="941546820" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/norbib.html" file_size="1734" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="44445232dae00bf9f1061ab10836b179" inode="2671765" device="2304" mtime="941546820" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/nrc.html" file_size="1847" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="70fcd36ff6c0a1b8274d639d16f1a3ab" inode="2671883" device="2304" mtime="941546880" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ntemacs.html" file_size="1666" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b371487fe766091b209063fa7decdf9d" inode="2672146" device="2304" mtime="941546880" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ntg.html" file_size="1301" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="022116e34e5a329d189f4a41758c6715" inode="2671539" device="2304" mtime="941546880" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ntgclass.html" file_size="1969" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4b89444330952d4732c38615b04b52ba" inode="2671624" device="2304" mtime="941546880" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ntheorem.html" file_size="2141" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f73e7afaf3f31437b0f27414bdee2606" inode="2672253" device="2304" mtime="941546880" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/numline.html" file_size="1897" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a68faeee2eecdd74197df67f8e01630d" inode="2671995" device="2304" mtime="941546880" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/obas.html" file_size="1459" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="df55f3791c88e207009d24af983ee907" inode="2672353" device="2304" mtime="941546880" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/objectz.html" file_size="1851" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e0d7ca2f29ccf95c8457d8b68146dd36" inode="2672177" device="2304" mtime="941546880" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/oca.html" file_size="1710" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d88b8cc6f3f0c6a746714620394742e7" inode="2672383" device="2304" mtime="947800440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ochem.html" file_size="1818" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6e5fd9c323b0fb528f8132d2878a2c8f" inode="2672116" device="2304" mtime="941546940" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ocr-a.html" file_size="1729" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="976ec2dad1781144577c5fb216d8d8f8" inode="2672135" device="2304" mtime="941546940" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ocr-b.html" file_size="1610" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4cda2c941a37c31722b21352e60765ad" inode="2672048" device="2304" mtime="941546940" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ogham.html" file_size="1748" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3c2f13d0629407be5a9922de880f9bff" inode="2671736" device="2304" mtime="941546940" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ogonek.html" file_size="1848" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="31d6a9c4eeb3e6ca1d945a6aa0b09783" inode="2672214" device="2304" mtime="941546940" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/oldstyle.html" file_size="1919" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c1ce0aa0291834328a465afa56ef0474" inode="2672417" device="2304" mtime="941546940" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/omega.html" file_size="1647" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="af12022efac2141c6c0a3dd993d048de" inode="2671957" device="2304" mtime="941546940" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/omegabase.html" file_size="1309" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="69ad7e382ff9d205ef0b5a64ba0c6e77" inode="2672291" device="2304" mtime="941546940" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/omegafonts.html" file_size="1294" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cb756c25921c7a0ac1de0852c475d3be" inode="2671746" device="2304" mtime="941546940" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/onepagem.html" file_size="1856" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d70b487232c24f0ec3c50a9a06fbf3f0" inode="2672092" device="2304" mtime="941546940" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/optional.html" file_size="1731" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0913ca2c8f473de19580f3eb607a98ad" inode="2672347" device="2304" mtime="941547000" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/oriya.html" file_size="1637" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d7520b32a0355ae3d115912bfbcf12c9" inode="2671599" device="2304" mtime="929475960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/oryia.html" file_size="1644" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bcc62e1d649d85529c4a1042ce3c9e65" inode="2671706" device="2304" mtime="941547000" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/os2tex.html" file_size="1659" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="27d22f3c5cb689e52d2348db76ce00f9" inode="2671874" device="2304" mtime="941547000" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/osmanian.html" file_size="1781" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="01f7b145555b7c2d55b0439a6b65110d" inode="2671502" device="2304" mtime="941547000" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ot2cyr.html" file_size="1795" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c59a95662fee8c2b7962fad5112a73ad" inode="2671600" device="2304" mtime="941547000" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/outliner.html" file_size="1987" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b2077b9651fa91a9bb01f6cbb68d49f3" inode="2672029" device="2304" mtime="941547000" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/overcite.html" file_size="1785" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3e28e2c4c01c9c0dea04f7d5d3f089ce" inode="2672152" device="2304" mtime="941547000" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/overpic.html" file_size="2203" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="dc21f41911c089d1b77880a93f96f9a6" inode="2671749" device="2304" mtime="941547000" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/overword.html" file_size="1888" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ebb5c6460e2828827ab4a0e1c959d2a3" inode="2672391" device="2304" mtime="941547000" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/oxford.html" file_size="2009" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9a13f3c6013c982dc86ce1d75f1a1813" inode="2672548" device="2304" mtime="941547000" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/oztex-german.html" file_size="1717" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="50144455dad5c055bf4935750f87db84" inode="2671924" device="2304" mtime="941547060" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/oztex.html" file_size="1840" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="123482906d9a7f0ca3a5ca65dbbd560d" inode="2672498" device="2304" mtime="941547060" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pacioli.html" file_size="1868" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0059af7f3f2bde10499e9d7297ef30e3" inode="2672012" device="2304" mtime="941547060" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pagedraw.html" file_size="1736" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ed5aa2609a18319d124185dc84c1ad32" inode="2672325" device="2304" mtime="941547060" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pageno.html" file_size="2116" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="693268bceed4914abb893000de8fb4fd" inode="2671652" device="2304" mtime="941547060" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pagesel.html" file_size="1827" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="573364e26b4bfc9dbeea12d2327b7be3" inode="2671429" device="2304" mtime="941547060" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pandey.html" file_size="1722" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="626b6df8aba73b3df768e24f6d61dd06" inode="2672145" device="2304" mtime="941547060" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pandora.html" file_size="1749" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="884a1c19d79a44192d00e6c655ef0413" inode="2672545" device="2304" mtime="941547060" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/paper.html" file_size="2133" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d318bbe75192130fb8bbeb9bde6f3ef5" inode="2671597" device="2304" mtime="941547060" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/paralist.html" file_size="2085" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c8013c9342806a30a03ddae72df7bdca" inode="2672308" device="2304" mtime="941547120" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/parallel.html" file_size="1972" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4a2cca71ff5fbeac5edc9ad7e6486b79" inode="2672332" device="2304" mtime="943522860" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/parskip.html" file_size="1930" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="68674f851864d24cfbb7324c931036c2" inode="2672504" device="2304" mtime="941547120" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/patch.html" file_size="1309" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f13fc9089580bea45baccc20e650ffea" inode="2671653" device="2304" mtime="941547120" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/path.html" file_size="1714" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="26a8159b7230d583c0f279e8f0cf60f5" inode="2671817" device="2304" mtime="941547120" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pawpict.html" file_size="2086" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="500a3eb57f2c0ac2ac875f85c56747c4" inode="2671917" device="2304" mtime="941547120" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pb-diagram.html" file_size="1922" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9dc0d126c3e1d50b87eb8e9ee2b302b0" inode="2672276" device="2304" mtime="941547120" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pbmtogf.html" file_size="2052" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c28a918432d1ae5ed3dcb6f8e29f3696" inode="2671768" device="2304" mtime="941547120" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pcfonts.html" file_size="1685" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bceecf41ff9427ca796d9f2302a62f45" inode="2671427" device="2304" mtime="941547120" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pdcmac.html" file_size="1807" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="dac32156e9ff86e299905ed8b02bac6a" inode="2672232" device="2304" mtime="941547120" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pdfscreen.html" file_size="2297" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fde47c0815df893758e0c0481eea8fe9" inode="2672496" device="2304" mtime="941547120" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pdfslide.html" file_size="2239" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6c53fc193d4b30e7f444fb1408f5611f" inode="2672371" device="2304" mtime="941547180" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pdftex-djgpp.html" file_size="1795" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="165210b339208af23a1296dffb683af5" inode="2672382" device="2304" mtime="941547180" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pdftex.html" file_size="2002" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ca66ef0b1b886265368a426c4ece937b" inode="2672102" device="2304" mtime="941547180" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pdftex_oztex.html" file_size="1710" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ccc3bd147c845091b56e84782d97a556" inode="2672304" device="2304" mtime="942423780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/permute.html" file_size="1934" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="837f6e9e5da72ad3747f6e09ebf9cd14" inode="2671511" device="2304" mtime="941547180" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pf2afm.html" file_size="1801" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6d402cca53d269616c8621739fc58e8f" inode="2672489" device="2304" mtime="941547180" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/phoenician.html" file_size="1988" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9690cca8164da150a100381a42e6d035" inode="2671552" device="2304" mtime="941547180" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/phonetic.html" file_size="1781" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="39628e24d0f8df0cd05080cde490a1fe" inode="2671911" device="2304" mtime="941547180" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/photo.html" file_size="2185" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b112c47fdd28abe215859e356122e99d" inode="2672227" device="2304" mtime="941547180" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/phppcf.html" file_size="1713" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ef825c3360070ac9b1c0586f3b938133" inode="2671676" device="2304" mtime="941547240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/physe.html" file_size="1732" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b482a2a285ee2b027ab2392463b90042" inode="2671872" device="2304" mtime="941547240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/phyzzx.html" file_size="1753" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d4955d6a4082309c3b01d1b560ff54cd" inode="2672431" device="2304" mtime="941547240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/picinpar.html" file_size="1950" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0a5d2e528925538c0fff2d146e7a1362" inode="2672518" device="2304" mtime="941547240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/picins.html" file_size="1823" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0f73fd554f2a1e6b4373dd2d3b0fb9a9" inode="2671891" device="2304" mtime="941547240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pictex.html" file_size="1926" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5076268d12202e4d4ef7470bb447a9a8" inode="2671725" device="2304" mtime="941547240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pictex2.html" file_size="2068" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a07dac5c79178d46476e5ee6a3f5dae5" inode="2672435" device="2304" mtime="941547240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/piff.html" file_size="1832" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a513bc5a6bde0096ffc36c6fa505a270" inode="2671949" device="2304" mtime="941547240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/piq.html" file_size="1702" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="401b4023031b2649a27dad1758a9c2ca" inode="2672124" device="2304" mtime="941547240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pitthesis.html" file_size="1805" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d8f73499fffa9da559fdea03a70a4133" inode="2672519" device="2304" mtime="941547300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pkfind.html" file_size="2024" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="82fc85f1691ac1e8b3621395d9294199" inode="2672252" device="2304" mtime="941547300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pl-mf.html" file_size="2026" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="824c94b758beed2612a56b96002c611e" inode="2672074" device="2304" mtime="949069140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pl-qx.html" file_size="1954" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="45fdf83bc159100ca1289886af0af145" inode="2672352" device="2304" mtime="941547300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pl.html" file_size="1842" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="55528bcf2931da564f0b1d3c96b90d12" inode="2672222" device="2304" mtime="941547300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/plain.html" file_size="1731" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9c43a73871a84f9d3d69a4be63fcd45f" inode="2672550" device="2304" mtime="941547300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/plainmisc.html" file_size="1819" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4c9a46b5d443db0112bf9082bbd8f8c3" inode="2672323" device="2304" mtime="941547300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/plaintex.html" file_size="1308" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0597c9c79bbef30899b0b50e0e943261" inode="2672510" device="2304" mtime="941547300" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/plari.html" file_size="1857" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1d18e1a128a45b112e2affc05bca0f80" inode="2672565" device="2304" mtime="941547360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/platex.html" file_size="1932" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="608563958771b4d27dfcda2b4d2e5f25" inode="2671680" device="2304" mtime="941547360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/play.html" file_size="1915" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f218bf4a7ba2ac2b106d95f395e1492d" inode="2671791" device="2304" mtime="941547360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/plcalendar.html" file_size="1961" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="03e678efac3fa3438a421dfc8458a465" inode="2672474" device="2304" mtime="941547360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/plfonts.html" file_size="1772" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4ad92a77d740c8dc478ad148a6eda979" inode="2671989" device="2304" mtime="941547360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/plgraph.html" file_size="1378" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8d21db9366dd777a2ca585b959d87e66" inode="2672113" device="2304" mtime="941547360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/plpatch.html" file_size="1308" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2993cf6e971cb56b033d29568c48be56" inode="2672460" device="2304" mtime="941547360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/plpsfont.html" file_size="2050" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="743766e6f29999fd79cea8e058ab3630" inode="2672373" device="2304" mtime="941547360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pmcstex.html" file_size="2020" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8deeaa6c812e72256739b87571307daf" inode="2671691" device="2304" mtime="941547360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pmgraph.html" file_size="1954" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ceda658b0daa8b3c62dda5fd3ae078ad" inode="2671744" device="2304" mtime="941547420" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/poligraf.html" file_size="2038" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4190e745e3d1a7520ecf264f2b3e1ef1" inode="2672525" device="2304" mtime="941547420" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/polish-doc.html" file_size="1322" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6be389a149257c25980daf196b1010b1" inode="2672401" device="2304" mtime="941547420" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/polyglot.html" file_size="1889" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="26ba621f9fe912913e77332ffda8dceb" inode="2671598" device="2304" mtime="941547420" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/postcards.html" file_size="2368" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f68f786ec3db7734e9a81e0d1f51f5fa" inode="2672083" device="2304" mtime="941547420" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ppchtex.html" file_size="1882" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="069bec13aa1231a108b9c5d8dba3db8a" inode="2671559" device="2304" mtime="944655660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ppower4.html" file_size="2043" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="73576f9b7b2c7bd37204c4b6f4dec4ec" inode="2672342" device="2304" mtime="941547420" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/prelim2e.html" file_size="2138" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e6a1f11215d52fea411ccdf1270b020e" inode="2672283" device="2304" mtime="941547420" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/prettyref.html" file_size="2093" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9b262a9260a039a78ac59562264f499f" inode="2672368" device="2304" mtime="941547420" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/progkeys.html" file_size="2110" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c3715a0237134bc3601a8628e68ee417" inode="2672045" device="2304" mtime="941547480" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/program.html" file_size="1855" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c00c445c81ebff4568c1222dc8957aa2" inode="2672019" device="2304" mtime="941547480" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/proofs.html" file_size="1851" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="363b02a7443f6e1afb6df735cb574747" inode="2672027" device="2304" mtime="941547480" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/protex.html" file_size="1306" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0ed20ea0fa45d38d9622599d1ddbd427" inode="2672197" device="2304" mtime="941547480" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/protocol.html" file_size="1737" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="89c10ca234c221bc704179140bbb0608" inode="2672349" device="2304" mtime="941547480" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/prv.html" file_size="1803" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d8e119855a3d23604479b1509d4492f4" inode="2671503" device="2304" mtime="948115080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ps_conv.html" file_size="1873" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4ea5ed4b75e7485ca948af9c7681e802" inode="2671524" device="2304" mtime="941547480" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ps_view.html" file_size="1915" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="728e776778bae576283e22094e128618" inode="2671923" device="2304" mtime="941547480" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/psboxit.html" file_size="1796" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="57bea62519a3603f7a24463e3f67caa5" inode="2672195" device="2304" mtime="941547480" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/psfig.html" file_size="1306" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e5af8b278b389fa2da3a7505c903cc4c" inode="2672279" device="2304" mtime="941547540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/psfixbb.html" file_size="1980" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="571dc094315efa35e454d88070ffeb49" inode="2672358" device="2304" mtime="941547540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/psfont.html" file_size="2202" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7736121e5d26d5094585b44aa463a5b9" inode="2672493" device="2304" mtime="941547540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/psfonts.html" file_size="1839" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="494f029fec03aaad897d7e1a7ac47542" inode="2672176" device="2304" mtime="941547540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/psfrag.html" file_size="2297" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="27893a3dcb5e37b25e8ff3f79dd95dfe" inode="2672378" device="2304" mtime="941547540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/psizzl.html" file_size="1742" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8dab7f656f2bff3651635fd5fd55e21e" inode="2671480" device="2304" mtime="941547540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pslatex.html" file_size="2563" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1b2c7fd4d44e367eb2b68fb641d07d3b" inode="2671910" device="2304" mtime="941547540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/psmerge.html" file_size="1313" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="68b329da9893e34099c7d8ad5cb9c940" inode="2672243" device="2304" mtime="941547540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/psnfss.html" file_size="1" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="025546e0e04a4122698f710fe68d8914" inode="2672355" device="2304" mtime="941547540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/psnfssx.html" file_size="1906" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2ba19317f0583104dee2a714f5b2eca2" inode="2671734" device="2304" mtime="941547540" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pspicture.html" file_size="1932" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e655d034716d6ae5904f30823c3f7644" inode="2671493" device="2304" mtime="945340920" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/psrip.html" file_size="1915" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="12d045222aabfedc6a27bc8928241221" inode="2671636" device="2304" mtime="945340920" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pstoedit.html" file_size="2328" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cc63da2959b199da5f269c1fc5efd0c2" inode="2672085" device="2304" mtime="941547600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pstotext.html" file_size="1462" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="723fb017f25b7ba726a2d71f12d57e09" inode="2672494" device="2304" mtime="941547600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pstricks.html" file_size="2361" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="61507c6d2fa5531d55dc0673a2043626" inode="2672039" device="2304" mtime="941547600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/psutils.html" file_size="1896" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="98c9955779f6e0d01c3cbcd2fc6b0718" inode="2671880" device="2304" mtime="941547600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/punk.html" file_size="1756" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5195a7e66bbf5001afbb68b8c50ee3cc" inode="2671855" device="2304" mtime="941547600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/pybliographer.html" file_size="2126" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5c1083d38901f5532188cad4240c57a9" inode="2672106" device="2304" mtime="942060360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/qbibman.html" file_size="1720" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3f64db25d0fd188e5ff9d464a963d3c7" inode="2671565" device="2304" mtime="941547600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/qfig.html" file_size="1760" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3ae004635c604c29a9b04defebdf3541" inode="2672156" device="2304" mtime="941547600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/qfonts.html" file_size="2173" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9382f480ce60ca3eb866df9818270260" inode="2671660" device="2304" mtime="941547600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/qobitree.html" file_size="1853" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="672ab983cb756f793e7f0867716df8ff" inode="2672439" device="2304" mtime="941547600" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/qsymbols.html" file_size="1975" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6acc1e4dcd0bf192e377e8ea40005168" inode="2671970" device="2304" mtime="941547660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/quotchap.html" file_size="2138" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d2f99fe3e2b7b968b45e9587b33e0060" inode="2672492" device="2304" mtime="941547660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/quotes.html" file_size="2003" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="df0d2e77ab74a81853dea7def019a3b0" inode="2671633" device="2304" mtime="941547660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/r-und-s.html" file_size="2063" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="790fee972fa24f3bd7da6fb82bd49bd2" inode="2671446" device="2304" mtime="941547660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ragged.html" file_size="1820" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f379a7e3cd51b2904bc3371d2f25a4ea" inode="2672031" device="2304" mtime="941547660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ragged2e.html" file_size="2032" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8f11f604a8ce27fd7b433443195f078e" inode="2671449" device="2304" mtime="943522860" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/raggedr.html" file_size="1654" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3fb62c10989504751d7de99cc2d72af4" inode="2672290" device="2304" mtime="941547660" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/rail.html" file_size="1905" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5bebb82b30fbf6102ebba1e86918aa4f" inode="2672540" device="2304" mtime="934039620" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/rangecite.html" file_size="1827" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="831bae5b30810e1f0948c27cabdea1e1" inode="2671899" device="2304" mtime="941550780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/rawfonts.html" file_size="2008" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="14da233be0041d0b19859c16aceaff44" inode="2672457" device="2304" mtime="941550780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/rawprint.html" file_size="2007" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6078d1cb87b97f288c336713d8166b19" inode="2672312" device="2304" mtime="941550780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/rcs.html" file_size="1906" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="795ae4e1a00edef0577d0dc95ae4ee01" inode="2671801" device="2304" mtime="941550780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/rcsinfo.html" file_size="2077" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e54c090bed89f851d1ef69a5c1910567" inode="2671778" device="2304" mtime="941550780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/realcalc.html" file_size="1809" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cfde474ba76e52a57ac06ee46389d5e9" inode="2672070" device="2304" mtime="941550780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/recipe.html" file_size="1724" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="be2415b2c2fd1ca92b4579251391cb0c" inode="2672294" device="2304" mtime="948383040" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/refcheck.html" file_size="2157" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8b3acd1dc2ed2f987740e76e80755cb7" inode="2672471" device="2304" mtime="949334040" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/references.html" file_size="2333" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bb6904ba0dafb82545d8cd05def55fcf" inode="2672097" device="2304" mtime="941550840" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/refman.html" file_size="2047" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8c7e4494f517a1d8ce67aba5c143f6ef" inode="2672388" device="2304" mtime="941550840" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/regcount.html" file_size="1984" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="abbc4605c771bfc7a226fa4e3226bc83" inode="2672509" device="2304" mtime="941550840" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/relenc.html" file_size="1977" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7b41f320663e10b9944df8f3f6595b0d" inode="2672059" device="2304" mtime="941652960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/relsize.html" file_size="1877" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ba4982236caab48476e29003516c1cb3" inode="2672450" device="2304" mtime="941550840" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/remreset.html" file_size="1889" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3c46174b8c92d104b7e621ca29239189" inode="2672182" device="2304" mtime="941550840" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/repeat.html" file_size="1751" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bf2b681beed4a8d745db9a1a82ab49ad" inode="2671747" device="2304" mtime="941550840" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/revnum.html" file_size="1797" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cb4dd392b0dc7e47f5ded8312d7c21c3" inode="2672285" device="2304" mtime="941550840" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/revtex.html" file_size="2195" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="734c0a196e6fb2795aa24d6f0eb7cc74" inode="2671629" device="2304" mtime="941550840" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/rlepsf.html" file_size="1875" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="df2cd460f793e618cb7eb56a820146b2" inode="2672034" device="2304" mtime="943959960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/rmligs.html" file_size="1665" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a08308016e5747b1bad0420e38a84257" inode="2672486" device="2304" mtime="941550840" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/rmpage.html" file_size="2438" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c6659f412c7432d0db17d989eb4b3e05" inode="2672381" device="2304" mtime="941550900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/romaniantex.html" file_size="1784" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="89ca62c1035a686e4e790fe84e3ea885" inode="2672111" device="2304" mtime="941550900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/romanneg.html" file_size="1690" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f2f8d517d747703ee124169901c96ce6" inode="2670356" device="2304" mtime="941550900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/romannum.html" file_size="2018" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="903bc1dd87106247ebcacb0eb96d70dc" inode="2671948" device="2304" mtime="941550900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/rotating.html" file_size="2280" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d1d1656e81728d675435ee7161ab4586" inode="2672452" device="2304" mtime="941550900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/rotfloat.html" file_size="1845" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="adcc3093cd4830a1d359473c194a58f5" inode="2672324" device="2304" mtime="941550900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/rplain.html" file_size="1947" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="57365d19a644895173d511771f851a56" inode="2672268" device="2304" mtime="941550900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/rsfs-ps.html" file_size="1756" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="530f3ce05ee34ed5b5ccab90dd3fd31a" inode="2671755" device="2304" mtime="941550900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/rsfs.html" file_size="2042" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fe59316909a14cb49c67659076ceb695" inode="2671547" device="2304" mtime="941550900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/rtf2latex2e.html" file_size="1835" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="02a1784f2146dc033e2108de8c99db42" inode="2672351" device="2304" mtime="941550900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ruhyphen.html" file_size="1968" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="42cc4a98f19e7495bf7843eabbc9b9b7" inode="2671967" device="2304" mtime="941550960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ruler.html" file_size="1654" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="422db07e0e00c28fa291be77556ab95b" inode="2671461" device="2304" mtime="941550960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/runic.html" file_size="1848" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="685ad9781d75d6b92a42b2569946bf47" inode="2671619" device="2304" mtime="941550960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/russian-help.html" file_size="1683" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b3d436f21286d5b6d9c4c125f6ad68f6" inode="2671428" device="2304" mtime="941550960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/s2latex.html" file_size="1722" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8e39efacd0be7f6ce6b54758590ae402" inode="2672117" device="2304" mtime="941550960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/saferef.html" file_size="1965" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8b2f9cbeaf9ffe4d484791f41afae4b5" inode="2671531" device="2304" mtime="941550960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/sanskrit.html" file_size="1834" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fca27479f6de17d42dfb5b921df6c368" inode="2672392" device="2304" mtime="941550960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/sauter.html" file_size="1723" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ace44d62c172e2f576a8c9dd5af6ab8d" inode="2671964" device="2304" mtime="941550960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/sauterfonts.html" file_size="2264" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="05298afd0eff3c7818cce88f0028016a" inode="2672174" device="2304" mtime="942750240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/scale.html" file_size="2041" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f456a26ae5080e496db4072cfd4347e2" inode="2672507" device="2304" mtime="941550960" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/scalefnt.html" file_size="1869" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ed2527189888f5f540ef9a5e8ed73866" inode="2671869" device="2304" mtime="941551020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/schedule.html" file_size="2716" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="af368b71852d3aee7e8bc846c4c34263" inode="2672142" device="2304" mtime="941551020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/script.html" file_size="1832" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="616bf9ded669481576efdd06798fc47b" inode="2672260" device="2304" mtime="942060360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/scrnger.html" file_size="1810" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a6af11d61ae056c795978f16b10a3c18" inode="2672002" device="2304" mtime="941551020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/section.html" file_size="1681" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f58cab4215c276193b3e13cc686b6694" inode="2671968" device="2304" mtime="941551020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/sectsty.html" file_size="2130" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e83656167b5d0a334bb37ec62ae3a5b4" inode="2671788" device="2304" mtime="941551020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/selectp.html" file_size="1688" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ae5ab1177ee32b7cb9b1022220aaac54" inode="2672464" device="2304" mtime="941551020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/semantic.html" file_size="1966" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c12f1c7883f2ed3a21c0ac014c3250e2" inode="2672168" device="2304" mtime="941551020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/seminar.html" file_size="1975" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b986ca838add93380da2797f385252c9" inode="2672340" device="2304" mtime="941551020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/serial.html" file_size="2247" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8191b324d143ac91cc29b54a13588eb2" inode="2671946" device="2304" mtime="941551020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/setspace.html" file_size="1956" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7e52483308c26d21cb66724ba1a28e40" inode="2672184" device="2304" mtime="941551020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/sfg.html" file_size="1809" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ee086fef08d0b91d57a9461f54f29fb5" inode="2672441" device="2304" mtime="941551080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/sfheaders.html" file_size="2045" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1797e57815dad5ec692507a998a7616f" inode="2672127" device="2304" mtime="941551080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/sgmlcmpt.html" file_size="2011" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="15ca96d340765908005a7120c41f0fc8" inode="2672542" device="2304" mtime="941551080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/shadbox.html" file_size="1914" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="13f13f29c468d06253447fa575659d46" inode="2671456" device="2304" mtime="941551080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/shadethm.html" file_size="2085" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="013b567c71d0d01a605a1458122ea16c" inode="2672316" device="2304" mtime="941551080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/shading.html" file_size="1910" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a69e925f62cf09d50b23338fc003efaa" inode="2671424" device="2304" mtime="941551080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/shadow.html" file_size="1672" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7686fd72c12c67fbd0fc9fd3674fe3b3" inode="2672164" device="2304" mtime="941551080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/shalom.html" file_size="1551" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f537a53b1e6962a0627fbfce3e742292" inode="2672271" device="2304" mtime="941551080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/shapepar.html" file_size="1760" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="82e16ff4fec2ef25547ffe962e847903" inode="2671474" device="2304" mtime="941551080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/shhyphl.html" file_size="1687" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7832b23be857d012c11e98f9d5f8378f" inode="2671847" device="2304" mtime="941551080" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/shortlst.html" file_size="1947" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="02566a2bbbad9ddede24895f7d2e35fe" inode="2671918" device="2304" mtime="941551140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/shorttoc.html" file_size="2102" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ba9cb637d212df3ae76ab79ddb780381" inode="2672041" device="2304" mtime="941551140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/showdim.html" file_size="2049" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="54a852603e740a2b58ec8ffb99340b06" inode="2671512" device="2304" mtime="941551140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/showkeys.html" file_size="1693" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3a67c957bdf2912d67139e96784fe29e" inode="2671607" device="2304" mtime="941551140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/showlabels.html" file_size="1907" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3e9c7494e6ec59c2791ffbdf7cda2f16" inode="2672516" device="2304" mtime="941551140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/siam.html" file_size="1822" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ed2d2b98f25d7361aaff99131c2f4a91" inode="2671997" device="2304" mtime="941551140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/sidecap.html" file_size="2029" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3b787b6ec296997e160ffcfab85b54cc" inode="2671966" device="2304" mtime="941551140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/siggraph.html" file_size="1964" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="042c839242b349c83f1003e6d5b08df2" inode="2671974" device="2304" mtime="943960020" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/simplified-latex.html" file_size="1944" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f2b9fdb5fce4aecd1fb51ae05b0eaa21" inode="2672526" device="2304" mtime="941551140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/simpsons.html" file_size="1823" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8358aee5ce2d8d2db2ca991971c571b7" inode="2672438" device="2304" mtime="941551140" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/sinhala.html" file_size="1690" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a94274a3100d2cec8e280ec3c64ec2cb" inode="2672315" device="2304" mtime="941551200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/sirlin.html" file_size="1718" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b978ba50f5a2ef0195b07744231e544d" inode="2671790" device="2304" mtime="941551200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/siunits.html" file_size="1972" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a95c98717f6e26d583cd281d262ab9e1" inode="2671793" device="2304" mtime="941551200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/slashbox.html" file_size="1886" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c42b21866e362da0822d70e1d1454bf8" inode="2671921" device="2304" mtime="941551200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/slashed.html" file_size="1799" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5cf0cb67adb72dd3e609d1643bce8113" inode="2672123" device="2304" mtime="941551200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/slemph.html" file_size="2445" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="76a8850a3efc04532800ca7d0efadae1" inode="2672015" device="2304" mtime="941551200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/slidenotes.html" file_size="2098" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bbfd24177799a5801e566be5a909b3c6" inode="2671475" device="2304" mtime="941551200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/slides.html" file_size="1876" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bfc2f51505c76ba593706d44fbc2372b" inode="2672133" device="2304" mtime="941551200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/slovak.html" file_size="1679" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cafc0f16f761fb79fcba3c06b4ff82dd" inode="2671820" device="2304" mtime="941551200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/smallcap.html" file_size="2199" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="13b7b4c2f1fd5570a080ca66687c0b90" inode="2671605" device="2304" mtime="941551200" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/smartmn.html" file_size="1907" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4f199af995ec5a91796b9454e023817e" inode="2671487" device="2304" mtime="948383040" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/smartref.html" file_size="1720" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="721656d735c5aaaeb338294035d070a1" inode="2672188" device="2304" mtime="942423780" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/snapshot.html" file_size="2702" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a14d810e83c5b62dab3b76b0199a40ce" inode="2672242" device="2304" mtime="941551260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/snviewer.html" file_size="1666" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c1d545e5005c9539481db7f20862e454" inode="2671700" device="2304" mtime="941551260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/sober.html" file_size="1742" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="481ff122203780a1e8a8df5273328819" inode="2671588" device="2304" mtime="941551260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/sobolev.html" file_size="2138" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="11ee4e0425ec85f63e979d0de497d372" inode="2671532" device="2304" mtime="941551260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/somedefs.html" file_size="1953" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f4365c19d5a05241d0da19a387bcd075" inode="2671848" device="2304" mtime="942750240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/songbook.html" file_size="2084" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fb7e5ca7ab71be9ea1295ca48e4142c7" inode="2672005" device="2304" mtime="941551260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/sorhyph.html" file_size="1670" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cbcaf66f2cb3adaba4aeffee2f68cc21" inode="2671954" device="2304" mtime="941551260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/soul.html" file_size="2212" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="edca8d95d9be61698cf80310eeb24499" inode="2672538" device="2304" mtime="941551260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/spanish.html" file_size="1740" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d190bfc315d9f609fab6bd5e1933ace1" inode="2671846" device="2304" mtime="941551260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/sphack.html" file_size="1751" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a95dbe651cb1aa46dfbd26bf8a486def" inode="2671792" device="2304" mtime="941551260" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/sprite.html" file_size="1769" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="637b69b84a1188e175e0d7295f151abd" inode="2671947" device="2304" mtime="941551320" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ssqquote.html" file_size="2284" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c23c91348c63ce8402fbfa3e90d40592" inode="2671594" device="2304" mtime="941551320" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/startex.html" file_size="1931" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c526d36f6d14d2de91e78de85209326e" inode="2672233" device="2304" mtime="941551320" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/stdclsdv.html" file_size="2101" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="44e5bee62cfab6195b2031486d03eda9" inode="2672560" device="2304" mtime="941551320" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/stmaryrd-ps.html" file_size="1800" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="93d9f253b0846f2c0bf26a436bf303ca" inode="2672266" device="2304" mtime="941551320" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/stmaryrd.html" file_size="1828" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="deb7b829277ef2f45092d8167763a12e" inode="2672179" device="2304" mtime="941551320" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/subeqn.html" file_size="1847" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="771d2d817f682e40b48c022e9e818b2a" inode="2671718" device="2304" mtime="941551320" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/subeqnarray.html" file_size="1877" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="614b360f4ca5b1031702adf774609de6" inode="2672262" device="2304" mtime="941551320" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/subfigure.html" file_size="2525" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="847de61fb70f63bea349ebfe9ab9e4df" inode="2671609" device="2304" mtime="941551320" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/subfloat.html" file_size="2037" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f7082b50e6f796556e6c14ec93cccd17" inode="2672205" device="2304" mtime="941551320" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/subscript.html" file_size="1836" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ec7bf4d5bf20dbd3287327d993c36eec" inode="2672056" device="2304" mtime="941551380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/supertabular.html" file_size="2203" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="79220f36df32ddaba2a6bf12486d8deb" inode="2672263" device="2304" mtime="941551380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/swebib.html" file_size="1703" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="978b308a771231c2342d921914b4f389" inode="2671930" device="2304" mtime="941551380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/swiftex.html" file_size="2617" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ac8b37a7cab486cc60397fd80375d671" inode="2672469" device="2304" mtime="941551380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/syngen.html" file_size="1820" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7683ef02b2319960e5bf8d65683044c6" inode="2672309" device="2304" mtime="941551380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/syntonly.html" file_size="1752" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="06cd88905bddee3d3c1064eb34dd8eec" inode="2672480" device="2304" mtime="941551380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/synttree.html" file_size="1983" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0d3611a7aeec85ea70b4117ef2eea314" inode="2671661" device="2304" mtime="941551380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/t-angles.html" file_size="2019" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="032eb43eb3011736ed1b9fb2851bb5ab" inode="2672158" device="2304" mtime="941551380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/t2.html" file_size="1967" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c1ec608cb896c7724f282b93992c1ab7" inode="2672394" device="2304" mtime="941551380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tabbing.html" file_size="1935" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="24c636320f6b64d749162322e294985e" inode="2672065" device="2304" mtime="941551440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tabls.html" file_size="1786" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d3192c1109dac4726dbd5418f825ebe2" inode="2672186" device="2304" mtime="941551440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tabularx.html" file_size="1692" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="65e12afea40509ed472a74bc7caf6790" inode="2672172" device="2304" mtime="941551440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tap.html" file_size="2129" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a0bc4ee6dceea842075505001264c3a8" inode="2671950" device="2304" mtime="941551440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/taylor.html" file_size="1824" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="67cf33d6d828a3108b915a8cfbc140f5" inode="2672170" device="2304" mtime="941551440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tbe.html" file_size="1805" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="68ef725b529144d8fa6987cbee7896aa" inode="2671442" device="2304" mtime="941551440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tcvn.html" file_size="1742" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="14867e94619ba96945cb4141880c72fe" inode="2671486" device="2304" mtime="941551440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tcx.html" file_size="1292" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="92defbee27408e8498616ae2d50495e6" inode="2671576" device="2304" mtime="941551440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tds.html" file_size="1737" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="44e33c8770987cd6b84b86553116b00f" inode="2671776" device="2304" mtime="941551440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/techexplorer.html" file_size="1796" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0afdd672add542aec1d46d3be1a4af19" inode="2672318" device="2304" mtime="942750240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/teencontrex.html" file_size="1886" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2f5864ef78821ffe349998efe847fee7" inode="2671838" device="2304" mtime="941551440" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tengwar.html" file_size="1792" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7e7f167802a3328605b01cbf0eebffbf" inode="2672010" device="2304" mtime="941551500" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tensind.html" file_size="1783" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="75010a6d75234de83bbd9b7e025f25cf" inode="2671865" device="2304" mtime="941551500" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tensor.html" file_size="1815" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7066f97a4936993858b967f14de5bce5" inode="2672231" device="2304" mtime="941551500" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/termcal.html" file_size="2318" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ae4381925c940e14d7c4b6645bf356a3" inode="2672462" device="2304" mtime="941551500" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/testmath.html" file_size="1724" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5462f12e035866053cf41b1bfde1e2d1" inode="2672239" device="2304" mtime="941551500" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tetex.html" file_size="2468" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f4ad036eaea15ce0610bc30b134b4d42" inode="2672047" device="2304" mtime="941551500" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tex-math.html" file_size="1812" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b0506e2e53eae55c54fbcdd6de358fb8" inode="2671447" device="2304" mtime="941551500" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tex-ps.html" file_size="1920" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="aa4bf824dfd1853a67220319b61a2652" inode="2672354" device="2304" mtime="941551500" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tex2bib.html" file_size="1763" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ae9719a3cb111c2f121651ba6cf24581" inode="2671998" device="2304" mtime="941551500" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tex2html.html" file_size="1596" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d6e531f3cf74663b9edf65010cd92bf1" inode="2672213" device="2304" mtime="941551500" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tex2ltx.html" file_size="1747" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="63eeba1bfc69ab9480bcdd400a949d93" inode="2671590" device="2304" mtime="941551560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tex2rtf.html" file_size="2205" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6b6aa1ce23d5bc65a70608a3e7e5d8a5" inode="2671595" device="2304" mtime="941551560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tex4ht.html" file_size="2318" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a0fc86f273908d47ef8354373d66eec7" inode="2672374" device="2304" mtime="941551560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tex98.html" file_size="1204" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="190e2d57e839a4cf919ccd5208960dc0" inode="2671465" device="2304" mtime="941551560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/texdepend.html" file_size="1985" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="145441e9a11e56e6f89e5597aa4271aa" inode="2671780" device="2304" mtime="941551560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/texdraw.html" file_size="1952" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b2704358d264836ef51e6ad3d6702b3e" inode="2672372" device="2304" mtime="941551560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/texed.html" file_size="1830" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="461e24ef83b576347d2b1e47f4440d91" inode="2671714" device="2304" mtime="941551560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/texemplar.html" file_size="1775" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4dc7bba9dc353845d2882e88b79804aa" inode="2671638" device="2304" mtime="941551560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/texi2html.html" file_size="1350" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="11a941fd9fce3acb15808d55ec616b64" inode="2672379" device="2304" mtime="941551560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/texi2www.html" file_size="1480" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5e95687978fbfa39d7a99d521429ee44" inode="2671751" device="2304" mtime="941551560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/texinfo.html" file_size="1998" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e24a0fc9eebed7d15d924fbe04848334" inode="2672101" device="2304" mtime="941551560" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/texip.html" file_size="1739" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6eab75bcb5429d6de4e7858a7bcff9f1" inode="2672501" device="2304" mtime="941551620" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/texlist.html" file_size="1750" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="71c4ac7a065f504cfab49bfd03bd9331" inode="2672122" device="2304" mtime="941551620" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/texperf.html" file_size="1765" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="42acf77d024d199b927e55e46279061f" inode="2672547" device="2304" mtime="941551620" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/texpict.html" file_size="1989" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bea71649d0ac933fd6986eb4d1aaea89" inode="2671596" device="2304" mtime="941551620" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/texshade.html" file_size="2346" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c14b346294d2bc6790daef14aa6ec6a9" inode="2672003" device="2304" mtime="945256980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/texshell32.html" file_size="2329" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="367175122611880e3ded08fe730e74f3" inode="2671773" device="2304" mtime="941551620" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/texsis.html" file_size="2938" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6dfdb445439d3f0c2ece159cfec5bc8d" inode="2672532" device="2304" mtime="941551620" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/texsk.html" file_size="1728" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6ea68ea126c8ce369807e46f1aaf1903" inode="2671845" device="2304" mtime="941551620" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/text1.html" file_size="1774" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5a85c391dd3850b04a75dfbd4f907e23" inode="2672256" device="2304" mtime="941551620" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/textcase.html" file_size="1931" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="defa54190586d1ec363b0ccce49b3cba" inode="2671858" device="2304" mtime="941551620" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/textcomp.html" file_size="1802" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0451fef01853178687e7c98ea549e6de" inode="2671824" device="2304" mtime="941551680" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/textfit.html" file_size="1912" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6193e5e5d22758e7daa9842791b19228" inode="2672207" device="2304" mtime="941551680" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/textmerg.html" file_size="1892" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f04032106406f82f445c0f3b25638ff4" inode="2672503" device="2304" mtime="941551680" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/textoolspro.html" file_size="2075" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e5160117e385760f00b47bbe04727cc5" inode="2671754" device="2304" mtime="941551680" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/textpos.html" file_size="2022" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="736f0d9129f813888ede3bbf1560bee6" inode="2671953" device="2304" mtime="941551680" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tfmpk.html" file_size="1405" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8252c361eda02c2903c445b7b3d1a5c7" inode="2671902" device="2304" mtime="941551680" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/theorem.html" file_size="1746" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cb09b674f7cdf1fb87b13cebf8ae4b50" inode="2671602" device="2304" mtime="941551680" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/thesis.html" file_size="2056" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8b15921eb19b99a200d42afb6d7920a3" inode="2671889" device="2304" mtime="941551680" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/threed.html" file_size="1900" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8070e0e63d601032591fcf2400c26f3f" inode="2671777" device="2304" mtime="941551680" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/threeparttable.html" file_size="1742" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4b6356ea47055891d8da70b88c939cba" inode="2672437" device="2304" mtime="941551680" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/thumb.html" file_size="1922" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b3263d10ccc686bc8719c829feb81001" inode="2671851" device="2304" mtime="948457800" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/thumbpdf.html" file_size="2140" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d8146d6c517cf0f878426fc4272c1047" inode="2671632" device="2304" mtime="941551740" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tiff.html" file_size="1837" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="25a4ff7ea442a9585816d490b5dea81e" inode="2671830" device="2304" mtime="941551740" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tiff2ps.html" file_size="1917" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1a49e82dd744e4dbc61aef6ad1d46086" inode="2671635" device="2304" mtime="941551740" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/time.html" file_size="1781" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="244394c18e14af8152a76edfb077bcf3" inode="2672165" device="2304" mtime="941551740" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/times.html" file_size="1352" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d9da590d3e0daf85a7192e720472340c" inode="2672087" device="2304" mtime="941551740" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/timesht.html" file_size="1861" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="79abdf6cd87fd4195e02455d80997df7" inode="2671938" device="2304" mtime="941551740" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/timing.html" file_size="1332" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="60123eb8b5f669bedc96590051a8284e" inode="2672169" device="2304" mtime="941551740" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tinyc2l.html" file_size="2846" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ba852114c7b694275896eaaa8b99f5f3" inode="2672072" device="2304" mtime="941551740" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tipa.html" file_size="1753" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6018df72f9256899015b2e33af0225f7" inode="2672554" device="2304" mtime="941551740" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tipos.html" file_size="1851" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e8e4a86f5eecfdc3a77d60cbc19b495d" inode="2671457" device="2304" mtime="941551740" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/titlefoot.html" file_size="2174" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b02bd61551942c0b70ff7a835b6d5885" inode="2672035" device="2304" mtime="941551800" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/titleref.html" file_size="1816" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3d160b3e9505f99fce99e15b22c238bb" inode="2671612" device="2304" mtime="941551800" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/titles.html" file_size="2621" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7214926a0362c37461273e61d0f287e6" inode="2671534" device="2304" mtime="941551800" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/titlesec.html" file_size="2207" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3f3456e64dc195fde13c520db06579f8" inode="2671585" device="2304" mtime="941551800" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/titletoc.html" file_size="1912" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="480f25d9c8d6a17c995bb05acfa99d89" inode="2672129" device="2304" mtime="941551800" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tkbibtex.html" file_size="1969" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="851a03b2498b57498cf58e70527a1e7c" inode="2672055" device="2304" mtime="941551800" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tmmath.html" file_size="1906" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6758fb756233ead34917d7abe97dbc14" inode="2672052" device="2304" mtime="941551800" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tmview.html" file_size="1927" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f780095cd6782620af71c77c5e0a9154" inode="2672067" device="2304" mtime="941551800" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tocbibind.html" file_size="2035" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3bc1a8f4e1c532d4a18ea724a1614be8" inode="2672226" device="2304" mtime="941551800" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tocloft.html" file_size="2066" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="35cb2669f5630977ab94d7d66ef43bd3" inode="2672109" device="2304" mtime="941551800" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tocvsec2.html" file_size="2038" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a40b58033b91f3b5178be05ad042e225" inode="2671738" device="2304" mtime="941551860" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/toil.html" file_size="2034" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="847ba36babf80cc805228d6c06deac09" inode="2671431" device="2304" mtime="941551860" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/topcapt.html" file_size="1865" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9500415c7f407818a2aa0a6941b4a875" inode="2671971" device="2304" mtime="941551860" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/topfloat.html" file_size="1743" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bdc1ac2fae649e16ed69ef8b77b3e82f" inode="2672017" device="2304" mtime="941551860" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/totpages.html" file_size="1845" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5d26942bc7826eac730567cac974d46d" inode="2671589" device="2304" mtime="941551860" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tracking.html" file_size="2002" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ddf81b6eb19bb1316541365d10a1d0f8" inode="2672257" device="2304" mtime="941551860" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/trajan.html" file_size="1903" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d2275b781ad3799e382271ed3b7ff68a" inode="2672564" device="2304" mtime="941551860" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/trans.html" file_size="1918" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="074e7185ffc031cc3a297b889e4ccc5d" inode="2672567" device="2304" mtime="948383040" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/transfig.html" file_size="1835" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3c8202c0618044bf224929ec29853d2a" inode="2671542" device="2304" mtime="941551860" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/treesvr.html" file_size="1837" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e1882d106b306be9677c97888d8266f9" inode="2671775" device="2304" mtime="941551860" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/treetex.html" file_size="1971" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="eedbfd3bb0cab269900887c5339e97e1" inode="2672234" device="2304" mtime="941551860" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/trfsigns.html" file_size="1836" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="83d5bec224b3cf73bc5b0a3a5b7c183d" inode="2671444" device="2304" mtime="941551920" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/truncate.html" file_size="1752" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8600d65b60a479051d143a1112343942" inode="2672445" device="2304" mtime="941551920" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tsconfig.html" file_size="1884" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9c08eec1e4315c0a0ed0f673eb0e51f0" inode="2672530" device="2304" mtime="941551920" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ttf2mf.html" file_size="1762" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="969c1367b2ef771e20d322b271fec8e2" inode="2671991" device="2304" mtime="941551920" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ttf2pk.html" file_size="2014" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0851cd044c998969e824bbc39b64fdfb" inode="2672267" device="2304" mtime="941551920" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ttf2tfm.html" file_size="1910" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0f145b79c695f2497816534c13b71e8c" inode="2672125" device="2304" mtime="941551920" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ttftogf.html" file_size="1707" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6504340def55d0697601ca130489a871" inode="2672091" device="2304" mtime="944169000" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tth-rpm.html" file_size="1712" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="25901fbfee89ef12eba211297d2cba6f" inode="2672058" device="2304" mtime="944169000" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tth-win.html" file_size="1742" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6423dcc57b072ca4bbe7de51b01daee7" inode="2671798" device="2304" mtime="944169000" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tth.html" file_size="2096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4534a88973d6bf87440345599177f72b" inode="2671984" device="2304" mtime="941551920" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ttt.html" file_size="1688" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7df156f06e467abf23226aeda6fa10ba" inode="2671433" device="2304" mtime="941551980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tubtoc.html" file_size="1188" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="078212746bf74df3f414d8cf03e63077" inode="2672272" device="2304" mtime="941551980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tugboat-toc.html" file_size="1700" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c617264d64c2ecbed8b32974dafe4f6b" inode="2672095" device="2304" mtime="941551980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/tugboat.html" file_size="1855" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6d29df3d7e98bd48974332ca01248844" inode="2672393" device="2304" mtime="941551980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/twg-list.html" file_size="1869" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a97310e30bf0b396eb25801f80e4c72e" inode="2671659" device="2304" mtime="941551980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/twoopt.html" file_size="1777" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="60419110f0e5c89f90edb5d0f8cfe586" inode="2671658" device="2304" mtime="941551980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/twoup.html" file_size="1943" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cfa386476d180ea86b613d0d7570a1f4" inode="2671743" device="2304" mtime="945185460" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/txt2tex.html" file_size="1915" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="379656a20946618ea88d30654a1b1faf" inode="2672384" device="2304" mtime="941551980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/type1.html" file_size="1375" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="65743a8f3ba0e8951448b4db71aaced0" inode="2671928" device="2304" mtime="941551980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/type1cm.html" file_size="2054" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2e1624e78941e3613f29d26180ebd017" inode="2672284" device="2304" mtime="941551980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/typearea.html" file_size="1780" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="86071c82ff9a9572e2757d9d11909ee0" inode="2671712" device="2304" mtime="941552040" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/typehtml.html" file_size="1820" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8c25f485d31cab651dc5d676184811a0" inode="2672468" device="2304" mtime="941552040" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/typespec.html" file_size="1874" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="78f3e37fbf6e0bd555c8227a4bb1f673" inode="2672449" device="2304" mtime="941552040" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/uaclasses.html" file_size="2244" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5776a1b2ff3b4870afe7fd1b05faffcd" inode="2671963" device="2304" mtime="941552040" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ucthesis.html" file_size="1988" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0c89f889714be7dd6f272df6ff9a374a" inode="2672319" device="2304" mtime="941552040" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ukhyph.html" file_size="1848" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="784799573ede41e971ed62ac044c1d76" inode="2672305" device="2304" mtime="941661720" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ukrhyph.html" file_size="1913" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="359231a4d312a1011b7c1c183f6b26a3" inode="2671979" device="2304" mtime="942060360" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ulem.html" file_size="1806" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="abca2fa8a77cdbf974c984241e513945" inode="2672193" device="2304" mtime="941552040" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ulsy.html" file_size="1837" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7f73009bd65a23b936f38dbccd4bf729" inode="2672404" device="2304" mtime="941552040" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/umlaute.html" file_size="1897" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8f4118b45b175120342ac1c2c78111a9" inode="2671772" device="2304" mtime="941552040" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/umrand.html" file_size="1855" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="94b59243d9771e722868d6cf05b4cf3a" inode="2672461" device="2304" mtime="941552040" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/uncial.html" file_size="1989" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="896b99c8428eeacf7ed2970b8e8c8e51" inode="2671935" device="2304" mtime="941552100" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/underlin.html" file_size="1900" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9e7707657fe3f27881f3a59fee3637ea" inode="2672288" device="2304" mtime="941552100" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/underscore.html" file_size="1772" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="08f1fddec817770e7b7eb4b3e443a643" inode="2671482" device="2304" mtime="941552100" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/uni.html" file_size="1904" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="776505c24900e29933b32978643cccc7" inode="2671707" device="2304" mtime="941552100" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/uniqleaf.html" file_size="1878" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2b2cc7de0029934b233809233e71ba6e" inode="2672038" device="2304" mtime="941552100" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/units.html" file_size="1884" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="47aa66ff228aedc39cb0cfb2d51d7770" inode="2672470" device="2304" mtime="941552100" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/universa.html" file_size="1814" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cd6d8b12b66ae8a61088e8924b3a9e4d" inode="2671856" device="2304" mtime="941552100" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/unsupported.html" file_size="1332" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9ced7381b106f495a91179a4cee530a1" inode="2672196" device="2304" mtime="941552100" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/url.html" file_size="2025" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="04731491205b5e9c8cad34091d08ce54" inode="2672345" device="2304" mtime="941552100" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/urw.html" file_size="1688" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0678f5450f66b47775b3326841e8291b" inode="2671651" device="2304" mtime="941552100" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/urwstd.html" file_size="1306" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ec86291384eebfeaf099e935ccf1ad03" inode="2671988" device="2304" mtime="941552160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/urwvf.html" file_size="1935" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7bf67b4c76211cfc7ce25aef11507e31" inode="2671996" device="2304" mtime="941552160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ut-backref.html" file_size="1829" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="79e66d5b2bc07d80d1012581752bb317" inode="2672173" device="2304" mtime="945256980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ut-thesis.html" file_size="1866" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="376330f83977102ba6b7fc3b59e81b41" inode="2672343" device="2304" mtime="941552160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/utorontothesis.html" file_size="1819" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c3b7248a3ed4ee5b2b9248e04861c3b1" inode="2672356" device="2304" mtime="941552160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/utthesis.html" file_size="1972" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e96c24f4828ebee7b5fbcb3d1818cb1b" inode="2671640" device="2304" mtime="941552160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/uwthesis.html" file_size="1869" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3996682cc93e1cb77ded319add23f9da" inode="2672094" device="2304" mtime="941552160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/varioref.html" file_size="1686" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d4b06ac9d6c929e2b1b4cdcf87a635b6" inode="2671721" device="2304" mtime="941552160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/vdm.html" file_size="1809" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c81ef23fcd3701c2e89b47e8aa2ad4a8" inode="2671664" device="2304" mtime="941552160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/vector.html" file_size="1966" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a21c06b1e3364542527215f6d528edb9" inode="2671677" device="2304" mtime="941552160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/verbatim.html" file_size="1801" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ae401401c8d0aef72f7bd2a93601d0ee" inode="2671945" device="2304" mtime="941552160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/vertex.html" file_size="1828" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b5fb66f2e091f473eeee711afd5f9611" inode="2672386" device="2304" mtime="941552220" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/vfcomb.html" file_size="1791" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="74c0154fb68d597857c4ee5df591dbf9" inode="2672307" device="2304" mtime="941552220" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/vfinst.html" file_size="1870" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="caeac526292e1a37b789ac7e32973650" inode="2671978" device="2304" mtime="941552220" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/vicentino.html" file_size="1645" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="af5cb5bd528d4b198ae04280efa3ae0f" inode="2672098" device="2304" mtime="941552220" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/viiptart.html" file_size="1783" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="51be9d88144232a0f360fa9c41a7b875" inode="2671763" device="2304" mtime="941552220" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/vita.html" file_size="1882" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="34d1587e4ee9b79e1a8d2e036e16877b" inode="2671481" device="2304" mtime="941552220" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/vmargin.html" file_size="2355" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="eaf6f8adcbc78b6e1da2fe9abd44052d" inode="2671630" device="2304" mtime="941552220" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/vncmr.html" file_size="1773" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ed4560f0a2c582ea9aaa331f5139798d" inode="2671625" device="2304" mtime="941552220" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/vpage.html" file_size="1869" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0488dd74b9bbbe1e635a2918c34fc096" inode="2671591" device="2304" mtime="941552220" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/vrb.html" file_size="1890" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="aab34dfdc4d5ba8b600eaddd66ec3b59" inode="2672527" device="2304" mtime="941552220" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/vrsion.html" file_size="1928" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9ff3147bac523e2ed6e5c49d73fa870e" inode="2672001" device="2304" mtime="941552280" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/vruler.html" file_size="1874" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a9335bd4671bdf1cd510fe334a4a44ed" inode="2672485" device="2304" mtime="941552280" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/warpcol.html" file_size="2313" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bb9f90a0893abe1c94d08d3bbeb04aec" inode="2672447" device="2304" mtime="941552280" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/wasy-ps.html" file_size="1805" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="797a01714dc10570737b5b2e5fba9629" inode="2671713" device="2304" mtime="941552280" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/wasy.html" file_size="1862" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8cb4bc50a94416db3d0e9b458041bd37" inode="2672281" device="2304" mtime="941552280" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/wasy2-ps.html" file_size="1761" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9459641cc78f39c48d6104aaf1982ec2" inode="2672100" device="2304" mtime="941552280" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/wasy2.html" file_size="1717" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4736e775ffd111e570b62f34ce53228c" inode="2671925" device="2304" mtime="941552280" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/wasysym.html" file_size="2394" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d5438bdd7827972db111a4f918fe4da4" inode="2672558" device="2304" mtime="941552280" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/wbarcode.html" file_size="1777" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a85585bdb55bded1da5c997e8fd5b6a5" inode="2672369" device="2304" mtime="941552280" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/web.html" file_size="2074" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="28a9b707761ec25950bb10b391dfccf0" inode="2671854" device="2304" mtime="941552280" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/web2c-win32.html" file_size="1804" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="dad7f674434e1f19491fe9f0c44ae2d9" inode="2672451" device="2304" mtime="941552280" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/web2c.html" file_size="2048" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cffec3478916008787781942fe4643a8" inode="2672419" device="2304" mtime="941552340" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/williams.html" file_size="1854" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="adcb3e2e0a25dc24a4405b34beece6db" inode="2672300" device="2304" mtime="941552340" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/win95-guide.html" file_size="1926" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="372bb408a67dcee82c76e3c5a5c0ca5a" inode="2671927" device="2304" mtime="941552340" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/windvi.html" file_size="2664" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6d0fa1bddc8d311b27c851ed746736a6" inode="2672057" device="2304" mtime="941552340" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/winedt.html" file_size="2496" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0834945028068d2ad13931d66ca57d33" inode="2671704" device="2304" mtime="941552340" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/winemtex.html" file_size="1508" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9aaa24a14d748a70a5fea06bd12a06a3" inode="2672270" device="2304" mtime="941552340" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/winshell.html" file_size="2321" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d144b27eae224f15db7d602ca0ed5ba5" inode="2672066" device="2304" mtime="941552340" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/wmf2eps.html" file_size="1890" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a13692d6d9b49d4170cacf75e75e847b" inode="2672162" device="2304" mtime="941552340" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/wnri.html" file_size="1814" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="03a6415cadd5e1c3048591d8c3d9927f" inode="2672006" device="2304" mtime="941552340" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/wntamil.html" file_size="1859" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6feacb34d0256cede8b207ce2a02e216" inode="2672096" device="2304" mtime="941552340" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/word2x.html" file_size="1734" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0cc4a4e794c952f57356cfe2673d2d3f" inode="2672522" device="2304" mtime="941552400" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/wp-conv.html" file_size="2073" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d90f3fd145bf5de06cb99cc9432d4de9" inode="2672076" device="2304" mtime="941552400" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/wp2latex.html" file_size="1774" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d38c022321114e074d8b7cc1c52eba6a" inode="2672424" device="2304" mtime="941552400" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/wrapfig.html" file_size="1834" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="48198cc259a24a7aa092626f9ad8e731" inode="2671522" device="2304" mtime="941552400" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/wsuipa.html" file_size="1773" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2f062873a6ec99b0fd63d85876d59fd1" inode="2672108" device="2304" mtime="941552400" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/wtex95.html" file_size="1765" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="62f39f29f6dd2313a38df7df02407ca7" inode="2671934" device="2304" mtime="941552400" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/xarticle.html" file_size="1789" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="eb6070c8bca94c9393083414c141fd76" inode="2672244" device="2304" mtime="941552400" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/xcomment.html" file_size="1761" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="07e1261fef43f92ff068a55ba0b11a02" inode="2672346" device="2304" mtime="941552400" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/xdvi.html" file_size="1843" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ae6cbb7b65a19e1ca516f529100a3271" inode="2672269" device="2304" mtime="941552400" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/xdvik.html" file_size="1789" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="14b0aea689e832b5111fcf94afcafc3a" inode="2671543" device="2304" mtime="948383040" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/xfig.html" file_size="1918" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="02a7411abc17d24ae419ee19901b09d4" inode="2671903" device="2304" mtime="948895380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/xmltex.html" file_size="2140" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="77a9268adce2b968c4c280c52ed40efa" inode="2671510" device="2304" mtime="941552400" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/xr.html" file_size="1682" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6680bd8f35d1bed013648b8a7a46b823" inode="2671842" device="2304" mtime="941552460" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/xspace.html" file_size="1692" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="538e4333be0eb864baef41191e28603c" inode="2671808" device="2304" mtime="941552460" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/xtab.html" file_size="1941" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d83822813a04326973dbaef282704ff0" inode="2671656" device="2304" mtime="941552460" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/xtcapts.html" file_size="1323" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8f72cb17c4a289c3b73fd3c79989fef0" inode="2671485" device="2304" mtime="941552460" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/xtem.html" file_size="2022" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="761e7385e4b6e27429deccd4623e31b5" inode="2672467" device="2304" mtime="948383040" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/xtrcode.html" file_size="1652" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3d64ccfe899cfe9bf11156c6347e6e5f" inode="2671463" device="2304" mtime="941638800" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/xymtex.html" file_size="1835" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7db434919dc791fe9d3f0ec1dd67c8f0" inode="2671537" device="2304" mtime="941552460" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/xypic.html" file_size="2230" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8f76560da77f9d597b1319a67c39fccf" inode="2671904" device="2304" mtime="941552460" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/yannisgr.html" file_size="1781" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5e09e8e4bab36e0bd788a27878c8e5b3" inode="2672040" device="2304" mtime="941552460" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/yfonts.html" file_size="1971" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4323f4a88467214c00fa038f8390edfe" inode="2672553" device="2304" mtime="941552460" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/yhmath.html" file_size="1850" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a83651ea58805900b826ce61769a4b9d" inode="2671783" device="2304" mtime="941552460" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/yi4latex.html" file_size="1948" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9b580a0a1f194834adf158b9d3ae0126" inode="2671530" device="2304" mtime="941552520" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/yinit.html" file_size="1707" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fb00b8b1983d5855909e2f4f76cf44fa" inode="2671892" device="2304" mtime="941552520" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/youngtab.html" file_size="2064" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="674b64ea2070cb6de5b135b56be7a276" inode="2672241" device="2304" mtime="942750240" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/yplan.html" file_size="2117" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="42afc6b9b0cf466d893fd6383b1a4c7e" inode="2672289" device="2304" mtime="941552520" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/ytex.html" file_size="1744" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="04b17c97c5b40f60d74d53a9d81e5d37" inode="2672280" device="2304" mtime="941552520" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/zed-csp.html" file_size="1853" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3cd5687a5dfe29c2b370ba0542ef0c38" inode="2672440" device="2304" mtime="941552520" flags="0" name="/usr/share/texmf/doc/help/Catalogue/entries/zefonts.html" file_size="1970" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7cac848f296e9aebf33c5d110e9e8eea" inode="2672581" device="2304" mtime="941540160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/fr.png" file_size="134" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5496587d039eaf9e21f96341c2ac562c" inode="2672584" device="2304" mtime="941540160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/ftp.png" file_size="914" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="af05c005fce9d01d6601dd96d80db139" inode="2672580" device="2304" mtime="941540160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/gb.png" file_size="275" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4009e5e3373f2876cde7943782908481" inode="2670351" device="2304" mtime="949333980" flags="0" name="/usr/share/texmf/doc/help/Catalogue/hier.html" file_size="190230" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6cdb7d970e9a8492001fefeed2d48d8f" inode="2672576" device="2304" mtime="941540160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/home.png" file_size="493" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="04554f068ee1ea5dcd54ca2aaa1700bd" inode="2672583" device="2304" mtime="941540160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/it.png" file_size="136" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="df5100c1dc99c5a9b86655992626621b" inode="2672585" device="2304" mtime="941540160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/jp.png" file_size="165" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ae5aa8892df18b70a17351de182c4c16" inode="2672587" device="2304" mtime="930996900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/licenses.artistic.html" file_size="1177" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0416d4e93e64ad49e91f480e59685d41" inode="2670228" device="2304" mtime="930996900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/licenses.bsd.html" file_size="1241" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1d3f3ae0a8d8fae3a8eb8db59fd72c53" inode="2672601" device="2304" mtime="929191860" flags="0" name="/usr/share/texmf/doc/help/Catalogue/licenses.dfsg.html" file_size="1402" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="64e6c62d950f1399592c78fcb1cec32c" inode="2672595" device="2304" mtime="930996900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/licenses.gpl.html" file_size="1153" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d3ae175fa90446559989824edbdeb06b" inode="2672573" device="2304" mtime="930996900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/licenses.html" file_size="5869" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="129089df06774cec60dc42fb33afdc9e" inode="2670348" device="2304" mtime="930996900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/licenses.knuth.html" file_size="1038" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f33305d665c6fad195974ef568cdf766" inode="2672588" device="2304" mtime="930996900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/licenses.lgpl.html" file_size="922" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1e5ed226d37813b2ee06f6ded1df803c" inode="2670230" device="2304" mtime="930996900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/licenses.lppl.html" file_size="1151" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5eace35bb1206ee88f8ba3938e0672eb" inode="2672602" device="2304" mtime="930996900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/licenses.nocommercial.html" file_size="859" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5bc7d49173c0a7c90a379bbcb5e93010" inode="2670353" device="2304" mtime="930996900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/licenses.nosell.html" file_size="1172" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6970b0a40dcfe44baa9739f7331fe2cd" inode="2672604" device="2304" mtime="930996900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/licenses.nosource.html" file_size="1194" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="dfd0aa89c2976c6071277e5f1519aa2c" inode="2672597" device="2304" mtime="930996900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/licenses.other.html" file_size="1093" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1e74f8e76db4c078775da17d0245dce6" inode="2672599" device="2304" mtime="930996900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/licenses.pd.html" file_size="1101" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3d0f521ccc859e1060662b24fa5b269a" inode="2672571" device="2304" mtime="930996900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/licenses.shareware.html" file_size="801" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="409669a9787186b622a6453cf0968041" inode="2672594" device="2304" mtime="930996900" flags="0" name="/usr/share/texmf/doc/help/Catalogue/licenses.unknown.html" file_size="1282" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1b883def8e056b7b5dd4d61dd360f1b2" inode="2672586" device="2304" mtime="948895380" flags="0" name="/usr/share/texmf/doc/help/Catalogue/ls-lR.gz" file_size="20855" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b32fb24b31c7e4cb5804836f81d967c0" inode="2672582" device="2304" mtime="941540160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/new.png" file_size="1247" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8b673453459d7a9abdfc7a069e3eaac5" inode="2672589" device="2304" mtime="941540160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/pl.png" file_size="127" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a529689dd8dc81714447bb50a41db511" inode="2672593" device="2304" mtime="941540160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/search.png" file_size="290" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="68338cca244a477ccd0c0e776e852448" inode="2672591" device="2304" mtime="941540160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/sg.png" file_size="178" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="19b8c8ec533ba37e9d9d0cbab1218b0b" inode="2672570" device="2304" mtime="941540160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/tar.png" file_size="224" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="dbee667bdd689d91187cf12942c05569" inode="2672603" device="2304" mtime="941540160" flags="0" name="/usr/share/texmf/doc/help/Catalogue/tetex.png" file_size="211" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cc68da0c3a5c6ad6520963a9aa787e5c" inode="2670231" device="2304" mtime="941540220" flags="0" name="/usr/share/texmf/doc/help/Catalogue/texlive.png" file_size="246" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cb8ebfcc95edd7a3ecda591de12afa52" inode="2672572" device="2304" mtime="941540220" flags="0" name="/usr/share/texmf/doc/help/Catalogue/title.png" file_size="599" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3772fa536734110f989dfd377a87ce81" inode="2672592" device="2304" mtime="941540220" flags="0" name="/usr/share/texmf/doc/help/Catalogue/us.png" file_size="215" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7a3c9c21dfa7c2acca925a8690a7662c" inode="2672598" device="2304" mtime="941540220" flags="0" name="/usr/share/texmf/doc/help/Catalogue/za.png" file_size="262" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2f34420bd8585a6b9be7a308ce7468af" inode="3718327" device="2304" mtime="790576960" flags="0" name="/usr/share/texmf/doc/help/csname.txt" file_size="42533" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="2670223" device="2304" mtime="936380462" flags="0" name="/usr/share/texmf/doc/help/ctan" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9537294cd56754dda454225dc40565f3" inode="2670225" device="2304" mtime="933591840" flags="0" name="/usr/share/texmf/doc/help/ctan/CTAN.sites" file_size="5083" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e386902e47e02f24bb18f39a634e73b7" inode="2670226" device="2304" mtime="911572620" flags="0" name="/usr/share/texmf/doc/help/ctan/companion.ctan" file_size="7979" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="41b8a37b8c2d9fd788308ce0ef6989b4" inode="2670224" device="2304" mtime="853115935" flags="0" name="/usr/share/texmf/doc/help/ctan/index.html" file_size="239" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3718300" device="2304" mtime="909981367" flags="0" name="/usr/share/texmf/doc/help/faq" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="2555187" device="2304" mtime="899693121" flags="0" name="/usr/share/texmf/doc/help/faq/LaTeX-FAQ-francaise" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="77b3aa24bd61b2777974a5c475bc2074" inode="2555191" device="2304" mtime="899692998" flags="0" name="/usr/share/texmf/doc/help/faq/LaTeX-FAQ-francaise/FAQ.dvi" file_size="37028" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="77c5eea4988a97fcb65b4d353a4756e1" inode="2555188" device="2304" mtime="888592560" flags="0" name="/usr/share/texmf/doc/help/faq/LaTeX-FAQ-francaise/part1" file_size="187595" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ff63840db1d74a9180a60ce258f7d4c1" inode="2555189" device="2304" mtime="888592560" flags="0" name="/usr/share/texmf/doc/help/faq/LaTeX-FAQ-francaise/part2" file_size="153974" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="529173ecbff9c4a327caa3e6dc6c385d" inode="2555190" device="2304" mtime="888592680" flags="0" name="/usr/share/texmf/doc/help/faq/LaTeX-FAQ-francaise/part3" file_size="168272" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="11f6d935b767f86715e673e6b270dc9b" inode="3718325" device="2304" mtime="823843800" flags="0" name="/usr/share/texmf/doc/help/faq/TeX-FAQ" file_size="67410" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="64bf0fc4988c5f5b6be41dfc382d3b2c" inode="3718324" device="2304" mtime="915732303" flags="0" name="/usr/share/texmf/doc/help/faq/UserGroups.html" file_size="12779" groupname="root" linkto="" rdev="11031" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7845b0d9f773cd08c7a7208587589dd1" inode="3718326" device="2304" mtime="915731291" flags="0" name="/usr/share/texmf/doc/help/faq/dante-faq.html" file_size="5086" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="2553328" device="2304" mtime="949261432" flags="0" name="/usr/share/texmf/doc/help/faq/de-tex-faq" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="38b2bcd54978c8eec34f1c77fc01a543" inode="2554778" device="2304" mtime="948253980" flags="0" name="/usr/share/texmf/doc/help/faq/de-tex-faq/part1" file_size="30307" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b0b770b7fb8b022b51d9c2a83cc9dce6" inode="2555185" device="2304" mtime="948253980" flags="0" name="/usr/share/texmf/doc/help/faq/de-tex-faq/part10" file_size="26469" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6ffd17a70080d138397f919e87b1377f" inode="2555186" device="2304" mtime="948253980" flags="0" name="/usr/share/texmf/doc/help/faq/de-tex-faq/part11" file_size="25060" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ad36c18d3fe351e6db3e841c658097c4" inode="2555177" device="2304" mtime="948253980" flags="0" name="/usr/share/texmf/doc/help/faq/de-tex-faq/part2" file_size="26236" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ad47128e4eeaf9641f956929ca774220" inode="2555178" device="2304" mtime="948253980" flags="0" name="/usr/share/texmf/doc/help/faq/de-tex-faq/part3" file_size="33449" groupname="root" linkto="" rdev="19214" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e28fa659c335573cfb38cd220932076f" inode="2555179" device="2304" mtime="948253980" flags="0" name="/usr/share/texmf/doc/help/faq/de-tex-faq/part4" file_size="29935" groupname="root" linkto="" rdev="1030" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4cf6dffee6f421d5bc477a3766f2ae22" inode="2555180" device="2304" mtime="948253980" flags="0" name="/usr/share/texmf/doc/help/faq/de-tex-faq/part5" file_size="33493" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4c222658f261bb49f28fa785cca8034e" inode="2555181" device="2304" mtime="948253980" flags="0" name="/usr/share/texmf/doc/help/faq/de-tex-faq/part6" file_size="35245" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="aa86a7748f161b0d608d04f99f9a698b" inode="2555182" device="2304" mtime="948253980" flags="0" name="/usr/share/texmf/doc/help/faq/de-tex-faq/part7" file_size="28074" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ba80983fe9b89206d61032281dbefe3d" inode="2555183" device="2304" mtime="948253980" flags="0" name="/usr/share/texmf/doc/help/faq/de-tex-faq/part8" file_size="36920" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6472292d904b668472bc15d748e3eb75" inode="2555184" device="2304" mtime="948253980" flags="0" name="/usr/share/texmf/doc/help/faq/de-tex-faq/part9" file_size="26264" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bdff8e248b4b37fbfa25e5e6b585af09" inode="3718323" device="2304" mtime="909980951" flags="0" name="/usr/share/texmf/doc/help/faq/index.html" file_size="584" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3718301" device="2304" mtime="1031330502" flags="0" name="/usr/share/texmf/doc/help/faq/uktug-faq" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3718313" device="2304" mtime="1031330502" flags="0" name="/usr/share/texmf/doc/help/faq/uktug-faq/index.html" file_size="15" groupname="root" linkto="texfaq_toc.html" rdev="0" verifyflags="-1" file_mode="-24065" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a52c4fc05fd74b96a5449bf79f87153a" inode="3718302" device="2304" mtime="945959604" flags="0" name="/usr/share/texmf/doc/help/faq/uktug-faq/texfaq_0.html" file_size="3740" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="367bfad90e12ccf4ec76ec3b87a00bda" inode="3718303" device="2304" mtime="945959604" flags="0" name="/usr/share/texmf/doc/help/faq/uktug-faq/texfaq_1.html" file_size="23340" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="be8576d11f20d56a1a4e0a89c593bae3" inode="3718314" device="2304" mtime="945959604" flags="0" name="/usr/share/texmf/doc/help/faq/uktug-faq/texfaq_10.html" file_size="8864" groupname="root" linkto="" rdev="-24307" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0f396f30b5026acb0774580c0d0b4f09" inode="3718315" device="2304" mtime="945959604" flags="0" name="/usr/share/texmf/doc/help/faq/uktug-faq/texfaq_11.html" file_size="19753" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0f5b200513e476d39a9eff1249695e05" inode="3718316" device="2304" mtime="945959604" flags="0" name="/usr/share/texmf/doc/help/faq/uktug-faq/texfaq_12.html" file_size="22143" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9a7bb36c9f76c5f943aa9ef957095373" inode="3718317" device="2304" mtime="945959604" flags="0" name="/usr/share/texmf/doc/help/faq/uktug-faq/texfaq_13.html" file_size="23882" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d68d8df80fe359ebfbd70a8815a3e1e7" inode="3718318" device="2304" mtime="945959604" flags="0" name="/usr/share/texmf/doc/help/faq/uktug-faq/texfaq_14.html" file_size="3960" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1d71d6d7749e3e0614c8b080c2bedfcd" inode="3718319" device="2304" mtime="945959604" flags="0" name="/usr/share/texmf/doc/help/faq/uktug-faq/texfaq_15.html" file_size="19965" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2a5b2723cf22b385e7184a5d14671081" inode="3718320" device="2304" mtime="945959604" flags="0" name="/usr/share/texmf/doc/help/faq/uktug-faq/texfaq_16.html" file_size="12461" groupname="root" linkto="" rdev="650" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9972d7b1b54e3d2e6a408d63160be4ec" inode="3718321" device="2304" mtime="945959604" flags="0" name="/usr/share/texmf/doc/help/faq/uktug-faq/texfaq_17.html" file_size="7067" groupname="root" linkto="" rdev="649" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="dfe26b69e37b9e60b758627207bfe8d8" inode="3718322" device="2304" mtime="945959604" flags="0" name="/usr/share/texmf/doc/help/faq/uktug-faq/texfaq_18.html" file_size="3280" groupname="root" linkto="" rdev="792" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="df865afa78a00a581d38c4837c383db9" inode="3718304" device="2304" mtime="945959604" flags="0" name="/usr/share/texmf/doc/help/faq/uktug-faq/texfaq_2.html" file_size="16640" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4613d0a09a10e29dd5fc6081808e98c1" inode="3718305" device="2304" mtime="945959604" flags="0" name="/usr/share/texmf/doc/help/faq/uktug-faq/texfaq_3.html" file_size="11312" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="620331af968e45310720c0631484970c" inode="3718306" device="2304" mtime="945959604" flags="0" name="/usr/share/texmf/doc/help/faq/uktug-faq/texfaq_4.html" file_size="8457" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c31c283b482d31f2fdf6dc798a482c1e" inode="3718307" device="2304" mtime="945959604" flags="0" name="/usr/share/texmf/doc/help/faq/uktug-faq/texfaq_5.html" file_size="19193" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="757edba3fa78c2aaefa687ab36a7c932" inode="3718308" device="2304" mtime="945959604" flags="0" name="/usr/share/texmf/doc/help/faq/uktug-faq/texfaq_6.html" file_size="5632" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ac5bfb7cf9975c500ab6f82a6eb576a6" inode="3718309" device="2304" mtime="945959604" flags="0" name="/usr/share/texmf/doc/help/faq/uktug-faq/texfaq_7.html" file_size="4843" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c8c2e69eab7a1636580f09d90509fb9f" inode="3718310" device="2304" mtime="945959604" flags="0" name="/usr/share/texmf/doc/help/faq/uktug-faq/texfaq_8.html" file_size="3475" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="543c2abeaf97dc665dddeb55d1a30d27" inode="3718311" device="2304" mtime="945959604" flags="0" name="/usr/share/texmf/doc/help/faq/uktug-faq/texfaq_9.html" file_size="17231" groupname="root" linkto="" rdev="8464" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="62c5ef387420bf899f45ff2dacf14fca" inode="3718312" device="2304" mtime="945959604" flags="0" name="/usr/share/texmf/doc/help/faq/uktug-faq/texfaq_toc.html" file_size="11074" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a1c9fc9930b45a782d16135bfd559f5f" inode="3718329" device="2304" mtime="885870067" flags="0" name="/usr/share/texmf/doc/help/tds.dvi" file_size="82768" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="24d68e887cda056bdd054e4d1ef4a650" inode="3718328" device="2304" mtime="885174764" flags="0" name="/usr/share/texmf/doc/help/unixtex.ftp" file_size="9720" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1376faa008be5ad395090f0847fc3618" inode="2982483" device="2304" mtime="830719347" flags="0" name="/usr/share/texmf/doc/helpfile" file_size="4313" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6a7f0c36d41ef5c891ba2c4eb1a31d33" inode="2982477" device="2304" mtime="949409163" flags="0" name="/usr/share/texmf/doc/helpindex.html" file_size="23871" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="1231522" device="2304" mtime="870030848" flags="0" name="/usr/share/texmf/doc/images" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5ee858736dde8d8c4ff6dc8adb0561f4" inode="1231525" device="2304" mtime="868391220" flags="0" name="/usr/share/texmf/doc/images/missing-arrow.gif" file_size="166" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="348175d457647bcdca2146bc99850595" inode="1231524" device="2304" mtime="868391220" flags="0" name="/usr/share/texmf/doc/images/next-arrow.gif" file_size="275" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3432e207160fb7f3ae54a1e38eabcfa3" inode="1231532" device="2304" mtime="868391220" flags="0" name="/usr/share/texmf/doc/images/prev-arrow.gif" file_size="279" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9dd5e7609c89e6d5fc44adaf071eb113" inode="1231523" device="2304" mtime="868391220" flags="0" name="/usr/share/texmf/doc/images/up-arrow.gif" file_size="264" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="2982478" device="2304" mtime="1031330502" flags="0" name="/usr/share/texmf/doc/index.html" file_size="17" groupname="root" linkto="newhelpindex.html" rdev="0" verifyflags="-1" file_mode="-24065" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="1231549" device="2304" mtime="989511066" flags="0" name="/usr/share/texmf/doc/jbibtex" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="1231550" device="2304" mtime="989511066" flags="0" name="/usr/share/texmf/doc/jbibtex/doc-ascii" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="81f89136e72c1d6e51934f46e8ba53d8" inode="1231551" device="2304" mtime="972571323" flags="0" name="/usr/share/texmf/doc/jbibtex/doc-ascii/Makefile" file_size="193" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0b5b63cae83f930661302152ee8c302f" inode="1231552" device="2304" mtime="972571323" flags="0" name="/usr/share/texmf/doc/jbibtex/doc-ascii/README" file_size="2312" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5c54d917e875a0be3fa3860ca65ec1de" inode="1231553" device="2304" mtime="972571324" flags="0" name="/usr/share/texmf/doc/jbibtex/doc-ascii/README.1st" file_size="263" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="11559e412d7a3a9f544e3b70e4f0192a" inode="1231554" device="2304" mtime="972571323" flags="0" name="/usr/share/texmf/doc/jbibtex/doc-ascii/cpp.awk" file_size="3110" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="00365ec4a7b641de8cfc6ba0bb65d279" inode="1231555" device="2304" mtime="972571323" flags="0" name="/usr/share/texmf/doc/jbibtex/doc-ascii/generate.sh" file_size="1009" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="656c117e0f13832c4e83ccc2cf0bf098" inode="1231556" device="2304" mtime="972571323" flags="0" name="/usr/share/texmf/doc/jbibtex/doc-ascii/jbibtex.bib" file_size="1090" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0ffba9ae1b9d89ea4221702a534e5e81" inode="1231557" device="2304" mtime="972571323" flags="0" name="/usr/share/texmf/doc/jbibtex/doc-ascii/jbibtex.tex" file_size="28724" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="40d386d794f6c83f91737b3861f274e4" inode="1231558" device="2304" mtime="972571324" flags="0" name="/usr/share/texmf/doc/jbibtex/doc-ascii/jbtxbst.doc" file_size="101714" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0e14933a58714c6b9eaa683716bcf1ee" inode="1231559" device="2304" mtime="972571324" flags="0" name="/usr/share/texmf/doc/jbibtex/doc-ascii/jbtxdoc.bib" file_size="3502" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="60097f780cf256e8d2a2d92e442bb148" inode="1231560" device="2304" mtime="972571324" flags="0" name="/usr/share/texmf/doc/jbibtex/doc-ascii/jbtxdoc.tex" file_size="47450" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7f1ae8c308df608de79fffbcbba5e50f" inode="1231561" device="2304" mtime="972571324" flags="0" name="/usr/share/texmf/doc/jbibtex/doc-ascii/jbtxhak.tex" file_size="33679" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="2702581" device="2304" mtime="984325615" flags="0" name="/usr/share/texmf/doc/latex" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="544527" device="2304" mtime="921116080" flags="0" name="/usr/share/texmf/doc/latex/acronym" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="10f7cd8988e962c67c8297aae3a68fbb" inode="544530" device="2304" mtime="921115918" flags="0" name="/usr/share/texmf/doc/latex/acronym/acronym.dvi" file_size="8736" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8f8e5decbd61b9ff201a072e609d10ea" inode="544529" device="2304" mtime="921115904" flags="0" name="/usr/share/texmf/doc/latex/acronym/acrotest.tex" file_size="1570" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b1485033a81bbe5d1896c03f125854bc" inode="544528" device="2304" mtime="839991600" flags="0" name="/usr/share/texmf/doc/latex/acronym/readme" file_size="702" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3914533" device="2304" mtime="984183741" flags="0" name="/usr/share/texmf/doc/latex/amscls" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="42062206f43bc032baeda65a72bb69a4" inode="3914535" device="2304" mtime="958568580" flags="0" name="/usr/share/texmf/doc/latex/amscls/amsclass.faq" file_size="9463" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2b81165a0970e91b806db28309f0077a" inode="3914540" device="2304" mtime="984183148" flags="0" name="/usr/share/texmf/doc/latex/amscls/amsthdoc.dvi" file_size="12212" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="24eb09646f5b3b44d49c8ad06665ed12" inode="3914534" device="2304" mtime="944242680" flags="0" name="/usr/share/texmf/doc/latex/amscls/diffs-c.txt" file_size="8362" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="178bcb5124951345f41b6d7957f565ea" inode="3914538" device="2304" mtime="984183157" flags="0" name="/usr/share/texmf/doc/latex/amscls/instr-l.dvi" file_size="65164" groupname="root" linkto="" rdev="1968" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="68a86b39e46a877cd3d352c46070f3cf" inode="3914539" device="2304" mtime="984183163" flags="0" name="/usr/share/texmf/doc/latex/amscls/thmtest.dvi" file_size="5772" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="627777" device="2304" mtime="984183830" flags="0" name="/usr/share/texmf/doc/latex/amsmath" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2588e14b27e2378dc87db0ceeec72e9b" inode="627780" device="2304" mtime="984181007" flags="0" name="/usr/share/texmf/doc/latex/amsmath/amsldoc.dvi" file_size="121776" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5d9110681c75c47038bde09e9ebe8a8e" inode="627782" device="2304" mtime="970588260" flags="0" name="/usr/share/texmf/doc/latex/amsmath/amsmath.faq" file_size="12512" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c29393c6e9d3045e84f6d0c205a233f5" inode="627778" device="2304" mtime="945285060" flags="0" name="/usr/share/texmf/doc/latex/amsmath/diffs-m.txt" file_size="22654" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6455d3ace9d626931da571e1404ba549" inode="627781" device="2304" mtime="984181014" flags="0" name="/usr/share/texmf/doc/latex/amsmath/subeqn.dvi" file_size="4928" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="94616cb76f1e6841e07b9ad3f0288fe2" inode="627783" device="2304" mtime="984181026" flags="0" name="/usr/share/texmf/doc/latex/amsmath/technote.dvi" file_size="13592" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3aa87d061ea1304c0e3724493a44730e" inode="627779" device="2304" mtime="984181035" flags="0" name="/usr/share/texmf/doc/latex/amsmath/testmath.dvi" file_size="124428" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="2702601" device="2304" mtime="984183879" flags="0" name="/usr/share/texmf/doc/latex/base" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a74e5c1b7c09783ee61d67f441698d90" inode="2703068" device="2304" mtime="959824800" flags="0" name="/usr/share/texmf/doc/latex/base/00readme.txt" file_size="4038" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="650b78b362aa05451f8a8e9b1e9fd7f8" inode="2704485" device="2304" mtime="838915901" flags="0" name="/usr/share/texmf/doc/latex/base/README.tetex" file_size="248" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a2ef2e6de87e98b85382e7c274acc90c" inode="2703074" device="2304" mtime="945921600" flags="0" name="/usr/share/texmf/doc/latex/base/begleit.err" file_size="90159" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="acb9589d93e5265b1b4a654e26f647ba" inode="2704486" device="2304" mtime="945921600" flags="0" name="/usr/share/texmf/doc/latex/base/bugs.txt" file_size="5550" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="686c7d537d311cd8772f52757fc1f50b" inode="2704491" device="2304" mtime="984176096" flags="0" name="/usr/share/texmf/doc/latex/base/cfgguide.dvi" file_size="34108" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8d0452dcfb351b0bd506e5c68acf2503" inode="2704493" device="2304" mtime="967600800" flags="0" name="/usr/share/texmf/doc/latex/base/changes.txt" file_size="244073" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fa720682bd665ca4594e0a7fd32c805f" inode="2703067" device="2304" mtime="984176098" flags="0" name="/usr/share/texmf/doc/latex/base/clsguide.dvi" file_size="106320" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="dbb917be54fd803ef0906f74cac6cce3" inode="2703064" device="2304" mtime="963433860" flags="0" name="/usr/share/texmf/doc/latex/base/compan.err" file_size="106078" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d776c130dd2a026ddc4c42e8473739a1" inode="2703075" device="2304" mtime="984176125" flags="0" name="/usr/share/texmf/doc/latex/base/cyrguide.dvi" file_size="24496" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6e7eb16ad449843bffce49bbb7b1598f" inode="2703062" device="2304" mtime="984176117" flags="0" name="/usr/share/texmf/doc/latex/base/doc.dvi" file_size="267492" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="04d5cf18fca7cc1cd08af6a94b14551c" inode="2703066" device="2304" mtime="984176122" flags="0" name="/usr/share/texmf/doc/latex/base/docstrip.dvi" file_size="220648" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cf498e1c0a5f1d797086b999202c1ab3" inode="2703073" device="2304" mtime="984176100" flags="0" name="/usr/share/texmf/doc/latex/base/fntguide.dvi" file_size="100084" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a8b3a5dba4e4aa90402935be30b0c08a" inode="2704489" device="2304" mtime="984176123" flags="0" name="/usr/share/texmf/doc/latex/base/ifthen.dvi" file_size="17660" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9d565e7f154b996125a1e0b8d141545c" inode="2704487" device="2304" mtime="984176124" flags="0" name="/usr/share/texmf/doc/latex/base/inputenc.dvi" file_size="97988" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7eb05994954eaad70956fbb8486fb4bd" inode="2703065" device="2304" mtime="965082660" flags="0" name="/usr/share/texmf/doc/latex/base/legal.txt" file_size="1098" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="16a75b98555f4be4a216731dfb18a90e" inode="2704490" device="2304" mtime="945921600" flags="0" name="/usr/share/texmf/doc/latex/base/lppl-1-1.txt" file_size="14356" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5af7e4b8e7dde262cf18bd7224f454b5" inode="2702604" device="2304" mtime="945921600" flags="0" name="/usr/share/texmf/doc/latex/base/lppl.txt" file_size="14439" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="59baaacae1e97eb0ecc9adbd4732c3cc" inode="2704471" device="2304" mtime="984176101" flags="0" name="/usr/share/texmf/doc/latex/base/ltnews01.dvi" file_size="8112" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0e54f66b7ea20d270fec260e8c546fd6" inode="2704472" device="2304" mtime="984176101" flags="0" name="/usr/share/texmf/doc/latex/base/ltnews02.dvi" file_size="7396" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f75396d870656a8c0207e42fa7e2ad6d" inode="2704473" device="2304" mtime="984176102" flags="0" name="/usr/share/texmf/doc/latex/base/ltnews03.dvi" file_size="7212" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4c3ef093b8a9b9fb14ebb672f7e26524" inode="2704474" device="2304" mtime="984176102" flags="0" name="/usr/share/texmf/doc/latex/base/ltnews04.dvi" file_size="6944" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="18274ff58cebd7aaa026e196ef2a78b9" inode="2704475" device="2304" mtime="984176103" flags="0" name="/usr/share/texmf/doc/latex/base/ltnews05.dvi" file_size="6956" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="433799affc1ff1916267c620c196281c" inode="2704476" device="2304" mtime="984176103" flags="0" name="/usr/share/texmf/doc/latex/base/ltnews06.dvi" file_size="6636" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="28a5f2384ce8033e33aa2e36cef51533" inode="2704477" device="2304" mtime="984176105" flags="0" name="/usr/share/texmf/doc/latex/base/ltnews07.dvi" file_size="6488" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="46830bac5eb035a095c52a43af2216b8" inode="2704478" device="2304" mtime="984176106" flags="0" name="/usr/share/texmf/doc/latex/base/ltnews08.dvi" file_size="6776" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bd174c275f34cc14c042d31769dfc840" inode="2704479" device="2304" mtime="984176106" flags="0" name="/usr/share/texmf/doc/latex/base/ltnews09.dvi" file_size="6592" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6724a687edc7732e20e6448c0d16d8cf" inode="2704480" device="2304" mtime="984176107" flags="0" name="/usr/share/texmf/doc/latex/base/ltnews10.dvi" file_size="7176" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d46ee1cefb162607f0cb7615eaf7a671" inode="2704481" device="2304" mtime="984176107" flags="0" name="/usr/share/texmf/doc/latex/base/ltnews11.dvi" file_size="6860" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="366c008bd0fbe13df467de3630cfbe17" inode="2704482" device="2304" mtime="984176108" flags="0" name="/usr/share/texmf/doc/latex/base/ltnews12.dvi" file_size="6156" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f78cdb50e4fe4a2e01a8ffcf7fb65e18" inode="2704494" device="2304" mtime="984176104" flags="0" name="/usr/share/texmf/doc/latex/base/ltx3info.dvi" file_size="23628" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c158fa9d543ec6276f200af1d7970008" inode="2704488" device="2304" mtime="965080260" flags="0" name="/usr/share/texmf/doc/latex/base/manifest.txt" file_size="12529" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a760cfe695740bf001051b47e4b7a22e" inode="2703058" device="2304" mtime="945921600" flags="0" name="/usr/share/texmf/doc/latex/base/manual.err" file_size="10569" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="41dfee9b07f5e01ddee4c8a7df46765d" inode="2704492" device="2304" mtime="984176105" flags="0" name="/usr/share/texmf/doc/latex/base/modguide.dvi" file_size="21020" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9a29255d11136ecae721232e4ccc3d1b" inode="2703061" device="2304" mtime="959824800" flags="0" name="/usr/share/texmf/doc/latex/base/patches.txt" file_size="1877" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1ec9eef2700a2f3ed1683d3a57aadb0f" inode="2704484" device="2304" mtime="984175993" flags="0" name="/usr/share/texmf/doc/latex/base/usrguide.dvi" file_size="116364" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="02247c019cffbdea4d5f3ff4d4dc2fa8" inode="2703060" device="2304" mtime="945921600" flags="0" name="/usr/share/texmf/doc/latex/base/webcomp.err" file_size="7750" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="971079" device="2304" mtime="868813113" flags="0" name="/usr/share/texmf/doc/latex/booktabs" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4aca831c209d89d252fe8f52a85d642e" inode="971081" device="2304" mtime="868813099" flags="0" name="/usr/share/texmf/doc/latex/booktabs/booktabs.dvi" file_size="34376" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b5a16f7902060464ecc5e1d294f0f726" inode="971080" device="2304" mtime="815752080" flags="0" name="/usr/share/texmf/doc/latex/booktabs/booktabs.readme" file_size="479" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="544500" device="2304" mtime="924215592" flags="0" name="/usr/share/texmf/doc/latex/carlisle" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d49260d14bfe9923d2a94c199b9deb2f" inode="544505" device="2304" mtime="924215437" flags="0" name="/usr/share/texmf/doc/latex/carlisle/colortbl.ps" file_size="305170" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="329c19514fa6c848844aa1164db70a15" inode="544502" device="2304" mtime="924215440" flags="0" name="/usr/share/texmf/doc/latex/carlisle/fix2col.dvi" file_size="23920" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3db62772e01e225f722bad4e0c210106" inode="544506" device="2304" mtime="924215432" flags="0" name="/usr/share/texmf/doc/latex/carlisle/ltxtable.dvi" file_size="4116" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ff87880701c117d0a7886ddefd5b483e" inode="544503" device="2304" mtime="906689306" flags="0" name="/usr/share/texmf/doc/latex/carlisle/plain.txt" file_size="1630" groupname="root" linkto="" rdev="16806" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="848af635c1e8f98fe59d2f904e04248e" inode="544501" device="2304" mtime="924215480" flags="0" name="/usr/share/texmf/doc/latex/carlisle/pspicture.dvi" file_size="23492" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="06aa84a4ecd5cc63538c6353d007277e" inode="544504" device="2304" mtime="924215430" flags="0" name="/usr/share/texmf/doc/latex/carlisle/typehtml.dvi" file_size="74256" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="544512" device="2304" mtime="949171178" flags="0" name="/usr/share/texmf/doc/latex/ccaption" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8d9f833cda4d07f9f5615f1227513acf" inode="544513" device="2304" mtime="938453640" flags="0" name="/usr/share/texmf/doc/latex/ccaption/README" file_size="1008" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8a67c010e53695e90fb418d5aad4492e" inode="544514" device="2304" mtime="949171106" flags="0" name="/usr/share/texmf/doc/latex/ccaption/ccaption.dvi" file_size="68096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="856709" device="2304" mtime="949318054" flags="0" name="/usr/share/texmf/doc/latex/ccfonts" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="767f926f3c0676b943d29bb080cff6f7" inode="856710" device="2304" mtime="949318051" flags="0" name="/usr/share/texmf/doc/latex/ccfonts/ccfonts.dvi" file_size="12028" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ab90ee3b65a615160b55814f76dbf7a9" inode="856712" device="2304" mtime="931359856" flags="0" name="/usr/share/texmf/doc/latex/ccfonts/liesmich" file_size="1066" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4992837940e1e810e0161ca232527a95" inode="856711" device="2304" mtime="943285500" flags="0" name="/usr/share/texmf/doc/latex/ccfonts/readme" file_size="4555" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="544433" device="2304" mtime="934160034" flags="0" name="/usr/share/texmf/doc/latex/changebar" file_size="4096" groupname="root" linkto="" rdev="-23033" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c96b0b5c5f5b8ab5b0574521431947be" inode="544434" device="2304" mtime="888414300" flags="0" name="/usr/share/texmf/doc/latex/changebar/catalog.txt" file_size="353" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="937c480412abb87d14a6a13fa7f58436" inode="544436" device="2304" mtime="929849880" flags="0" name="/usr/share/texmf/doc/latex/changebar/changebar.bug" file_size="6997" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cc3e2781afc0f51b915599a308c5de44" inode="544437" device="2304" mtime="934160028" flags="0" name="/usr/share/texmf/doc/latex/changebar/changebar.dvi" file_size="71504" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9408f278f8cce0ff4a3e16850cd4544c" inode="544435" device="2304" mtime="909747916" flags="0" name="/usr/share/texmf/doc/latex/changebar/chbar.sh" file_size="5783" groupname="root" linkto="" rdev="3391" verifyflags="-1" file_mode="-32275" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3701956" device="2304" mtime="927923914" flags="0" name="/usr/share/texmf/doc/latex/custom-bib" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="04bd60b2efff5efce786a1e183958d57" inode="3701959" device="2304" mtime="927284760" flags="0" name="/usr/share/texmf/doc/latex/custom-bib/README.389" file_size="21367" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="870102087051d4144fc6437d21c11b6c" inode="3701960" device="2304" mtime="927923813" flags="0" name="/usr/share/texmf/doc/latex/custom-bib/geophys.tex" file_size="13925" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2cf5ee6f40e3930225300b2331a2edb2" inode="3701958" device="2304" mtime="927923869" flags="0" name="/usr/share/texmf/doc/latex/custom-bib/makebst.dvi" file_size="40068" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d211291d0dce47ffcc61a89c1a10c98a" inode="3701957" device="2304" mtime="927923813" flags="0" name="/usr/share/texmf/doc/latex/custom-bib/shorthnd.tex" file_size="17675" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="1085632" device="2304" mtime="984183899" flags="0" name="/usr/share/texmf/doc/latex/cyrillic" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="eef38eff3fe50a5d0d992a225cc283e4" inode="1085634" device="2304" mtime="959824800" flags="0" name="/usr/share/texmf/doc/latex/cyrillic/00readme.txt" file_size="2140" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5937acd714f5d018ca5a623746d1bbd8" inode="1085639" device="2304" mtime="957405540" flags="0" name="/usr/share/texmf/doc/latex/cyrillic/changes.txt" file_size="3732" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f7723a63d72215e2b37da55692b717f5" inode="1085637" device="2304" mtime="984178782" flags="0" name="/usr/share/texmf/doc/latex/cyrillic/cyinpenc.dvi" file_size="90844" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3d6f79917f98071255f5473ae4ed7df8" inode="1085635" device="2304" mtime="984178783" flags="0" name="/usr/share/texmf/doc/latex/cyrillic/cyoutenc.dvi" file_size="33672" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f2397d67729b84d52d3e9d3deb4ede5f" inode="1085633" device="2304" mtime="984178784" flags="0" name="/usr/share/texmf/doc/latex/cyrillic/lcy.dvi" file_size="16940" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="510310061b593c4c4ef86f3544b650e7" inode="1085636" device="2304" mtime="945921600" flags="0" name="/usr/share/texmf/doc/latex/cyrillic/manifest.txt" file_size="1021" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8a76a2b1a47a4f332617acd4bd63d054" inode="1085638" device="2304" mtime="984178784" flags="0" name="/usr/share/texmf/doc/latex/cyrillic/ot2.dvi" file_size="8972" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="513307" device="2304" mtime="949173603" flags="0" name="/usr/share/texmf/doc/latex/dinbrief" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="58eca20a7a1ff733dd790604f76329c2" inode="513318" device="2304" mtime="949173565" flags="0" name="/usr/share/texmf/doc/latex/dinbrief/brfbody.tex" file_size="6880" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2b2abe984c96604f2886526f911c4942" inode="513308" device="2304" mtime="949173565" flags="0" name="/usr/share/texmf/doc/latex/dinbrief/brfkopf.tex" file_size="3601" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e451fc0dd0253a51c00a9eddb438e77a" inode="513310" device="2304" mtime="949173565" flags="0" name="/usr/share/texmf/doc/latex/dinbrief/dbold.tex" file_size="7288" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3a966f500ed684b15493ba17bfbbe793" inode="513311" device="2304" mtime="949173565" flags="0" name="/usr/share/texmf/doc/latex/dinbrief/dinbrief.cfg" file_size="1570" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4cedb94f2f6ae5f3a45fb233c8efae69" inode="513312" device="2304" mtime="949173570" flags="0" name="/usr/share/texmf/doc/latex/dinbrief/dinbrief.dvi" file_size="66004" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="dfcc7110396d402c64a5b85bbc74a8ab" inode="513309" device="2304" mtime="949173572" flags="0" name="/usr/share/texmf/doc/latex/dinbrief/dintab.dvi" file_size="4508" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="61365c681ba47c2e813bd80400f29822" inode="513313" device="2304" mtime="949173565" flags="0" name="/usr/share/texmf/doc/latex/dinbrief/example.tex" file_size="5740" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3074d50ba94aa7bda5b7284a713541d6" inode="513320" device="2304" mtime="948392400" flags="0" name="/usr/share/texmf/doc/latex/dinbrief/liesmich" file_size="4499" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ac037399b188b54d4954486a2f711dd3" inode="513317" device="2304" mtime="948392400" flags="0" name="/usr/share/texmf/doc/latex/dinbrief/readme" file_size="8161" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="35bc7a6eb81548643495e1bf806de3d5" inode="513314" device="2304" mtime="949173565" flags="0" name="/usr/share/texmf/doc/latex/dinbrief/test10.tex" file_size="3421" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a0d8cb46c85a639de2e935cd3b70b25f" inode="513315" device="2304" mtime="949173565" flags="0" name="/usr/share/texmf/doc/latex/dinbrief/test11.tex" file_size="3426" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fa12b99972d3d8762337824decd91507" inode="513316" device="2304" mtime="949173565" flags="0" name="/usr/share/texmf/doc/latex/dinbrief/test12.tex" file_size="3426" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="768e3b3211537393c98d6bd3c54d8570" inode="513319" device="2304" mtime="949173565" flags="0" name="/usr/share/texmf/doc/latex/dinbrief/testnorm.tex" file_size="3430" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="709535" device="2304" mtime="920935433" flags="0" name="/usr/share/texmf/doc/latex/draftcopy" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8352b70bf0dd99a83aeccbbde25a7719" inode="709536" device="2304" mtime="920408878" flags="0" name="/usr/share/texmf/doc/latex/draftcopy/README" file_size="880" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="65432a0767b8d30c04a45b2e75de0730" inode="709537" device="2304" mtime="920439132" flags="0" name="/usr/share/texmf/doc/latex/draftcopy/draftcopy-test-1.tex" file_size="1045" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="57fdbc7b8bcd26d40038404953c0c4ac" inode="709538" device="2304" mtime="920439132" flags="0" name="/usr/share/texmf/doc/latex/draftcopy/draftcopy-test-2.tex" file_size="1077" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="36328bcc79c3df217a5f48619c385ec6" inode="709539" device="2304" mtime="920439132" flags="0" name="/usr/share/texmf/doc/latex/draftcopy/draftcopy-test-3.tex" file_size="1090" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2fc8ddd570857ed89ef099b64b615c0e" inode="709540" device="2304" mtime="920439132" flags="0" name="/usr/share/texmf/doc/latex/draftcopy/draftcopy-test-4.tex" file_size="1202" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e4ae0ff5093785ffbfa3a771394417d5" inode="709541" device="2304" mtime="920439133" flags="0" name="/usr/share/texmf/doc/latex/draftcopy/draftcopy-test-5.tex" file_size="1080" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="91d88a19e2c5ae548442132088358d07" inode="709542" device="2304" mtime="920439133" flags="0" name="/usr/share/texmf/doc/latex/draftcopy/draftcopy-test-6.tex" file_size="1147" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d26a651923db3c81a4f8fa953f2c39b8" inode="709543" device="2304" mtime="920439133" flags="0" name="/usr/share/texmf/doc/latex/draftcopy/draftcopy-test-7.tex" file_size="1271" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b6b5ee58f9bcb12c28df2fc14227f05f" inode="709544" device="2304" mtime="920439133" flags="0" name="/usr/share/texmf/doc/latex/draftcopy/draftcopy-test-8.tex" file_size="1209" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="45257e5db47bc5e370d2bddd4ba4e0bf" inode="709545" device="2304" mtime="920439133" flags="0" name="/usr/share/texmf/doc/latex/draftcopy/draftcopy-test-9.tex" file_size="1374" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="653e1cd09101303641b205b7ebcabf8c" inode="709546" device="2304" mtime="920439970" flags="0" name="/usr/share/texmf/doc/latex/draftcopy/draftcopy.dvi" file_size="38692" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3538436" device="2304" mtime="918961282" flags="0" name="/usr/share/texmf/doc/latex/eepic" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a34c628c3e7cca52eac42dcbb20ef5bf" inode="3538442" device="2304" mtime="918961282" flags="0" name="/usr/share/texmf/doc/latex/eepic/eepic.dvi" file_size="73648" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="54a1facee676dfee68a1c97399e7ab15" inode="3538437" device="2304" mtime="665290800" flags="0" name="/usr/share/texmf/doc/latex/eepic/epic-eg3.fig" file_size="2118" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6808f5f44580569f5f2d60540b448e42" inode="3538438" device="2304" mtime="665290800" flags="0" name="/usr/share/texmf/doc/latex/eepic/epic-eg3.tex" file_size="2732" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d63d849daff18b40bb8b1bdb7f41376f" inode="3538439" device="2304" mtime="665290800" flags="0" name="/usr/share/texmf/doc/latex/eepic/epic-eg4.fig" file_size="2290" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="944bf581f0a03deab220657988377086" inode="3538440" device="2304" mtime="665290800" flags="0" name="/usr/share/texmf/doc/latex/eepic/epic-eg4.tex" file_size="2788" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="35d2a98f607fa301b6d8ed0717629a4c" inode="3538441" device="2304" mtime="726811200" flags="0" name="/usr/share/texmf/doc/latex/eepic/readme" file_size="4675" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="544418" device="2304" mtime="905100127" flags="0" name="/usr/share/texmf/doc/latex/fancyhdr" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="56128995d65a94a1a024f26babb8f4cb" inode="544419" device="2304" mtime="887575898" flags="0" name="/usr/share/texmf/doc/latex/fancyhdr/README" file_size="1230" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2f1740b1f8e1c62cb3fb2d416dc71e10" inode="544420" device="2304" mtime="905100115" flags="0" name="/usr/share/texmf/doc/latex/fancyhdr/fancyhdr.dvi" file_size="94632" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1bb288a180b1bc2bb6de3a989acba69c" inode="544421" device="2304" mtime="834525840" flags="0" name="/usr/share/texmf/doc/latex/fancyhdr/fancyheadings.new" file_size="125" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="544422" device="2304" mtime="928453059" flags="0" name="/usr/share/texmf/doc/latex/fancyvrb" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="099c19d36b5479ea3bd6bdb1303fb0d9" inode="544423" device="2304" mtime="928453055" flags="0" name="/usr/share/texmf/doc/latex/fancyvrb/fancyvrb.ps" file_size="432205" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2e8abfb3ba0e756e9798084197f7fd6f" inode="544424" device="2304" mtime="928453058" flags="0" name="/usr/share/texmf/doc/latex/fancyvrb/fvrb-ex.dvi" file_size="27620" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="758597" device="2304" mtime="949314852" flags="0" name="/usr/share/texmf/doc/latex/floatflt" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="de590816e2f8ea49a908f155bf307c4e" inode="758600" device="2304" mtime="928453883" flags="0" name="/usr/share/texmf/doc/latex/floatflt/floatexm.dvi" file_size="22556" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ddb28ff5d0b435ec4fd48168d270cf7d" inode="758601" device="2304" mtime="949314719" flags="0" name="/usr/share/texmf/doc/latex/floatflt/floatexm.tex" file_size="15072" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2e0db4daa4659c367d5e001ffc945bee" inode="758598" device="2304" mtime="928453881" flags="0" name="/usr/share/texmf/doc/latex/floatflt/floatfge.dvi" file_size="13972" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f079ad07fd527d778d0d8173ba8b5178" inode="758599" device="2304" mtime="949314800" flags="0" name="/usr/share/texmf/doc/latex/floatflt/floatflt.dvi" file_size="34784" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="544443" device="2304" mtime="949316132" flags="0" name="/usr/share/texmf/doc/latex/footmisc" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ca6e2af41e60109ea399d3db2239e811" inode="544444" device="2304" mtime="885569673" flags="0" name="/usr/share/texmf/doc/latex/footmisc/README" file_size="573" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9a9d715815f8d14f1e7957ab726a673c" inode="544445" device="2304" mtime="949316132" flags="0" name="/usr/share/texmf/doc/latex/footmisc/footmisc.dvi" file_size="15236" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="660481" device="2304" mtime="922842930" flags="0" name="/usr/share/texmf/doc/latex/g-brief" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0197edd4c70fe2631b25dd033c619d06" inode="660483" device="2304" mtime="922842924" flags="0" name="/usr/share/texmf/doc/latex/g-brief/beispiel.tex" file_size="2019" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="44be98a9fdfd68e553edc5a216cb3837" inode="660482" device="2304" mtime="922842926" flags="0" name="/usr/share/texmf/doc/latex/g-brief/g-brief.dvi" file_size="17972" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="544486" device="2304" mtime="928410087" flags="0" name="/usr/share/texmf/doc/latex/general" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d1ca6d0c9f7e9ef73a0337d6309ab387" inode="544487" device="2304" mtime="899425286" flags="0" name="/usr/share/texmf/doc/latex/general/a.ps" file_size="180" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="01f4147d5c611b29a568245dbfbcac7c" inode="544494" device="2304" mtime="836004850" flags="0" name="/usr/share/texmf/doc/latex/general/essential.dvi" file_size="107072" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fa8607c4ff7abb4faf3122f85c7d10be" inode="544490" device="2304" mtime="836005099" flags="0" name="/usr/share/texmf/doc/latex/general/guide.dvi" file_size="80592" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="09e421554bc5217036521c9e3c9aca8f" inode="544491" device="2304" mtime="890176864" flags="0" name="/usr/share/texmf/doc/latex/general/guide.ps" file_size="145910" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3a116d4b70025f610099992064f22d01" inode="544489" device="2304" mtime="926962260" flags="0" name="/usr/share/texmf/doc/latex/general/l2kurz.dvi" file_size="150156" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fb119ef0f706883faeae55eee7a2609a" inode="544488" device="2304" mtime="852183444" flags="0" name="/usr/share/texmf/doc/latex/general/latex2e.dvi" file_size="304744" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4a13fa5b844c8b578003a1586bd40b35" inode="544493" device="2304" mtime="924105207" flags="0" name="/usr/share/texmf/doc/latex/general/lshort.dvi" file_size="273028" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cee586e9338dc410a0fceb1f1a32e2d2" inode="544492" device="2304" mtime="881283480" flags="0" name="/usr/share/texmf/doc/latex/general/symbols.dvi" file_size="21604" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3865477" device="2304" mtime="949316172" flags="0" name="/usr/share/texmf/doc/latex/geometry" file_size="4096" groupname="root" linkto="" rdev="3353" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="df12977fa65f4bec4f3012c71204c25a" inode="3865478" device="2304" mtime="949316172" flags="0" name="/usr/share/texmf/doc/latex/geometry/geometry.dvi" file_size="79852" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8cc8de0889ce93100de284cf69c24bfe" inode="3865479" device="2304" mtime="939311520" flags="0" name="/usr/share/texmf/doc/latex/geometry/gtest.tex" file_size="1915" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="20596d1734a0caf3ef23d1cdb09b6bd8" inode="3865480" device="2304" mtime="832785575" flags="0" name="/usr/share/texmf/doc/latex/geometry/showframe.sty" file_size="6425" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="169901" device="2304" mtime="949262580" flags="0" name="/usr/share/texmf/doc/latex/graphics" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d1ca6d0c9f7e9ef73a0337d6309ab387" inode="169902" device="2304" mtime="899350352" flags="0" name="/usr/share/texmf/doc/latex/graphics/a.ps" file_size="180" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0c8a6aff098fed9ce72dba4d0192ddc6" inode="169905" device="2304" mtime="882341614" flags="0" name="/usr/share/texmf/doc/latex/graphics/epslatex.ps" file_size="2308558" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9cfe158d6fdf24d76e782bd63c6c3209" inode="169903" device="2304" mtime="949262473" flags="0" name="/usr/share/texmf/doc/latex/graphics/grfguide.ps" file_size="318099" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b55ccc0ef122aa8340313196d2def04c" inode="169904" device="2304" mtime="949262475" flags="0" name="/usr/share/texmf/doc/latex/graphics/keyval.dvi" file_size="13692" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="971082" device="2304" mtime="984184029" flags="0" name="/usr/share/texmf/doc/latex/hyperref" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b588dbec6772bc23450ea40fa9dd9933" inode="971083" device="2304" mtime="930587528" flags="0" name="/usr/share/texmf/doc/latex/hyperref/manual.pdf" file_size="184049" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="544507" device="2304" mtime="909975597" flags="0" name="/usr/share/texmf/doc/latex/images" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a8c288723393faf35c7ff15e870adf5a" inode="544509" device="2304" mtime="909975573" flags="0" name="/usr/share/texmf/doc/latex/images/change_begin.gif" file_size="133" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3d93339397a5e6833b797fb0e91b4bc3" inode="544508" device="2304" mtime="909975573" flags="0" name="/usr/share/texmf/doc/latex/images/change_end.gif" file_size="135" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e0214a243a8650bdadc516de8fbd78ae" inode="544510" device="2304" mtime="886030942" flags="0" name="/usr/share/texmf/doc/latex/images/new.gif" file_size="139" groupname="root" linkto="" rdev="-24318" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ed8d4ef0cfbdfc8cd9ab9872cc6dd77b" inode="544511" device="2304" mtime="909975573" flags="0" name="/usr/share/texmf/doc/latex/images/redball.gif" file_size="398" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3064228" device="2304" mtime="934160162" flags="0" name="/usr/share/texmf/doc/latex/jknappen" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4c73089ac73306ba4089c0ce1cce76b9" inode="3064229" device="2304" mtime="930782892" flags="0" name="/usr/share/texmf/doc/latex/jknappen/mathbbol.rme" file_size="2873" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b8aadb580ef9f89ca72953da624b09f5" inode="3064230" device="2304" mtime="930782892" flags="0" name="/usr/share/texmf/doc/latex/jknappen/mathrsfs.rme" file_size="1488" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="544449" device="2304" mtime="949321347" flags="0" name="/usr/share/texmf/doc/latex/koma-script" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bba3751d72e47d2ef16692ec2efabc77" inode="544455" device="2304" mtime="949261340" flags="0" name="/usr/share/texmf/doc/latex/koma-script/README" file_size="658" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="af0862e45002438bd17f679567a11d32" inode="544453" device="2304" mtime="948938430" flags="0" name="/usr/share/texmf/doc/latex/koma-script/dir.tex" file_size="4890" groupname="root" linkto="" rdev="28061" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4007edb89351ee4be5977e76484779e5" inode="544479" device="2304" mtime="889416000" flags="0" name="/usr/share/texmf/doc/latex/koma-script/knownbug.txt" file_size="6707" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="18d10aa20e6b206eea7995337bfae2bc" inode="544454" device="2304" mtime="847857600" flags="0" name="/usr/share/texmf/doc/latex/koma-script/komabug.tex" file_size="16785" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="90c51598a5df01c3b30d525c7128f2d2" inode="544474" device="2304" mtime="946497900" flags="0" name="/usr/share/texmf/doc/latex/koma-script/liesmich.txt" file_size="9283" groupname="root" linkto="" rdev="8458" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9b2ba72009ac1af6b69efa3ba356e4bf" inode="544480" device="2304" mtime="948938430" flags="0" name="/usr/share/texmf/doc/latex/koma-script/phone.tex" file_size="3919" groupname="root" linkto="" rdev="1792" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="481b4a863cbf064d2e4c0da4adeb677b" inode="544473" device="2304" mtime="946497720" flags="0" name="/usr/share/texmf/doc/latex/koma-script/readme.txt" file_size="7257" groupname="root" linkto="" rdev="7648" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="556e68f256ad0673e145cbc41a0685b3" inode="544464" device="2304" mtime="927342000" flags="0" name="/usr/share/texmf/doc/latex/koma-script/scr_new1.tex" file_size="5566" groupname="root" linkto="" rdev="13314" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f7b6036334ee6c78f59352df0f49bfd2" inode="544465" device="2304" mtime="927342000" flags="0" name="/usr/share/texmf/doc/latex/koma-script/scr_new2.tex" file_size="4134" groupname="root" linkto="" rdev="-26111" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="296c935559eb100201037560881bd0c7" inode="544466" device="2304" mtime="927342000" flags="0" name="/usr/share/texmf/doc/latex/koma-script/scr_new3.tex" file_size="4904" groupname="root" linkto="" rdev="16791" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="850a488c78d2d054970877195ae2e591" inode="544467" device="2304" mtime="927342000" flags="0" name="/usr/share/texmf/doc/latex/koma-script/scr_new4.tex" file_size="4685" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7a0c6aa9c89ff7210f2184700492c822" inode="544468" device="2304" mtime="927342000" flags="0" name="/usr/share/texmf/doc/latex/koma-script/scr_new5.tex" file_size="6098" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f53b35c63582e2fe64add882e51727e5" inode="544469" device="2304" mtime="927342000" flags="0" name="/usr/share/texmf/doc/latex/koma-script/scr_new6.tex" file_size="4893" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="457d766263a96521d6ec46935bd8a5eb" inode="544470" device="2304" mtime="927342000" flags="0" name="/usr/share/texmf/doc/latex/koma-script/scr_new7.tex" file_size="4864" groupname="root" linkto="" rdev="29266" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ff31caa0e1a55b07047f11b715f2f53d" inode="544471" device="2304" mtime="927342000" flags="0" name="/usr/share/texmf/doc/latex/koma-script/scr_new8.tex" file_size="4633" groupname="root" linkto="" rdev="580" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d4bac24b73c28db3d4dca038a762ed46" inode="544472" device="2304" mtime="927342000" flags="0" name="/usr/share/texmf/doc/latex/koma-script/scr_new9.tex" file_size="4973" groupname="root" linkto="" rdev="1792" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="437e2a6c33862597ea4b2fbebdbaaa5b" inode="544450" device="2304" mtime="927342000" flags="0" name="/usr/share/texmf/doc/latex/koma-script/screnggu.dvi" file_size="86756" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9c5006bc7b76b25a4d905d49f46a3f17" inode="544451" device="2304" mtime="927342000" flags="0" name="/usr/share/texmf/doc/latex/koma-script/screnggu.ind" file_size="8039" groupname="root" linkto="" rdev="21598" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1e24d56fa8e66103dba0e39689d34815" inode="544452" device="2304" mtime="927342000" flags="0" name="/usr/share/texmf/doc/latex/koma-script/screnggu.tex" file_size="50104" groupname="root" linkto="" rdev="19933" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="48b2504521cba2e5da4271d96e973e8a" inode="544475" device="2304" mtime="946503660" flags="0" name="/usr/share/texmf/doc/latex/koma-script/scrguide.dvi" file_size="234736" groupname="root" linkto="" rdev="8462" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4c428354753f369f67d2b0ce3a8aa613" inode="544476" device="2304" mtime="946503660" flags="0" name="/usr/share/texmf/doc/latex/koma-script/scrguide.ind" file_size="20882" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bd5e935b395ceb5c411d618f9d0be898" inode="544477" device="2304" mtime="927342000" flags="0" name="/usr/share/texmf/doc/latex/koma-script/scrguide.ist" file_size="749" groupname="root" linkto="" rdev="8459" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="973a5312bb43cb4a7b0dde2844ad64c6" inode="544478" device="2304" mtime="946494480" flags="0" name="/usr/share/texmf/doc/latex/koma-script/scrguide.tex" file_size="139038" groupname="root" linkto="" rdev="8461" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fe0ea8171d4f61ab08027255bdbd4e38" inode="544456" device="2304" mtime="927342000" flags="0" name="/usr/share/texmf/doc/latex/koma-script/scrnew10.tex" file_size="4927" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="60f42e0520c529e2b55b15ad54067119" inode="544457" device="2304" mtime="927342000" flags="0" name="/usr/share/texmf/doc/latex/koma-script/scrnew11.tex" file_size="4838" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6f837765cdc31f1261ad2a62ecbc4d75" inode="544458" device="2304" mtime="927342000" flags="0" name="/usr/share/texmf/doc/latex/koma-script/scrnew12.tex" file_size="4853" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="42d47434e40192949a3d66d0a6f933b0" inode="544459" device="2304" mtime="927342000" flags="0" name="/usr/share/texmf/doc/latex/koma-script/scrnew13.tex" file_size="4300" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a3ecd8cf3dc64d2397292cdb6df906cb" inode="544460" device="2304" mtime="927342000" flags="0" name="/usr/share/texmf/doc/latex/koma-script/scrnew14.tex" file_size="4724" groupname="root" linkto="" rdev="599" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="faf566ac9ce6e794f69be2b9ab065804" inode="544461" device="2304" mtime="927342000" flags="0" name="/usr/share/texmf/doc/latex/koma-script/scrnew15.tex" file_size="4324" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8b51e2aaffa90a4faf6c078a79c6c1fa" inode="544462" device="2304" mtime="927342000" flags="0" name="/usr/share/texmf/doc/latex/koma-script/scrnew16.tex" file_size="8508" groupname="root" linkto="" rdev="24066" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="65430a2ff29cdb23e22ccf061844ce8d" inode="544463" device="2304" mtime="946497600" flags="0" name="/usr/share/texmf/doc/latex/koma-script/scrnew17.tex" file_size="6162" groupname="root" linkto="" rdev="24065" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="20964" device="2304" mtime="905817627" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html" file_size="8192" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f197d296a2d439fd207d2e1f4ab7c977" inode="22978" device="2304" mtime="905817620" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/LaTeX-info.html" file_size="1782" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a99b5d14b3b3e838180e6f09a2e47573" inode="23000" device="2304" mtime="905817620" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/baselineskip.html" file_size="1434" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9b212ed19f5f65c566bba241cd886cdd" inode="22910" device="2304" mtime="905817620" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/boldmath.html" file_size="1618" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2fa50f157bbb9f9a36f14c3b28f3082b" inode="22912" device="2304" mtime="905817620" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/caption.html" file_size="707" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="590fd9b411160601077a73dbb27ae5d1" inode="22965" device="2304" mtime="905817620" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/declarations.html" file_size="2224" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="893ac0a4b1847fe322c9e6f1c0cbff88" inode="22968" device="2304" mtime="905817620" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ellipses.html" file_size="883" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c1181a3219887700d8cde5b4d0fa27ec" inode="22872" device="2304" mtime="905817620" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/emph.html" file_size="782" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8f42a6e6195f5394b0c32f4b0511c5fe" inode="22874" device="2304" mtime="905817620" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ensuremath.html" file_size="923" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="94b563d84578a820be78a309f250293d" inode="22915" device="2304" mtime="905817620" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/externals.html" file_size="6344" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cc5004f00579513506b45b00d96daa18" inode="22942" device="2304" mtime="905817620" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/fonts2e.html" file_size="1897" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="83536ad8d003e36e4668fbcafa935c30" inode="22886" device="2304" mtime="905817620" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/fragile.html" file_size="2780" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f9b89abc9a0db20e0f976ab9c1d40995" inode="22798" device="2304" mtime="905817620" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/frenchsp.html" file_size="661" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d38c1dba68e06967785cafbf3a8f1cc3" inode="22861" device="2304" mtime="912737096" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/index.html" file_size="3507" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fec489c9df9af34720fab0003571296c" inode="22979" device="2304" mtime="905817620" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/input.html" file_size="3806" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7c01c1edf5ccc85236ccc9132acff534" inode="22875" device="2304" mtime="905817620" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/item.html" file_size="1068" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e4c1cb752c728a45967aeba3ca2b6182" inode="22983" device="2304" mtime="905817620" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/lefteqn.html" file_size="1454" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e5d6e82915c10f702488298a43473111" inode="22877" device="2304" mtime="905817620" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/lists.html" file_size="2329" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="66b336c6dfa56af1dbfc0a2c32cd97c5" inode="21635" device="2304" mtime="905817620" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-111.html" file_size="846" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8eb6fab65e9a2de448d9855c19b25ec5" inode="22793" device="2304" mtime="905817620" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-115.html" file_size="3006" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c6e28c1deaa24ab680e554ebc1b24c6d" inode="22805" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-117.html" file_size="1855" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="55208984ba8091db4f94326d84bbdd78" inode="22811" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-118.html" file_size="1049" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bb28d6bedbe93dbb8eb8bff4536d299b" inode="22816" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-119.html" file_size="1691" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a6debfdea21bd2044b6cd66b6d9b1874" inode="20974" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-13.html" file_size="2265" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4978d89ae0257db57bc86fdcf72db1ee" inode="22863" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-130.html" file_size="2931" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f9f50ad332fa8f625b489710e5dbc496" inode="22867" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-131.html" file_size="833" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="365c83f57648cf456a2714dbd2a8f6d4" inode="22880" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-137.html" file_size="934" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="719e1389ef6b1d81d4584df2f6d3b435" inode="22884" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-138.html" file_size="1134" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bab6190377d0ed37ad8c4abd7c15aa69" inode="22891" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-140.html" file_size="677" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a369c5a941848677821958e045a5738a" inode="22894" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-141.html" file_size="2614" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1a8d4393ce1b6a40e69adeeec535753b" inode="22897" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-142.html" file_size="641" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1b163d7ed155eb334f8c90f8fabcffc6" inode="22899" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-143.html" file_size="5305" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0fd6333a274547cf618e6cb6eec624d7" inode="22970" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-164.html" file_size="2810" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="417b293a4553390f2fbb340e64d1ad50" inode="22972" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-165.html" file_size="880" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="719e1b6c7ada549a0ff837a2d4fce016" inode="22984" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-169.html" file_size="916" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cc2bcd079371c07e79bf4b0877f95ba9" inode="21634" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-17.html" file_size="1698" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1a64bea4538f72b13337f7ed41733fed" inode="22989" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-170.html" file_size="1726" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0243cf14fbc31f71189f2bbbf8bb3061" inode="22992" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-171.html" file_size="1157" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a227ae008bfea04aaadeb16ce79dc565" inode="22995" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-172.html" file_size="900" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c5666ebb3b4a51af68304270206d3e76" inode="22998" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-173.html" file_size="571" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fec6c773cd243a4d5ed59a1fe03baad3" inode="20965" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-174.html" file_size="981" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bde2d0e41b3ed893f589bb523b02c744" inode="20968" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-175.html" file_size="923" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="822761bb7cb56243bed844c9de691cd2" inode="20972" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-176.html" file_size="827" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="537e484a1e032fcb35d003a279d204c6" inode="20976" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-177.html" file_size="2389" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="794065589243d1b86c707eea3d2961e5" inode="20978" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-178.html" file_size="2024" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1a4c3b699d00fb6d3a8acc874e32090e" inode="20980" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-179.html" file_size="1319" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0a0113b6e12c516a4afa4fac39824d73" inode="22777" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-18.html" file_size="3459" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c25c6d6e43822b5d7a3a9d0063f40b2a" inode="22776" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-180.html" file_size="1262" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="10f5088c9e61e073ccc3adb40b827c29" inode="22779" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-181.html" file_size="1039" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5a3b5fc4e1f54c1a1fc7f6566ecad119" inode="22785" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-182.html" file_size="1042" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="397c5e1be8af7324b13c0853b47ff318" inode="22789" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-183.html" file_size="549" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bd5e687bc7e2ca5ac96bfe4c695b4f05" inode="22794" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-184.html" file_size="550" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6bf21d25c6ddf8cbee5cc4925baaf506" inode="22801" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-185.html" file_size="582" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2d5e670c68e257a833e59a4bc6bf83d5" inode="22808" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-186.html" file_size="558" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0974aa8c65ec5345fc648188b354a6c3" inode="22813" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-187.html" file_size="690" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="dd5e4b88952a03bbeefdf3768919a0da" inode="22819" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-188.html" file_size="505" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1afff68c315b6cf8cf2c954fa528401e" inode="22823" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-189.html" file_size="552" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cf6649773cd8b7c80b1b7d7e501c1716" inode="22783" device="2304" mtime="905817621" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-19.html" file_size="2072" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="324dc1dbbac65c28a589fd9f0fd22fba" inode="22829" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-190.html" file_size="543" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c4b2b2ef3cac3056855ddc068a8f3a08" inode="22832" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-191.html" file_size="1088" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="01eadca033d7f1915caa96920bcc314b" inode="22836" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-192.html" file_size="1249" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="73bf9b8e3ecf984eaa8046dbab13bf02" inode="22846" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-195.html" file_size="650" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7cc5f8778e552ac422ece91dfca41538" inode="22854" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-198.html" file_size="840" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d54962a0a1880fcab8a63999852f7381" inode="22859" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-199.html" file_size="800" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="672c881c34e74a27cd3e0645e3c09c65" inode="22902" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-2.html" file_size="13855" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7b19cbb62fd611d1e1ad1c820af7f7e0" inode="22792" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-20.html" file_size="1235" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bcb8625a6b6bcd9722bc8fba83098e03" inode="22895" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-200.html" file_size="1991" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="419ba48918e6973e8730dee4058f248a" inode="22898" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-201.html" file_size="582" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ec3121684817e34bf113272ca2c47f3d" inode="22900" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-202.html" file_size="2599" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f6450d1aa0838be2058fc21b154f7afa" inode="22904" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-203.html" file_size="1197" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ab4d8b37266c5009b1901f91c860473b" inode="22908" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-204.html" file_size="642" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="053884d4bc6a3987ea66a1405554c0ed" inode="22911" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-205.html" file_size="1731" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f26fae6d3594946b05235954bd350425" inode="22913" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-206.html" file_size="601" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0399952064ab78079269acfba59ed8ce" inode="22916" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-207.html" file_size="775" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="28e8b7d7eab4500e859d21087897ebaa" inode="22797" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-21.html" file_size="656" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8f4af704a67440c0c3f3f54f567dfbe5" inode="22924" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-210.html" file_size="661" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="81d0f07d64bde87ccc2b6282411c1e1e" inode="22927" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-211.html" file_size="1338" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ff26d55daeb7442c9c1bc7fd7f7bc34c" inode="22929" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-212.html" file_size="759" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2b989a0b2a2cef63f8c30ce0a3fc09c3" inode="22932" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-213.html" file_size="599" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="414d2a0ff7b033e1613793c7d9b2c851" inode="22935" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-214.html" file_size="1135" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a5caed05fbfe9ead2b24959d8f81e59a" inode="22941" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-216.html" file_size="868" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7a33ec75d7ff1646e588a38c382f60c8" inode="22944" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-217.html" file_size="720" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ffccc332323e5358a4d2e2de6d0a534e" inode="22949" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-218.html" file_size="716" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7fcf5abe4d88ef60ce45223afbe62224" inode="22804" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-22.html" file_size="1440" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d7916ad70c70bb38af2b9dd341ee2ad8" inode="22961" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-220.html" file_size="580" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="411ac5facc7de6124ead0403d63e78ce" inode="22964" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-221.html" file_size="719" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a78c70b4fe4491a37a817c34797cecec" inode="22967" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-222.html" file_size="2006" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7aa022deb09d0106467d3702763c7bf5" inode="22971" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-223.html" file_size="1917" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1aeb82e3a417f90a4b8397d74b6fabe6" inode="22973" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-224.html" file_size="1102" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ec174c6b37d88fce90457296fe2183e5" inode="22975" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-225.html" file_size="1552" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="79a1d5a13d8314a1e3077bf1c9022697" inode="22977" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-226.html" file_size="839" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f1cd934778534eb2e6820f737f09b52e" inode="22981" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-227.html" file_size="666" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a4dfc2d15fd552b56658a403b4e5fa5c" inode="22985" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-228.html" file_size="892" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="11e0d54be70daf705a9ee82341c48950" inode="22987" device="2304" mtime="905817622" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-229.html" file_size="894" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="26a8797d8fbd6c3ae5d5255d403f625d" inode="22993" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-230.html" file_size="928" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bba78dcf9473facb7db08c70ec97e4b0" inode="22996" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-231.html" file_size="1266" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="78a969d4febcb95e29b5ac1c8271d811" inode="22999" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-232.html" file_size="1042" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a6647a7449a85b49a626e105393b2301" inode="20966" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-233.html" file_size="578" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9d58717121ffd11b32d29bf3745e46b6" inode="20969" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-234.html" file_size="1139" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6a49a75b662cff6dec80ac1acc4cad63" inode="20973" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-235.html" file_size="668" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1096f1b92d19edf188995531e80bfce2" inode="20977" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-236.html" file_size="709" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="90de7881e8941db665146b9433e5707a" inode="20979" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-237.html" file_size="1451" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e7c6deed1aad1aec30badfa070e0d7f7" inode="20981" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-238.html" file_size="676" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6ebff2f746f3642279ef778a4e9792a4" inode="21633" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-239.html" file_size="1205" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="78e7d4ba5829ee6edd9bc6c448737b8e" inode="22780" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-240.html" file_size="628" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="794bf0207c72e2dc9fa9d0433bd0cc13" inode="22786" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-241.html" file_size="1011" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b9a03720668bcf8bb608d66627887b4d" inode="22790" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-242.html" file_size="516" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ab953a89ccf30e17c4452503bd84e7e0" inode="22795" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-243.html" file_size="583" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e4f22ed6c242cd1512e8ec9ad4dd5d6a" inode="22802" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-244.html" file_size="1233" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1bc96df549826bc20216fcf084fb361b" inode="22809" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-245.html" file_size="1435" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="054cc66323bf83993c8a077e5e8211f4" inode="22814" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-246.html" file_size="673" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7a118a93b6b30f3fe27198fdc10139c2" inode="22820" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-247.html" file_size="742" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f41dd71a83b83e169e8f4c488601fe77" inode="22824" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-248.html" file_size="841" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7a9682b52087b04f7a9d1f63d05cee8a" inode="22826" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-249.html" file_size="639" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3fb5ccd7800895359c0db95a00b34504" inode="22833" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-250.html" file_size="1508" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f10e64d661bb3394834c901a7719ed20" inode="22837" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-251.html" file_size="868" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0c9f708769d72f35b7f34fb66b0b45a6" inode="22840" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-252.html" file_size="1700" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a4afca1f061a252ad6344d7ff43a74f4" inode="22843" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-253.html" file_size="520" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="896c8fbd83c9d1b60689ad56dd102e3f" inode="22847" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-254.html" file_size="584" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="293625d6aa6c0a4ac66b48a34f23c6ae" inode="22850" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-255.html" file_size="535" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0ff761da4af0795dc889f767a22416ac" inode="22852" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-256.html" file_size="778" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="306a96cc72f5ef176b0b5ac3810d9fe6" inode="22856" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-257.html" file_size="1160" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8be369c1aa072477d029f242d993d421" inode="22860" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-258.html" file_size="929" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d18c20a2b62dbb17e2f5cb9ecfc55155" inode="22864" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-259.html" file_size="822" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b7c1899e25fbbb456e06ac116bc2f8d9" inode="22869" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-260.html" file_size="4047" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a10b52681b74f531e0038ad2b2b68cdd" inode="22871" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-261.html" file_size="587" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a64900ec7b176c009ab0e506c5c60860" inode="22873" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-262.html" file_size="2456" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="39a01d6781ae9986713890e508d68721" inode="22876" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-263.html" file_size="1275" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0f62c44e90ac74528e13de8ea63c6c2e" inode="22878" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-264.html" file_size="1303" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c552cfdfa94ee94045a2bc2718bf6295" inode="22881" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-265.html" file_size="1341" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="722d564b99a19a1f954bf96d774e8849" inode="22885" device="2304" mtime="905817623" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-266.html" file_size="621" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6cc0d7ce3f5ad6752becab25829d2022" inode="22887" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-267.html" file_size="2296" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f78818ce325b104493d5cf3e3ce8c6bd" inode="22888" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-268.html" file_size="1467" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0446b57c8aace63d6859311faac3854c" inode="22892" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-269.html" file_size="688" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0cfb2f4b71fa921c2f7279bc7a8b2b12" inode="22828" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-27.html" file_size="2257" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c13bf2b96e0d38aca6a0e2bbb5dc7219" inode="22901" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-271.html" file_size="819" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9293cb2287d383b6dac367a33b4b76a5" inode="22914" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-275.html" file_size="585" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d532d2bbbea6b2384212411757eb97f4" inode="22917" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-276.html" file_size="502" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7215603c722d83b87d5a1e1f4cf9af75" inode="22919" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-277.html" file_size="844" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1c02b05e56a4abd4465c2cee2b1de143" inode="22922" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-279.html" file_size="685" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d441b3daaaff39320ac08e6332d363e7" inode="22928" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-280.html" file_size="668" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d1749c18e913f6cbfdab103cfbb29501" inode="22930" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-281.html" file_size="846" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="dc953d04a02cd369fd35587260cefd4f" inode="22933" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-282.html" file_size="632" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="89ad291e9ff5d6749b814434f6fdb93a" inode="22936" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-283.html" file_size="832" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7ed571325b122af269f7980af7d99fab" inode="22939" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-284.html" file_size="670" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0d723cae97b675efc44164e34c31b7ec" inode="22945" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-286.html" file_size="820" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1e5fa97d3b5c919f7c812d45a11b26d0" inode="22950" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-287.html" file_size="860" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="da013516ced7e688709809cace9c3fcc" inode="22953" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-288.html" file_size="793" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a301919816cde34aefd14493c5c5cca1" inode="22958" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-289.html" file_size="829" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1c7ba04b5a7ee97a704650379e57ee17" inode="22834" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-29.html" file_size="864" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="012ef2cebc7a1288dfd370df77862cc3" inode="22969" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-291.html" file_size="718" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4b1baab1d2aa5460fa2f231d277edbf5" inode="22974" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-293.html" file_size="545" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="35987cec0c300f04707a10fccea848ad" inode="22976" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-294.html" file_size="1470" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1728f71063566c55ccbfc0abf0c19075" inode="22982" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-296.html" file_size="981" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="611b0cbb5c3894dce7175cd616860c2f" inode="22986" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-297.html" file_size="837" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="422ff0ae844ff27d813617d8ece874a0" inode="22988" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-298.html" file_size="730" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6f5069c89a5e5440ceb56aacc6388728" inode="22990" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-299.html" file_size="650" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="88ea74a35cda47b1a211d9be339b31e7" inode="22905" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-3.html" file_size="3743" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="37e784be2e5e57eab582fe3ccc858b26" inode="22842" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-30.html" file_size="1491" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3966c505714e4c3667d7f3e571c19efc" inode="22787" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-300.html" file_size="1130" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2acbd688819e84ad12360cfffd933032" inode="22791" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-301.html" file_size="1153" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e05034f5beb64fef3e542d113c8c404d" inode="22796" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-302.html" file_size="1356" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c7052a54c9519e1e88a79cfb6f7e913c" inode="22803" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-303.html" file_size="881" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4d43714c29b3dd0c5e9110f494446590" inode="22810" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-304.html" file_size="650" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0b848fdcb37e4b025f82b80589f5107d" inode="22815" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-305.html" file_size="740" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e6dd163a7b227aee74e622c397bcc21f" inode="22821" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-306.html" file_size="1431" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e2d22dd4f23bdd885208fc293bc09a8f" inode="22825" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-307.html" file_size="1345" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6b382fcd317694e2d7a864b65686d769" inode="22827" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-308.html" file_size="644" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6e1f291e15ab4c62b5c0d4ee9ceb79d5" inode="22830" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-309.html" file_size="528" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a376c4df489f2d5134f6a46d8cde0969" inode="22845" device="2304" mtime="905817624" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-31.html" file_size="1082" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="621e8378ab6d217355f37c882c1981f8" inode="22838" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-310.html" file_size="627" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="28a43b158f31a017f14cba67d276c1c1" inode="22841" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-311.html" file_size="1002" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0a16607e58d85e97ae5751b73f0f22fd" inode="22844" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-312.html" file_size="752" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fd785fb8055c4602a98a194f62166491" inode="22848" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-313.html" file_size="642" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="60206b27b09bf16a2c4d4b3c9d10b19b" inode="22851" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-314.html" file_size="843" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="129125fd063780210396a0c4b41927f5" inode="22853" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-315.html" file_size="744" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bfa3f50fd754689cf0945bc1551159ed" inode="22857" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-316.html" file_size="639" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d2d12036a7e1e9f44db699ad4a7aab96" inode="22862" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-317.html" file_size="521" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b8b73ad9d397a20a1fa38b4ffeb2c086" inode="22865" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-318.html" file_size="692" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="efc8cad0935271cea720d143a6b247aa" inode="22868" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-319.html" file_size="906" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fa4750e67e684e4027ff4453a2618e72" inode="22879" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-323.html" file_size="568" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="be4df1a7d74a89fd181d88ce78b88c92" inode="22882" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-324.html" file_size="897" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1b65d3814fae4cf821d64bc79ca3425d" inode="22893" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-328.html" file_size="557" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ca6b9cb7ef95c539334a58c611b4f705" inode="22896" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-329.html" file_size="855" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8f8a979f7ebb5f4255ab7abfde9c1387" inode="22903" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-330.html" file_size="466" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a69145dd984e5f0a5c77b6b33237c4f7" inode="22906" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-331.html" file_size="644" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="629d22f957aa202d6a595da40bb14e92" inode="22909" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-332.html" file_size="656" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="494e770cd89931d3ccdf02758e48d46c" inode="22918" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-335.html" file_size="867" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="222ddb600667a53a02e4bd0702afe0af" inode="22920" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-336.html" file_size="970" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2acf233cf89ec786d8c2298ed5f5b780" inode="22921" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-337.html" file_size="773" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9eaa602a97a1974a3f7cef74490d5f0b" inode="22923" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-338.html" file_size="721" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2081dca0b3273e6d7046d4d1798114ae" inode="22925" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-339.html" file_size="954" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0912dc509d4aab89acbbdd0988ff7752" inode="22931" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-340.html" file_size="751" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="80f3bce517c1d54aba636c19fc3d33fc" inode="22934" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-341.html" file_size="1329" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8aa8143ca627369ec223fafd2ede019c" inode="22937" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-342.html" file_size="1383" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9d77cd2dbc9b663ad18e5fdeefd766ef" inode="22946" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-345.html" file_size="780" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cad583397cdfd0843a2f217375d8b9eb" inode="22951" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-346.html" file_size="724" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cf8d2a8942b0f22d4ae8dacf7a289afc" inode="22954" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-347.html" file_size="1067" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4878f115cc54430a96e27dee236611bb" inode="22866" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-37.html" file_size="1029" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ec856e2422539195212c1779de717e16" inode="22870" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-39.html" file_size="1032" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7dc9e6672a29f4ae674641488d818652" inode="22938" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-401.html" file_size="3894" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="98bf21a396b32bf83c93b6be5ebceaf9" inode="22940" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-402.html" file_size="1330" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e5e2579357f9f840dc5b95f895599fd8" inode="22943" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-403.html" file_size="4495" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6212ce38946b168b1ac2fcaafed032fa" inode="22947" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-404.html" file_size="2581" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d722d5d2f5e031ea0bc463c65dcd50f3" inode="22952" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-405.html" file_size="1752" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ac546a4a4d85609d05e67219db118503" inode="22955" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-406.html" file_size="1835" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="46eb96f91ea3b3395d1d34fbcc37ff72" inode="22960" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-407.html" file_size="3132" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f71081e3a9ef774548b660472bbebc90" inode="22963" device="2304" mtime="905817625" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-408.html" file_size="3247" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d5d3bfdcf315fdc938c3ed7afd591e70" inode="22966" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-409.html" file_size="1959" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b2925b7faa76c7689bfefe030122f433" inode="20967" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-420.html" file_size="820" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8082ec9f1e0df0ac6847a80fb1ad28bf" inode="20971" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-421.html" file_size="1932" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d15933f75f57739dd121f7f954f23b1a" inode="22883" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-43.html" file_size="4728" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b14a295c0f7b851099dd30699e95afc2" inode="22800" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-430.html" file_size="894" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ce6966a56f8e5403a8b0b02e09868e22" inode="22807" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-431.html" file_size="1904" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1c5fed44c4c66863677474c131b86154" inode="22812" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-432.html" file_size="1064" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a434962092da591a2fbf45738ddb7faf" inode="22818" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-433.html" file_size="948" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="32f2dd1e3a0bd599ef5fd0f29bdc5ff7" inode="22822" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-434.html" file_size="1105" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bd6a7302130b901bfda5f6c7a7e89e88" inode="22926" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-58.html" file_size="2471" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="dfdcf89840d68b47ce35858a0c368c44" inode="22959" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-67.html" file_size="1725" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="120f27fdc92058883b7a1bd900c9302f" inode="22962" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-68.html" file_size="6468" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fa3c283415277a9ec9f8fa61d058ce4e" inode="22980" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-73.html" file_size="2846" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d576022c944aeaa7147f6961b00c96bf" inode="22991" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-77.html" file_size="582" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="db07b7c71565b18e2ec87943474c91de" inode="22994" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-78.html" file_size="1075" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="675a03ae4c968b76eaccba4011cda64b" inode="22997" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-79.html" file_size="1414" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8212bd745df20d07b29cb4c87b3e9306" inode="20970" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-81.html" file_size="519" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cc5b54ac345ee3a5782e4ab86c9de6dc" inode="20975" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-82.html" file_size="1313" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="49900d211c5736e7b145b506466504aa" inode="22775" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-86.html" file_size="4248" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c3851a824796659706b81e689440ba38" inode="22778" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-87.html" file_size="662" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="46b5010ce5fba1939a119c1c3c9654ed" inode="22784" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-88.html" file_size="762" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6e45c99dcd89ed4887b8e740b578ae4a" inode="22788" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-89.html" file_size="882" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5dcc3f0ed3e5f079ad038568ffa6ba07" inode="22799" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-90.html" file_size="716" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ff615e0b8ee91afa1cee7612bfbeb030" inode="22806" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-91.html" file_size="3111" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="341c0c5c3bae5f388e72e8a99f058a92" inode="22817" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-93.html" file_size="930" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2d4c9721c20101806576b7886bb03231" inode="22831" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-97.html" file_size="668" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c3ccfd33de94849c154a55519a170fad" inode="22835" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-98.html" file_size="745" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="07f6e1a4fd239c7219d66bc1408da1f6" inode="22839" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-99.html" file_size="1473" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5268fdd87d69d793ce15cc5c7b5ebdee" inode="22858" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/ltx-tar.html" file_size="3113" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="60a732a416d1a4d55f83ed2a0c30c137" inode="22907" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/mathfonts.html" file_size="3796" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3095df9dd6563b65b73322c3106e08e1" inode="22782" device="2304" mtime="912737451" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/mirror.html" file_size="3942" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a3bbd422ec1d33ff74965fbc1332c911" inode="22956" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/parskip.html" file_size="933" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b3d5d9b0508358405beec134436c64a6" inode="22957" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/refs.html" file_size="1774" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4f890d2a01b3c90f461b8568155c681f" inode="22855" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/stackrel.html" file_size="2997" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8358cce40e2bcd6c1fcc8b678bb580e6" inode="22889" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/textwidth.html" file_size="864" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a7726d2703cde26fcde1b20608f1a163" inode="22890" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/toc.html" file_size="1018" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6e0846c5dfcde081a89f3165411955b0" inode="22849" device="2304" mtime="905817626" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/trivlist.html" file_size="889" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="317163aaa731f10625e7e6f76d468ced" inode="22781" device="2304" mtime="905817627" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/unitlength.html" file_size="878" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="dbae9e5e3eb9052c98f2c8b5b2814bf7" inode="22948" device="2304" mtime="905817627" flags="0" name="/usr/share/texmf/doc/latex/latex2e-html/versions.html" file_size="2807" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="544495" device="2304" mtime="927767424" flags="0" name="/usr/share/texmf/doc/latex/mathtime" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="638a3ffbd86238ffc74bd681d2b9f2d7" inode="544498" device="2304" mtime="854769600" flags="0" name="/usr/share/texmf/doc/latex/mathtime/0readme" file_size="3164" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="afd251e19cf937930b696826a1304414" inode="544499" device="2304" mtime="906743569" flags="0" name="/usr/share/texmf/doc/latex/mathtime/mathtime.dvi" file_size="11724" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="917df67c1d67f5c525f2dfbcae319943" inode="544497" device="2304" mtime="927767193" flags="0" name="/usr/share/texmf/doc/latex/mathtime/mt11p.dvi" file_size="148344" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bed8923a0c274f980be364bcd4c88a9b" inode="544496" device="2304" mtime="854769600" flags="0" name="/usr/share/texmf/doc/latex/mathtime/test11p.tex" file_size="14279" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="1036579" device="2304" mtime="949317233" flags="0" name="/usr/share/texmf/doc/latex/mdwtools" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8ca43cbc842c2336e835926c2166c28b" inode="1036590" device="2304" mtime="888927720" flags="0" name="/usr/share/texmf/doc/latex/mdwtools/COPYING" file_size="17982" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="748d6a69c0484cddc33d6b05f3d46d5d" inode="1036582" device="2304" mtime="922248000" flags="0" name="/usr/share/texmf/doc/latex/mdwtools/README" file_size="21271" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3e16904a351898412058fdafdb8488a5" inode="1036586" device="2304" mtime="949317228" flags="0" name="/usr/share/texmf/doc/latex/mdwtools/at.dvi" file_size="67028" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c10fa66499c806ec4f507442febbacbd" inode="1036585" device="2304" mtime="949317228" flags="0" name="/usr/share/texmf/doc/latex/mdwtools/cmtt.dvi" file_size="59608" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="70595f09db1475460f73351988439329" inode="1036588" device="2304" mtime="949317228" flags="0" name="/usr/share/texmf/doc/latex/mdwtools/doafter.dvi" file_size="51920" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3b79acb5876cb9d836c3971d321bf1ee" inode="1036581" device="2304" mtime="949317228" flags="0" name="/usr/share/texmf/doc/latex/mdwtools/footnote.dvi" file_size="64192" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a82b615f7c7fdea2ec6181d4072bc5d5" inode="1036584" device="2304" mtime="949317228" flags="0" name="/usr/share/texmf/doc/latex/mdwtools/mdwlist.dvi" file_size="68376" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="42b62501d2dbfc8eb4738f3ae1728476" inode="1036589" device="2304" mtime="949317228" flags="0" name="/usr/share/texmf/doc/latex/mdwtools/mdwmath.dvi" file_size="52800" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="de85a51a9a90d5317505bd861b3eecf1" inode="1036580" device="2304" mtime="949317228" flags="0" name="/usr/share/texmf/doc/latex/mdwtools/mdwtab.dvi" file_size="357412" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b60706519b3948a0701cac4f9ee3cedf" inode="1036587" device="2304" mtime="949317228" flags="0" name="/usr/share/texmf/doc/latex/mdwtools/sverb.dvi" file_size="94644" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e12b36d234ee92f8d1b60b9fb2bef83e" inode="1036583" device="2304" mtime="949317228" flags="0" name="/usr/share/texmf/doc/latex/mdwtools/syntax.dvi" file_size="184176" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="544515" device="2304" mtime="922248066" flags="0" name="/usr/share/texmf/doc/latex/mfnfss" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0f030b63fc2a6a36bc10d153ad28e033" inode="544519" device="2304" mtime="921615656" flags="0" name="/usr/share/texmf/doc/latex/mfnfss/manifest.txt" file_size="1569" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="80f512e3225007801a0291146603b99c" inode="544516" device="2304" mtime="922248055" flags="0" name="/usr/share/texmf/doc/latex/mfnfss/oldgerm.dvi" file_size="37476" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0e6b74c500e580e41a5f1166290dde2d" inode="544517" device="2304" mtime="922248059" flags="0" name="/usr/share/texmf/doc/latex/mfnfss/pandora.dvi" file_size="6624" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4a58e28be6120f8d7dff1e035bfa631a" inode="544518" device="2304" mtime="921615656" flags="0" name="/usr/share/texmf/doc/latex/mfnfss/readme.txt" file_size="3245" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="544481" device="2304" mtime="936382427" flags="0" name="/usr/share/texmf/doc/latex/minitoc" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="deae48d22e8fe7815c8b07e5887307ea" inode="544484" device="2304" mtime="933707958" flags="0" name="/usr/share/texmf/doc/latex/minitoc/mini-art.tex" file_size="9647" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a0a3d3143cae9bcb68c0d6ae120bdeab" inode="544485" device="2304" mtime="933707958" flags="0" name="/usr/share/texmf/doc/latex/minitoc/minitoc-ex.tex" file_size="10198" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fd18f667f7f452544614eb596f714ee9" inode="544482" device="2304" mtime="933707958" flags="0" name="/usr/share/texmf/doc/latex/minitoc/minitoc.bug" file_size="4201" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f002657f1b4e9652b462f5db7ae7ebd5" inode="544483" device="2304" mtime="936382420" flags="0" name="/usr/share/texmf/doc/latex/minitoc/minitoc.dvi" file_size="38148" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="169898" device="2304" mtime="921638065" flags="0" name="/usr/share/texmf/doc/latex/mltex" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="416386f3d82a3fb7e9204596501d5495" inode="169899" device="2304" mtime="921017997" flags="0" name="/usr/share/texmf/doc/latex/mltex/README" file_size="2514" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="817376923d46884df73c7004400d9e72" inode="169900" device="2304" mtime="921013712" flags="0" name="/usr/share/texmf/doc/latex/mltex/mltex.txt" file_size="2599" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="2702582" device="2304" mtime="934160622" flags="0" name="/usr/share/texmf/doc/latex/ms" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8f0ee6ac4d547cf155efe43e43dfdb9b" inode="2702598" device="2304" mtime="928895777" flags="0" name="/usr/share/texmf/doc/latex/ms/count1to.bug" file_size="875" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7dbc43e94d6a71904b6db202280ed903" inode="2702599" device="2304" mtime="934160602" flags="0" name="/usr/share/texmf/doc/latex/ms/count1to.dvi" file_size="9472" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="11f38800fc2b43bcbe4cf478bb97e298" inode="2702600" device="2304" mtime="934160598" flags="0" name="/usr/share/texmf/doc/latex/ms/eso-p-t.tex" file_size="2662" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="22f1e8abddc0b16802f43844b2aec305" inode="2702591" device="2304" mtime="934160616" flags="0" name="/usr/share/texmf/doc/latex/ms/eso-pic.dvi" file_size="4856" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1f99296dcd8beb5cf998383c2a4996b2" inode="2702592" device="2304" mtime="928895777" flags="0" name="/usr/share/texmf/doc/latex/ms/everysel.bug" file_size="408" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="79a88d430e3f9755f7693130529b1323" inode="2702593" device="2304" mtime="934160604" flags="0" name="/usr/share/texmf/doc/latex/ms/everysel.dvi" file_size="4660" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9aab98bad20835b8a2e6fee1715137a5" inode="2702596" device="2304" mtime="928895777" flags="0" name="/usr/share/texmf/doc/latex/ms/everyshi.bug" file_size="406" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cf6cf2672af1c011040d98c465783134" inode="2702597" device="2304" mtime="934160606" flags="0" name="/usr/share/texmf/doc/latex/ms/everyshi.dvi" file_size="4136" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="440fc905968cacc7f9502ee62c75ff21" inode="2702587" device="2304" mtime="928895777" flags="0" name="/usr/share/texmf/doc/latex/ms/multitoc.bug" file_size="400" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a64310d83e5547966bbe5bb4bd4a6d84" inode="2702588" device="2304" mtime="934160608" flags="0" name="/usr/share/texmf/doc/latex/ms/multitoc.dvi" file_size="9164" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="35955e36890f8c4e9285491ee7135aee" inode="2702594" device="2304" mtime="928895777" flags="0" name="/usr/share/texmf/doc/latex/ms/prelim2e.bug" file_size="406" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="46e2e87cb96219c0bb6edc66834d68b8" inode="2702595" device="2304" mtime="934160610" flags="0" name="/usr/share/texmf/doc/latex/ms/prelim2e.dvi" file_size="8372" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c8855d982e9f13266990f9d3b0caf012" inode="2702589" device="2304" mtime="928895777" flags="0" name="/usr/share/texmf/doc/latex/ms/ragged2e.bug" file_size="547" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e8782b1be842a47a15223971dc8204b4" inode="2702590" device="2304" mtime="934160614" flags="0" name="/usr/share/texmf/doc/latex/ms/ragged2e.dvi" file_size="26432" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="544520" device="2304" mtime="927923862" flags="0" name="/usr/share/texmf/doc/latex/natbib" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="04ecd9e832a6a2b08d336015ea54769e" inode="544523" device="2304" mtime="918686604" flags="0" name="/usr/share/texmf/doc/latex/natbib/README.1st" file_size="1577" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1b05078677000c62b4b02d90dc8561fd" inode="544525" device="2304" mtime="919965074" flags="0" name="/usr/share/texmf/doc/latex/natbib/README.v69" file_size="15807" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8904291625c5ed1390e006a4addb0c68" inode="544526" device="2304" mtime="924695998" flags="0" name="/usr/share/texmf/doc/latex/natbib/README.v69a" file_size="16219" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a95c086c05ccbf7dec9a71537c775454" inode="544521" device="2304" mtime="927923858" flags="0" name="/usr/share/texmf/doc/latex/natbib/bibentry.dvi" file_size="6776" groupname="root" linkto="" rdev="257" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="143bebca9add96727518a88c7526de27" inode="544522" device="2304" mtime="927923855" flags="0" name="/usr/share/texmf/doc/latex/natbib/natbib.dvi" file_size="71964" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="30c0b4be2201cb199ce7bca8c1c6057a" inode="544524" device="2304" mtime="927923856" flags="0" name="/usr/share/texmf/doc/latex/natbib/natnotes.dvi" file_size="13296" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="545987" device="2304" mtime="949316404" flags="0" name="/usr/share/texmf/doc/latex/nomencl" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3aa8ab1b376f1c8dc24280dfb6b7b4c7" inode="545988" device="2304" mtime="936903600" flags="0" name="/usr/share/texmf/doc/latex/nomencl/README" file_size="2668" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9e2f80a2f1f0740a19be962bb732877c" inode="545990" device="2304" mtime="926693942" flags="0" name="/usr/share/texmf/doc/latex/nomencl/license.txt" file_size="644" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="639f495c70f0bde8f2b7bd597ee14081" inode="545989" device="2304" mtime="949316401" flags="0" name="/usr/share/texmf/doc/latex/nomencl/nomencl.dvi" file_size="30644" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="578552" device="2304" mtime="921540233" flags="0" name="/usr/share/texmf/doc/latex/ntgclass" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1de2a65aff0be174c19f0c04b8bdd46a" inode="578566" device="2304" mtime="921538927" flags="0" name="/usr/share/texmf/doc/latex/ntgclass/artdoc.dvi" file_size="38332" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1696cf6592141cfb4215ba458a134fbd" inode="578683" device="2304" mtime="921469500" flags="0" name="/usr/share/texmf/doc/latex/ntgclass/brief.tex" file_size="8333" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0bf8e368bb450bb0241e6f6afea9d08b" inode="578554" device="2304" mtime="921538929" flags="0" name="/usr/share/texmf/doc/latex/ntgclass/briefdoc.dvi" file_size="15276" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d7b1f7d4bfe8b598eedf92c74816d314" inode="578568" device="2304" mtime="921538931" flags="0" name="/usr/share/texmf/doc/latex/ntgclass/ntgclass.dvi" file_size="8320" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="275cac50a7271eb577e86741cdc27826" inode="578553" device="2304" mtime="921538938" flags="0" name="/usr/share/texmf/doc/latex/ntgclass/ntgstyle.dvi" file_size="7348" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9adbfa15cacc276fe1523dd4a54e55f5" inode="578567" device="2304" mtime="921538934" flags="0" name="/usr/share/texmf/doc/latex/ntgclass/rapdoc.dvi" file_size="46604" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="545991" device="2304" mtime="924216994" flags="0" name="/usr/share/texmf/doc/latex/oberdiek" file_size="4096" groupname="root" linkto="" rdev="5724" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="eb52fa760cdb1f44c08c7f1ffd9eb524" inode="545994" device="2304" mtime="924033600" flags="0" name="/usr/share/texmf/doc/latex/oberdiek/alphalph.pdf" file_size="365369" groupname="root" linkto="" rdev="-24049" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="756195c45af5c08a2e8e6ac58f0da0a4" inode="545992" device="2304" mtime="924033600" flags="0" name="/usr/share/texmf/doc/latex/oberdiek/hypbmsec.pdf" file_size="331597" groupname="root" linkto="" rdev="3587" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="99fd5813e74b928eedb8125031fefd8d" inode="545995" device="2304" mtime="924033600" flags="0" name="/usr/share/texmf/doc/latex/oberdiek/pagesel.pdf" file_size="344174" groupname="root" linkto="" rdev="21350" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="73694f6b1df410d8ba4768cad03f772a" inode="545993" device="2304" mtime="924033600" flags="0" name="/usr/share/texmf/doc/latex/oberdiek/twoopt.pdf" file_size="288035" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="855297" device="2304" mtime="934160713" flags="0" name="/usr/share/texmf/doc/latex/overpic" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="582bd401e68649f419ab4fcba6aa0130" inode="856706" device="2304" mtime="880215332" flags="0" name="/usr/share/texmf/doc/latex/overpic/README" file_size="970" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0cd7156fe6e8db4820f1f3f1b68f4c73" inode="856708" device="2304" mtime="880210822" flags="0" name="/usr/share/texmf/doc/latex/overpic/opic-abs.tex" file_size="2260" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1b28be04c0d01214dc85b18a826cead1" inode="856707" device="2304" mtime="880547236" flags="0" name="/usr/share/texmf/doc/latex/overpic/opic-rel.tex" file_size="2310" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="544548" device="2304" mtime="926937259" flags="0" name="/usr/share/texmf/doc/latex/platex" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="93e7a17b54652ecdda6056e8866afecd" inode="544552" device="2304" mtime="926913720" flags="0" name="/usr/share/texmf/doc/latex/platex/00readme" file_size="8895" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="efd5960ef4924416b6c639b66e951579" inode="544550" device="2304" mtime="893609272" flags="0" name="/usr/share/texmf/doc/latex/platex/conowego.txt" file_size="1235" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="239acfb8247c38c35cf71d3ab3951d45" inode="544549" device="2304" mtime="879014198" flags="0" name="/usr/share/texmf/doc/latex/platex/czytaj.txt" file_size="6753" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8137b8744e80d66acbdefa2cc0043fd9" inode="544551" device="2304" mtime="893107966" flags="0" name="/usr/share/texmf/doc/latex/platex/readme.txt" file_size="904" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="1036576" device="2304" mtime="918342029" flags="0" name="/usr/share/texmf/doc/latex/program" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f9c01270af8ac41f336a0b227495d9ed" inode="1036578" device="2304" mtime="799520520" flags="0" name="/usr/share/texmf/doc/latex/program/program-demo.tex" file_size="9312" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="18a6e0eaf2b8284d8fe523154996a20c" inode="1036577" device="2304" mtime="781795680" flags="0" name="/usr/share/texmf/doc/latex/program/program.txt" file_size="1105" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="544553" device="2304" mtime="910159049" flags="0" name="/usr/share/texmf/doc/latex/psfrag" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="231395630434a665f3b39d7716ad3338" inode="544554" device="2304" mtime="910159015" flags="0" name="/usr/share/texmf/doc/latex/psfrag/pfgguide.ps" file_size="287067" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7df2ab4e05f97c701e1fe6797021b109" inode="544555" device="2304" mtime="849851736" flags="0" name="/usr/share/texmf/doc/latex/psfrag/readme.sem" file_size="1107" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3c50f7c124b425dc725ee44b4fdd77b0" inode="544556" device="2304" mtime="849070304" flags="0" name="/usr/share/texmf/doc/latex/psfrag/readme.xfg" file_size="1308" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="1085630" device="2304" mtime="839200389" flags="0" name="/usr/share/texmf/doc/latex/pslatex" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="26f360defb40a5a51da264e403da6281" inode="1085631" device="2304" mtime="838235088" flags="0" name="/usr/share/texmf/doc/latex/pslatex/00readme.txt" file_size="2861" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="544531" device="2304" mtime="920341015" flags="0" name="/usr/share/texmf/doc/latex/rotating" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="357128723bc926129159de9b5b9bd3fa" inode="544533" device="2304" mtime="789276655" flags="0" name="/usr/share/texmf/doc/latex/rotating/Makefile" file_size="264" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2e98e0f8b1f9293c7c1cc19cf0b7266a" inode="544539" device="2304" mtime="826603200" flags="0" name="/usr/share/texmf/doc/latex/rotating/cat.eps" file_size="15737" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="333524d0473993a37c664882979f0502" inode="544540" device="2304" mtime="796870080" flags="0" name="/usr/share/texmf/doc/latex/rotating/catalog" file_size="334" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a336d52ca1e5fdecf8288e852d562fba" inode="544536" device="2304" mtime="920341010" flags="0" name="/usr/share/texmf/doc/latex/rotating/examples.dvi" file_size="39176" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="118efe438996b93d6ba61f7fc97feca2" inode="544534" device="2304" mtime="890177378" flags="0" name="/usr/share/texmf/doc/latex/rotating/examples.ps" file_size="326002" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="90fbe9b75451429a3e9d4f44cfeadfa5" inode="544537" device="2304" mtime="920000040" flags="0" name="/usr/share/texmf/doc/latex/rotating/examples.tex" file_size="14542" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7264f56b2edcc17f9dbd018acfc83347" inode="544535" device="2304" mtime="789498420" flags="0" name="/usr/share/texmf/doc/latex/rotating/manifest" file_size="158" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cbc2369d049535af7dc08fc0fc331e2a" inode="544538" device="2304" mtime="789498420" flags="0" name="/usr/share/texmf/doc/latex/rotating/readme" file_size="348" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5d441909f8d4e035bccd284bf915835a" inode="544532" device="2304" mtime="920341005" flags="0" name="/usr/share/texmf/doc/latex/rotating/rotating.dvi" file_size="16828" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="544541" device="2304" mtime="890590935" flags="0" name="/usr/share/texmf/doc/latex/rotfloat" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a413ec07a0bc703211c2ae324df80467" inode="544542" device="2304" mtime="890177264" flags="0" name="/usr/share/texmf/doc/latex/rotfloat/examples.ps" file_size="76916" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="dd4284e2f4b52f4d3acfd9a5d69e8e4f" inode="544543" device="2304" mtime="796663560" flags="0" name="/usr/share/texmf/doc/latex/rotfloat/examples.tex" file_size="3055" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="364bd67f77ed69622540f92243f48e66" inode="544544" device="2304" mtime="827723874" flags="0" name="/usr/share/texmf/doc/latex/rotfloat/rotfloat.dvi" file_size="8796" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="186271" device="2304" mtime="949316512" flags="0" name="/usr/share/texmf/doc/latex/scale" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c7d002428613633d4e0b93e0242352c1" inode="186272" device="2304" mtime="934552920" flags="0" name="/usr/share/texmf/doc/latex/scale/README" file_size="894" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="149e570ff75482a6b134ddc48b362f12" inode="186273" device="2304" mtime="949316509" flags="0" name="/usr/share/texmf/doc/latex/scale/scale.dvi" file_size="7172" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="544425" device="2304" mtime="928452951" flags="0" name="/usr/share/texmf/doc/latex/seminar" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="043e007ee476a27f9a0173cb1ee2a22c" inode="544430" device="2304" mtime="909975868" flags="0" name="/usr/share/texmf/doc/latex/seminar/Seminar-Bugs.html" file_size="25534" groupname="root" linkto="" rdev="1802" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3ddff8f5863f02cf71ec9ebc769fc65b" inode="544429" device="2304" mtime="870818336" flags="0" name="/usr/share/texmf/doc/latex/seminar/Seminar-FAQ.css" file_size="344" groupname="root" linkto="" rdev="18938" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="54457e5477e1812af34f6eba5c77cf52" inode="544431" device="2304" mtime="871003744" flags="0" name="/usr/share/texmf/doc/latex/seminar/Seminar-FAQ.html" file_size="58379" groupname="root" linkto="" rdev="14594" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="dc5456fa6722768542a7fce18e9d1b17" inode="544426" device="2304" mtime="928425240" flags="0" name="/usr/share/texmf/doc/latex/seminar/sem-read.me" file_size="11890" groupname="root" linkto="" rdev="20276" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2dcb8e57dd32cd6152e215209d96f0d9" inode="544432" device="2304" mtime="885616453" flags="0" name="/usr/share/texmf/doc/latex/seminar/sem-user.dvi" file_size="102896" groupname="root" linkto="" rdev="-32626" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="60768e3f31c2a1285f6c22c1de75dc8f" inode="544427" device="2304" mtime="733719600" flags="0" name="/usr/share/texmf/doc/latex/seminar/semsamp1.tex" file_size="2282" groupname="root" linkto="" rdev="1852" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3e9c33e15c19f17eae83ed9e7f8c38ee" inode="544428" device="2304" mtime="733719600" flags="0" name="/usr/share/texmf/doc/latex/seminar/semsamp2.tex" file_size="11483" groupname="root" linkto="" rdev="1853" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="544545" device="2304" mtime="949316598" flags="0" name="/usr/share/texmf/doc/latex/showlabels" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6c3f5ad65084fbe6cc7bf2829974cb64" inode="544546" device="2304" mtime="832008120" flags="0" name="/usr/share/texmf/doc/latex/showlabels/readme" file_size="1641" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a170422857b09c95e5efa67c8f1d70da" inode="544547" device="2304" mtime="949316580" flags="0" name="/usr/share/texmf/doc/latex/showlabels/showlabels.dvi" file_size="17616" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="544438" device="2304" mtime="926897653" flags="0" name="/usr/share/texmf/doc/latex/sidecap" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4445cde5a062ff604c14e84f43ba3882" inode="544439" device="2304" mtime="910307930" flags="0" name="/usr/share/texmf/doc/latex/sidecap/README" file_size="462" groupname="root" linkto="" rdev="23044" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="baed747df741dc1b0d5a8a4ef72141f5" inode="544440" device="2304" mtime="910308296" flags="0" name="/usr/share/texmf/doc/latex/sidecap/sc2demo.tex" file_size="2911" groupname="root" linkto="" rdev="2694" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a109e5e6025d8d25591f8bd1c8663d84" inode="544442" device="2304" mtime="870012808" flags="0" name="/usr/share/texmf/doc/latex/sidecap/scdemo.tex" file_size="2540" groupname="root" linkto="" rdev="2357" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b5267daeba362abd8a91f5cc1a7936d8" inode="544441" device="2304" mtime="926897651" flags="0" name="/usr/share/texmf/doc/latex/sidecap/sidecap.dvi" file_size="11628" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="545996" device="2304" mtime="949317996" flags="0" name="/usr/share/texmf/doc/latex/styles" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="71ef7b0c10523f4a870592ec670fc06a" inode="546020" device="2304" mtime="923754576" flags="0" name="/usr/share/texmf/doc/latex/styles/SIunits.dvi" file_size="134212" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7e9cf445f47d53b4ce2f92cdf7e71efd" inode="546016" device="2304" mtime="838817479" flags="0" name="/usr/share/texmf/doc/latex/styles/a4.dvi" file_size="22552" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9a957d5c4539abdeb4cf387a36aa1c25" inode="546010" device="2304" mtime="835770508" flags="0" name="/usr/share/texmf/doc/latex/styles/algorithms.dvi" file_size="22576" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e144184f0f6856a028cb61a7b9aa7bfd" inode="546018" device="2304" mtime="900085432" flags="0" name="/usr/share/texmf/doc/latex/styles/anysize.dvi" file_size="4072" groupname="root" linkto="" rdev="12382" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b96f5413ed8673b8185e5d3a4d435fa5" inode="546034" device="2304" mtime="921757189" flags="0" name="/usr/share/texmf/doc/latex/styles/bbm.dvi" file_size="11036" groupname="root" linkto="" rdev="17490" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="51a8e2736936e6b2ca64f537aba6babc" inode="546001" device="2304" mtime="837997979" flags="0" name="/usr/share/texmf/doc/latex/styles/bbold.dvi" file_size="7996" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="99accee70b84c409b55d3f5d269c0823" inode="546032" device="2304" mtime="835751324" flags="0" name="/usr/share/texmf/doc/latex/styles/beton.dvi" file_size="16272" groupname="root" linkto="" rdev="17495" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c67dfb4b62b66b38de20848cd5ccaeb3" inode="546043" device="2304" mtime="920936366" flags="0" name="/usr/share/texmf/doc/latex/styles/caption.dvi" file_size="18840" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c1b8ec5a8a45312a1247b348253678bf" inode="546009" device="2304" mtime="906689358" flags="0" name="/usr/share/texmf/doc/latex/styles/chappg.txt" file_size="2245" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="32b6ed4d74f8ab80916b2e8e750f5c7a" inode="546021" device="2304" mtime="891380208" flags="0" name="/usr/share/texmf/doc/latex/styles/comm_test_l.tex" file_size="1341" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="da4ed9147ac8ca8eddd5c8bfce9dcbc9" inode="546000" device="2304" mtime="922247396" flags="0" name="/usr/share/texmf/doc/latex/styles/concmath.dvi" file_size="34160" groupname="root" linkto="" rdev="603" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3391a53996f350b073c65511bfc32b62" inode="546041" device="2304" mtime="949315485" flags="0" name="/usr/share/texmf/doc/latex/styles/crop.dvi" file_size="35996" groupname="root" linkto="" rdev="28686" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="97db0dafcd7f4f762df20dc3bc9f93bb" inode="546033" device="2304" mtime="918961135" flags="0" name="/usr/share/texmf/doc/latex/styles/curves.dvi" file_size="88308" groupname="root" linkto="" rdev="17503" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cb59358a0e4f3ee3fe4d7f69ecefc84e" inode="545997" device="2304" mtime="949316033" flags="0" name="/usr/share/texmf/doc/latex/styles/endfloat.dvi" file_size="112604" groupname="root" linkto="" rdev="28042" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4cba54b8b19fef675baa9985979e8780" inode="546035" device="2304" mtime="798831595" flags="0" name="/usr/share/texmf/doc/latex/styles/euler.dvi" file_size="39744" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d432a35b1975d6e731efa4c14d2578f1" inode="546029" device="2304" mtime="915693659" flags="0" name="/usr/share/texmf/doc/latex/styles/examdoc.dvi" file_size="72016" groupname="root" linkto="" rdev="17491" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1b2b823d185591391c757eccda383969" inode="546007" device="2304" mtime="928148454" flags="0" name="/usr/share/texmf/doc/latex/styles/float.dvi" file_size="43264" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="40a4ec21c9ba1cbe3bc87618058fbb6b" inode="546025" device="2304" mtime="921116122" flags="0" name="/usr/share/texmf/doc/latex/styles/fltpage.dvi" file_size="28192" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e543ac3b8e20f92988d722e0fe5d24d5" inode="546037" device="2304" mtime="921116297" flags="0" name="/usr/share/texmf/doc/latex/styles/footbib.dvi" file_size="31096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0c942cb7491b81b3b5a423a47fdaab08" inode="546003" device="2304" mtime="816039240" flags="0" name="/usr/share/texmf/doc/latex/styles/footnpag-user.dvi" file_size="4032" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a62d875a1aa3ea76ba3ebb4f60259f10" inode="546004" device="2304" mtime="921121903" flags="0" name="/usr/share/texmf/doc/latex/styles/hyphenat.dvi" file_size="43716" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3403ab7cfe5a721cb160925637ce7001" inode="546027" device="2304" mtime="757888020" flags="0" name="/usr/share/texmf/doc/latex/styles/index.doc" file_size="49767" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="23def09b5594a5fc531092e3f0b62572" inode="546022" device="2304" mtime="922843016" flags="0" name="/usr/share/texmf/doc/latex/styles/labels.dvi" file_size="50524" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2dea53584f9a888dd63c3911fc0a5bc3" inode="546028" device="2304" mtime="928068735" flags="0" name="/usr/share/texmf/doc/latex/styles/lastpage.dvi" file_size="13492" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="30cf09bf0905db549b07369a1eb533ad" inode="546014" device="2304" mtime="920942814" flags="0" name="/usr/share/texmf/doc/latex/styles/layman.dvi" file_size="133580" groupname="root" linkto="" rdev="27404" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4efe8f6577317592518e6cdead2b5bd5" inode="546002" device="2304" mtime="936381291" flags="0" name="/usr/share/texmf/doc/latex/styles/listings.dvi" file_size="155656" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="41dc2113c8079e6995d67af0eb766857" inode="546024" device="2304" mtime="885477720" flags="0" name="/usr/share/texmf/doc/latex/styles/lucidabr.txt" file_size="8299" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8c18a5fe656f5df5105cb5ba56240ff8" inode="546015" device="2304" mtime="905115659" flags="0" name="/usr/share/texmf/doc/latex/styles/mathcomp.dvi" file_size="6908" groupname="root" linkto="" rdev="513" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="67d22ed3c6503f203b7ac6e9261a8f47" inode="546040" device="2304" mtime="923754084" flags="0" name="/usr/share/texmf/doc/latex/styles/mflogo.dvi" file_size="16276" groupname="root" linkto="" rdev="28685" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="46bb28f5e20af70b37c6ee2c62a05267" inode="546023" device="2304" mtime="883154395" flags="0" name="/usr/share/texmf/doc/latex/styles/moreverb.dvi" file_size="24280" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8c275ac83cc65bbdcae930bc9cf87007" inode="546005" device="2304" mtime="926182878" flags="0" name="/usr/share/texmf/doc/latex/styles/paralist.dvi" file_size="18304" groupname="root" linkto="" rdev="265" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="81cee27a8e7d1fca76e0c6a2a1562cfd" inode="546036" device="2304" mtime="803867834" flags="0" name="/usr/share/texmf/doc/latex/styles/picinpar.dvi" file_size="14384" groupname="root" linkto="" rdev="846" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="feb39fdddbd768dbb82b704378192548" inode="546013" device="2304" mtime="801940320" flags="0" name="/usr/share/texmf/doc/latex/styles/picins.txt" file_size="4282" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8e8ed0c1db06f24d8fbf672364cb3639" inode="546039" device="2304" mtime="906689385" flags="0" name="/usr/share/texmf/doc/latex/styles/placeins.txt" file_size="1523" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fc446b036f19087d759cabc707c9852b" inode="546038" device="2304" mtime="905117709" flags="0" name="/usr/share/texmf/doc/latex/styles/prettyref.dvi" file_size="5800" groupname="root" linkto="" rdev="27030" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="daa516f1ecd0e0541c7a4734dd8cb7a4" inode="546042" device="2304" mtime="845866800" flags="0" name="/usr/share/texmf/doc/latex/styles/readme.fp" file_size="16680" groupname="root" linkto="" rdev="27462" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="212216b1bdf3c17f757c7208fd9de484" inode="546031" device="2304" mtime="924218261" flags="0" name="/usr/share/texmf/doc/latex/styles/sectsty.dvi" file_size="48804" groupname="root" linkto="" rdev="17492" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f8479d69e1d4e5583adb36d224cc10b6" inode="546006" device="2304" mtime="778129200" flags="0" name="/usr/share/texmf/doc/latex/styles/slashbox.tex" file_size="1961" groupname="root" linkto="" rdev="851" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8d0e48868e664db4919553dd66335105" inode="546008" device="2304" mtime="949316654" flags="0" name="/usr/share/texmf/doc/latex/styles/soul.dvi" file_size="84164" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7fb73fb6f7127d1c189206ccb385db31" inode="546012" device="2304" mtime="921184568" flags="0" name="/usr/share/texmf/doc/latex/styles/stdclsdv.dvi" file_size="14764" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1bee1493407c0d1aefc90c7219b6f1f9" inode="545999" device="2304" mtime="934154983" flags="0" name="/usr/share/texmf/doc/latex/styles/stmaryrd.dvi" file_size="8324" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="891733390d760f37d78c2d36351406e2" inode="546030" device="2304" mtime="826487489" flags="0" name="/usr/share/texmf/doc/latex/styles/subfigure.dvi" file_size="42692" groupname="root" linkto="" rdev="17496" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="210426c03ef7fa8f3036b4c623747967" inode="546019" device="2304" mtime="949317322" flags="0" name="/usr/share/texmf/doc/latex/styles/textfit.dvi" file_size="8916" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bc8149c4259b0fdec9e882749b55b2f2" inode="546017" device="2304" mtime="936381796" flags="0" name="/usr/share/texmf/doc/latex/styles/titlesec.dvi" file_size="81700" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d72760a8f331f62fec999b1ace28b034" inode="546011" device="2304" mtime="949317993" flags="0" name="/usr/share/texmf/doc/latex/styles/tocloft.dvi" file_size="118148" groupname="root" linkto="" rdev="28110" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4e5232deee957de815b307b253261ef0" inode="546026" device="2304" mtime="839481919" flags="0" name="/usr/share/texmf/doc/latex/styles/treedoc.dvi" file_size="3592" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6d356dd32b152e95be14ef915f272fa3" inode="545998" device="2304" mtime="853888980" flags="0" name="/usr/share/texmf/doc/latex/styles/type1cm.txt" file_size="5591" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="20959" device="2304" mtime="949317063" flags="0" name="/usr/share/texmf/doc/latex/supertab" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="74e5b470ff9cf8b5b36c234b3ae9d613" inode="20961" device="2304" mtime="934074420" flags="0" name="/usr/share/texmf/doc/latex/supertab/CATALOG" file_size="851" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c2ddcc64c2df939258006ab6452aeccf" inode="20963" device="2304" mtime="934074360" flags="0" name="/usr/share/texmf/doc/latex/supertab/MANIFEST" file_size="392" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8cb781ef264e7eafde399e958dd886ce" inode="20960" device="2304" mtime="934074360" flags="0" name="/usr/share/texmf/doc/latex/supertab/README" file_size="951" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="df156c1a2045e0a9139322d1aab00246" inode="20962" device="2304" mtime="949317053" flags="0" name="/usr/share/texmf/doc/latex/supertab/supertabular.dvi" file_size="61004" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="2982428" device="2304" mtime="791174088" flags="0" name="/usr/share/texmf/doc/latex/textmerg" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="78e62f3c0d2589b2cc6a862d982ee6b8" inode="2982474" device="2304" mtime="789154779" flags="0" name="/usr/share/texmf/doc/latex/textmerg/results.dat" file_size="112" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="22a6f982650746e0733ac41cf724bce7" inode="2982432" device="2304" mtime="789154780" flags="0" name="/usr/share/texmf/doc/latex/textmerg/silly.dat" file_size="74" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b4716c570070a70b4c43c45de7f64f90" inode="2982475" device="2304" mtime="789156737" flags="0" name="/usr/share/texmf/doc/latex/textmerg/textmerg.dvi" file_size="36048" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="729de1d153fe4b4113ab370f4bd94c8b" inode="2982429" device="2304" mtime="789154776" flags="0" name="/usr/share/texmf/doc/latex/textmerg/tmexamp1.tex" file_size="622" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ec2aeeb02f2845229836b882d9b9f70e" inode="2982430" device="2304" mtime="789154777" flags="0" name="/usr/share/texmf/doc/latex/textmerg/tmexamp2.tex" file_size="631" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ba29903f92285b23eed70d9e15fb6c92" inode="2982431" device="2304" mtime="789154778" flags="0" name="/usr/share/texmf/doc/latex/textmerg/tmexampp.tex" file_size="599" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="544446" device="2304" mtime="949317959" flags="0" name="/usr/share/texmf/doc/latex/tocbibind" file_size="4096" groupname="root" linkto="" rdev="716" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="06558f6d2db2df4dd8496abf710b1542" inode="544447" device="2304" mtime="938453580" flags="0" name="/usr/share/texmf/doc/latex/tocbibind/README" file_size="943" groupname="root" linkto="" rdev="721" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="44d1aee3c8f6df7580d3e8b245baef2b" inode="544448" device="2304" mtime="949317954" flags="0" name="/usr/share/texmf/doc/latex/tocbibind/tocbibind.dvi" file_size="40668" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="186274" device="2304" mtime="984184057" flags="0" name="/usr/share/texmf/doc/latex/tools" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="147f859081aa4add31c29cb6351a2868" inode="186290" device="2304" mtime="984180411" flags="0" name="/usr/share/texmf/doc/latex/tools/afterpage.dvi" file_size="15468" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c45747556e936d59847bdb6ecc330ee1" inode="186285" device="2304" mtime="984180415" flags="0" name="/usr/share/texmf/doc/latex/tools/array.dvi" file_size="142240" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1bc17a28e3df967fc44eef5c70a4611e" inode="186284" device="2304" mtime="984180436" flags="0" name="/usr/share/texmf/doc/latex/tools/bm.dvi" file_size="61060" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="86e87e9ed93d9fccd70a6a96a5d19873" inode="186283" device="2304" mtime="984180437" flags="0" name="/usr/share/texmf/doc/latex/tools/calc.dvi" file_size="45716" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="75e7ba522dbaa8c2d8d23998b2fd40a9" inode="186300" device="2304" mtime="967082340" flags="0" name="/usr/share/texmf/doc/latex/tools/changes.txt" file_size="30418" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="be48c307b34395e6dc67d12e3feb6f27" inode="186282" device="2304" mtime="984180416" flags="0" name="/usr/share/texmf/doc/latex/tools/dcolumn.dvi" file_size="13972" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6149e819ec7a64ba29dd80c171e54470" inode="186286" device="2304" mtime="984180416" flags="0" name="/usr/share/texmf/doc/latex/tools/delarray.dvi" file_size="7236" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8351732ea55ec0070fc55107160d4484" inode="186276" device="2304" mtime="984180417" flags="0" name="/usr/share/texmf/doc/latex/tools/enumerate.dvi" file_size="10472" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="28207bd169a6f534e23240204821ef93" inode="186277" device="2304" mtime="984180417" flags="0" name="/usr/share/texmf/doc/latex/tools/fileerr.dvi" file_size="5608" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="985ed0f8abf6aefe832bd99786207967" inode="186288" device="2304" mtime="984180418" flags="0" name="/usr/share/texmf/doc/latex/tools/fontsmpl.dvi" file_size="12104" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1340574caec1d17ba6f4df932b655ea4" inode="186299" device="2304" mtime="984180419" flags="0" name="/usr/share/texmf/doc/latex/tools/ftnright.dvi" file_size="68696" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="64e4faef26327e1f474dee21138818da" inode="186301" device="2304" mtime="984180420" flags="0" name="/usr/share/texmf/doc/latex/tools/hhline.dvi" file_size="15060" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="49dc90c2a2608f28f6c0ccbeef1dcc5e" inode="186298" device="2304" mtime="984180420" flags="0" name="/usr/share/texmf/doc/latex/tools/indentfirst.dvi" file_size="1680" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="370a22bdd7ce805ebd8ec2f55dea68ed" inode="186294" device="2304" mtime="984180421" flags="0" name="/usr/share/texmf/doc/latex/tools/layout.dvi" file_size="36308" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="729d13dc9d22d97a66fc06877ec1b13a" inode="186296" device="2304" mtime="984180439" flags="0" name="/usr/share/texmf/doc/latex/tools/longtable.dvi" file_size="102096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4c6c72c126ab39fc903b7491bc1b70ca" inode="186292" device="2304" mtime="965669940" flags="0" name="/usr/share/texmf/doc/latex/tools/manifest.txt" file_size="2939" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8bfe7b77f945044ede651c8264f4f0e4" inode="186291" device="2304" mtime="984180425" flags="0" name="/usr/share/texmf/doc/latex/tools/multicol.dvi" file_size="166572" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="79f50cb60a65f05f5147ff6e1116c02a" inode="186275" device="2304" mtime="984180425" flags="0" name="/usr/share/texmf/doc/latex/tools/rawfonts.dvi" file_size="10464" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9b72a003c8cdadf0bf3534cdaa109591" inode="186287" device="2304" mtime="965669940" flags="0" name="/usr/share/texmf/doc/latex/tools/readme.txt" file_size="3839" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="05601fc2ca8352363ca0353c4a443022" inode="186281" device="2304" mtime="984180426" flags="0" name="/usr/share/texmf/doc/latex/tools/showkeys.dvi" file_size="26436" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="01edac1b2021fdac9b556c0cdb7a467a" inode="186278" device="2304" mtime="984180427" flags="0" name="/usr/share/texmf/doc/latex/tools/somedefs.dvi" file_size="6356" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="81067de23cb7b225f671762207ae0c7e" inode="186297" device="2304" mtime="984180428" flags="0" name="/usr/share/texmf/doc/latex/tools/tabularx.dvi" file_size="35300" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7231422b9cedc31cf9772f14858f045e" inode="186295" device="2304" mtime="984180430" flags="0" name="/usr/share/texmf/doc/latex/tools/theorem.dvi" file_size="51844" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="230962254d30e9d2e7feb176a1a38f52" inode="186280" device="2304" mtime="984180432" flags="0" name="/usr/share/texmf/doc/latex/tools/varioref.dvi" file_size="83980" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="85d3dc9821acd4dc8267a574ce161ce1" inode="186279" device="2304" mtime="984180433" flags="0" name="/usr/share/texmf/doc/latex/tools/verbatim.dvi" file_size="66388" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="910bef8fd297889a6c7237115fff4302" inode="186293" device="2304" mtime="984180434" flags="0" name="/usr/share/texmf/doc/latex/tools/xr.dvi" file_size="5224" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="96ee80a3d16b6869748d8cfbe18d8898" inode="186289" device="2304" mtime="984180434" flags="0" name="/usr/share/texmf/doc/latex/tools/xspace.dvi" file_size="4084" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="447907" device="2304" mtime="920936862" flags="0" name="/usr/share/texmf/doc/latex/units" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d514046e3666f56011d479391105435f" inode="447908" device="2304" mtime="902286000" flags="0" name="/usr/share/texmf/doc/latex/units/README" file_size="1375" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e35805af054de8e7a933d0dda3c08d71" inode="447909" device="2304" mtime="920936780" flags="0" name="/usr/share/texmf/doc/latex/units/units.dvi" file_size="26280" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="709532" device="2304" mtime="926897113" flags="0" name="/usr/share/texmf/doc/latex/wasysym" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6c7a94a65f4d2c60f0891a9c9f724537" inode="709533" device="2304" mtime="782101159" flags="0" name="/usr/share/texmf/doc/latex/wasysym/wasydoc.dvi" file_size="18568" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b1e534cbdd1d6ca28b01216576bc94db" inode="709534" device="2304" mtime="926897094" flags="0" name="/usr/share/texmf/doc/latex/wasysym/wasysym.dvi" file_size="19936" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="20199" device="2304" mtime="949171240" flags="0" name="/usr/share/texmf/doc/latex/xtab" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3e27e11051884d3f612373b62acd0d3a" inode="20957" device="2304" mtime="920001600" flags="0" name="/usr/share/texmf/doc/latex/xtab/README" file_size="721" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f2c5a7f94f5291a79643d874629dff23" inode="20958" device="2304" mtime="949171240" flags="0" name="/usr/share/texmf/doc/latex/xtab/xtab.dvi" file_size="111676" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="660484" device="2304" mtime="926897032" flags="0" name="/usr/share/texmf/doc/latex/yfonts" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3f322dbe85e2a9111ea9de03cf83149c" inode="660485" device="2304" mtime="908137062" flags="0" name="/usr/share/texmf/doc/latex/yfonts/frktest.tex" file_size="2907" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="677537114d96e97c1798c35ce0ae5497" inode="660488" device="2304" mtime="926523788" flags="0" name="/usr/share/texmf/doc/latex/yfonts/liesmich" file_size="2881" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="12b0e47fd8557f16751b5f21958c2412" inode="660486" device="2304" mtime="926523766" flags="0" name="/usr/share/texmf/doc/latex/yfonts/readme" file_size="4495" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="767c608a35c18122840439332a42832f" inode="660487" device="2304" mtime="926897028" flags="0" name="/usr/share/texmf/doc/latex/yfonts/yfonts.dvi" file_size="30776" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3783714" device="2304" mtime="984184073" flags="0" name="/usr/share/texmf/doc/makeindex" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="94fdf6315b56ddd0606a293a2a7c18cf" inode="3783716" device="2304" mtime="782099609" flags="0" name="/usr/share/texmf/doc/makeindex/ind.dvi" file_size="84932" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7d859c3838585801c1e27b83b4190e13" inode="3783715" device="2304" mtime="782099594" flags="0" name="/usr/share/texmf/doc/makeindex/makeindex.dvi" file_size="21952" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3780108" device="2304" mtime="923171879" flags="0" name="/usr/share/texmf/doc/metapost" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3374581" device="2304" mtime="949167629" flags="0" name="/usr/share/texmf/doc/metapost/base" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6c3fd4a7b0de205c342aea3cfe836763" inode="3374917" device="2304" mtime="852947962" flags="0" name="/usr/share/texmf/doc/metapost/base/INDEX" file_size="882" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="72662943ffeb14d3a7e1c5efe560dcc4" inode="3374928" device="2304" mtime="797011462" flags="0" name="/usr/share/texmf/doc/metapost/base/agepop91.d" file_size="935" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="29a3f20227cdefdec533331fcf5065a2" inode="3374918" device="2304" mtime="797011462" flags="0" name="/usr/share/texmf/doc/metapost/base/agepopm.d" file_size="753" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f1182e4d7f8e374444be7421f53db11b" inode="3374922" device="2304" mtime="838836724" flags="0" name="/usr/share/texmf/doc/metapost/base/config.old" file_size="10" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="728a506e27c890c2ad8c38df2d38c051" inode="3374920" device="2304" mtime="797011462" flags="0" name="/usr/share/texmf/doc/metapost/base/countries.d" file_size="958" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0355bcc5378d2b902d601698effd55a2" inode="3374916" device="2304" mtime="704166064" flags="0" name="/usr/share/texmf/doc/metapost/base/demo.ms" file_size="2404" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b43eb63a97229edfc981809844d42851" inode="3374923" device="2304" mtime="797011462" flags="0" name="/usr/share/texmf/doc/metapost/base/energy.d" file_size="2296" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7fd65e861f305db44e882ffadb7a2297" inode="3374925" device="2304" mtime="797195053" flags="0" name="/usr/share/texmf/doc/metapost/base/figs.1" file_size="6099" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7253f9f25f7fa57d87770722f4b01802" inode="3374921" device="2304" mtime="735116515" flags="0" name="/usr/share/texmf/doc/metapost/base/figs.mp" file_size="406" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0cc7375d49c88bf1ebd2f83ff0eba6f0" inode="3374944" device="2304" mtime="838610380" flags="0" name="/usr/share/texmf/doc/metapost/base/grdemo.ms" file_size="3056" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="512ce8676655258145c6c808d622eb40" inode="3374929" device="2304" mtime="797011462" flags="0" name="/usr/share/texmf/doc/metapost/base/lead.d" file_size="280" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1b670d9065313aff9840b9ffa198d78d" inode="3374927" device="2304" mtime="797023517" flags="0" name="/usr/share/texmf/doc/metapost/base/manfig.mp" file_size="19920" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="be7748f8bf71be2a6401125495f57603" inode="3374926" device="2304" mtime="797011463" flags="0" name="/usr/share/texmf/doc/metapost/base/matmul.d" file_size="258" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6a1a177db28a10b3bc7d64da6d0d8ff3" inode="3374934" device="2304" mtime="896653729" flags="0" name="/usr/share/texmf/doc/metapost/base/mpgraph.1" file_size="4299" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7d8bbfa506949277a965fdd6ea0a2069" inode="3374582" device="2304" mtime="896653731" flags="0" name="/usr/share/texmf/doc/metapost/base/mpgraph.10" file_size="201" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5c2227146a086250188eecf338fce9d8" inode="3374583" device="2304" mtime="896653731" flags="0" name="/usr/share/texmf/doc/metapost/base/mpgraph.11" file_size="414" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="a437c8e7c256c162a7e452002276cddd" inode="3374935" device="2304" mtime="896653730" flags="0" name="/usr/share/texmf/doc/metapost/base/mpgraph.2" file_size="6611" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="abc608cc32036fa3b8a198e439e4f41e" inode="3374936" device="2304" mtime="896653730" flags="0" name="/usr/share/texmf/doc/metapost/base/mpgraph.3" file_size="4156" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9951c5f76951e277318baa4e0f4547fe" inode="3374937" device="2304" mtime="896653730" flags="0" name="/usr/share/texmf/doc/metapost/base/mpgraph.4" file_size="4250" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9aaac5f6227d4b12deb789ca7ad7a64c" inode="3374938" device="2304" mtime="896653730" flags="0" name="/usr/share/texmf/doc/metapost/base/mpgraph.5" file_size="2518" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1bb931e65a8ef5ee204d951ee35a6aa2" inode="3374939" device="2304" mtime="896653730" flags="0" name="/usr/share/texmf/doc/metapost/base/mpgraph.6" file_size="4223" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="94382d0ea7f8f3db4d8de7cbf77ca946" inode="3374940" device="2304" mtime="896653730" flags="0" name="/usr/share/texmf/doc/metapost/base/mpgraph.7" file_size="3466" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3a4771496c741aec005e1a636a1e69b4" inode="3374941" device="2304" mtime="896653731" flags="0" name="/usr/share/texmf/doc/metapost/base/mpgraph.8" file_size="5475" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="864073615ad7f98a9a2b7a39fc745532" inode="3374942" device="2304" mtime="896653731" flags="0" name="/usr/share/texmf/doc/metapost/base/mpgraph.9" file_size="17199" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="fcf9ae90342aecbfe254ff8d80f0c410" inode="3374931" device="2304" mtime="797011461" flags="0" name="/usr/share/texmf/doc/metapost/base/mpgraph.dvi" file_size="56720" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="978a9f2e85342a8262e29faf0ebfddee" inode="3374584" device="2304" mtime="797011461" flags="0" name="/usr/share/texmf/doc/metapost/base/mpgraph.mp" file_size="2974" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4973c8639bb3f13cc0a555ae746c1dd2" inode="3374932" device="2304" mtime="896653729" flags="0" name="/usr/share/texmf/doc/metapost/base/mpgraph.mpx" file_size="8446" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="af1b12c9e8f7439de7e9cf990023a855" inode="3374585" device="2304" mtime="890178569" flags="0" name="/usr/share/texmf/doc/metapost/base/mpgraph.ps" file_size="385016" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2a219d51f000283c22a999cddd422f17" inode="3374943" device="2304" mtime="804308400" flags="0" name="/usr/share/texmf/doc/metapost/base/mpintro.ps" file_size="173236" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c4dcd9f2b74ccedfd56cfcad67e96ebf" inode="3374930" device="2304" mtime="890178566" flags="0" name="/usr/share/texmf/doc/metapost/base/mpman.ps" file_size="786599" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="540580566f82fafb8e129fa8716bf5fb" inode="3374933" device="2304" mtime="838836767" flags="0" name="/usr/share/texmf/doc/metapost/base/old.map" file_size="35" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="efcea8bb85c7a4629fe91e25078aab5c" inode="3374924" device="2304" mtime="896653728" flags="0" name="/usr/share/texmf/doc/metapost/base/texnum.mpx" file_size="2018" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="299b356a3ff67016735cab4ef98d7c30" inode="3374919" device="2304" mtime="797011463" flags="0" name="/usr/share/texmf/doc/metapost/base/timepop.d" file_size="252" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="2982421" device="2304" mtime="926937269" flags="0" name="/usr/share/texmf/doc/mex" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="2bd05afd737a743269a5bb10259d940c" inode="2982422" device="2304" mtime="926913720" flags="0" name="/usr/share/texmf/doc/mex/00readme" file_size="8572" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d32fb6bdb1a521d24d06285e76636d18" inode="2982423" device="2304" mtime="880092402" flags="0" name="/usr/share/texmf/doc/mex/mexinfo.eng" file_size="25248" groupname="root" linkto="" rdev="629" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="cd7df398e6f59c4e2445fbb12c75cab3" inode="2982424" device="2304" mtime="880092402" flags="0" name="/usr/share/texmf/doc/mex/mexinfo.pol" file_size="42503" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e18d00b6e73f51608478993c393b3013" inode="2982479" device="2304" mtime="949409127" flags="0" name="/usr/share/texmf/doc/mkhtml" file_size="1669" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32275" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e50baf80c5e75ca17c2f25031dc64705" inode="2982480" device="2304" mtime="949409132" flags="0" name="/usr/share/texmf/doc/mkhtml.nawk" file_size="2305" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32275" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="063007d06e2bdd4e1e52fb9f835f47d4" inode="2982482" device="2304" mtime="949168141" flags="0" name="/usr/share/texmf/doc/newhelpindex.html" file_size="42415" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="1150318" device="2304" mtime="890092824" flags="0" name="/usr/share/texmf/doc/omega" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="1150341" device="2304" mtime="928151572" flags="0" name="/usr/share/texmf/doc/omega/base" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="012c3e5d9386b390d78ebe9020f54491" inode="1150342" device="2304" mtime="923173920" flags="0" name="/usr/share/texmf/doc/omega/base/omega-manual.dvi" file_size="106848" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7fdd32c203c3ef93b2fea9a90c4ee921" inode="1150343" device="2304" mtime="928151199" flags="0" name="/usr/share/texmf/doc/omega/base/omega-manual.pdf" file_size="263241" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="1231533" device="2304" mtime="921184788" flags="0" name="/usr/share/texmf/doc/pdftex" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="1231534" device="2304" mtime="949365729" flags="0" name="/usr/share/texmf/doc/pdftex/base" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="46101f93086134704629405d62b54316" inode="1231535" device="2304" mtime="928291651" flags="0" name="/usr/share/texmf/doc/pdftex/base/README" file_size="302" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="087f87623f6d92b13d0d7b1306809d5d" inode="1231536" device="2304" mtime="922723461" flags="0" name="/usr/share/texmf/doc/pdftex/base/example.tex" file_size="16329" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="353bf07a0edce4c3319586d10cdbf9ba" inode="1231537" device="2304" mtime="862630572" flags="0" name="/usr/share/texmf/doc/pdftex/base/image.png" file_size="53398" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="d5fb4391aa19ee1a6515bafd5664b3d5" inode="1231539" device="2304" mtime="910966863" flags="0" name="/usr/share/texmf/doc/pdftex/base/pdfTeX-FAQ.pdf" file_size="91407" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4f0f5203a65739dab147535f0c68abec" inode="1231538" device="2304" mtime="942084136" flags="0" name="/usr/share/texmf/doc/pdftex/base/pdftexman.pdf" file_size="229518" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="1231540" device="2304" mtime="947677277" flags="0" name="/usr/share/texmf/doc/pdftex/thumbpdf" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="be9df92b33159f1d8d2f58ef022464a5" inode="1231541" device="2304" mtime="949261550" flags="0" name="/usr/share/texmf/doc/pdftex/thumbpdf/readme.txt" file_size="11386" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="1231542" device="2304" mtime="928149693" flags="0" name="/usr/share/texmf/doc/programs" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b844cb20c8f9a3d1bd2fb0c9fb631a9f" inode="1231545" device="2304" mtime="922763891" flags="0" name="/usr/share/texmf/doc/programs/dvips.dvi" file_size="361248" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="21090895f35efc004edec5dc9966f85a" inode="1231546" device="2304" mtime="928037188" flags="0" name="/usr/share/texmf/doc/programs/kpathsea.dvi" file_size="387280" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ab65c9ce956d83aeb52b23ff79e504d1" inode="1231547" device="2304" mtime="928110321" flags="0" name="/usr/share/texmf/doc/programs/kpathsea.pdf" file_size="536075" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bb4d5a97eab4677f402a77d5e16c1049" inode="1231548" device="2304" mtime="923180966" flags="0" name="/usr/share/texmf/doc/programs/texinfo.dvi" file_size="863172" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3c26a3867256e2aa8ace5c4d6623388a" inode="1231543" device="2304" mtime="928037166" flags="0" name="/usr/share/texmf/doc/programs/web2c.dvi" file_size="395876" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="00efb35e5953faa0158df5403e5d6039" inode="1231544" device="2304" mtime="928110341" flags="0" name="/usr/share/texmf/doc/programs/web2c.pdf" file_size="583700" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="1231562" device="2304" mtime="989511067" flags="0" name="/usr/share/texmf/doc/ptex" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="604de781a33f8d3d4333af57aaa7aa57" inode="1231563" device="2304" mtime="972571323" flags="0" name="/usr/share/texmf/doc/ptex/jfm.tex" file_size="6570" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="3ea64d21c65838a77c6c439dacc8080f" inode="1231564" device="2304" mtime="972571323" flags="0" name="/usr/share/texmf/doc/ptex/jtex.tex" file_size="29808" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4993b9d84fe15203ea0ddae53a042eac" inode="1231565" device="2304" mtime="972571323" flags="0" name="/usr/share/texmf/doc/ptex/jtexdoc.tex" file_size="18130" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="495abdea74eaa4dc9c5724e084da7edf" inode="1231566" device="2304" mtime="972571323" flags="0" name="/usr/share/texmf/doc/ptex/ptexdoc.tex" file_size="39494" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c6c6dcd462b02f4f0d0f5e7d4611b9c8" inode="1231567" device="2304" mtime="972571323" flags="0" name="/usr/share/texmf/doc/ptex/ptexskip.tex" file_size="17653" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="1150344" device="2304" mtime="949401529" flags="0" name="/usr/share/texmf/doc/tetex" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e12d719a1fb9923b985ae77a9624f318" inode="2982481" device="2304" mtime="889576112" flags="0" name="/usr/share/texmf/doc/tetex.gif" file_size="1099" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5e12cd8dc2270f0b864392ed2a6cc33a" inode="1150356" device="2304" mtime="927999996" flags="0" name="/usr/share/texmf/doc/tetex/CREDITS" file_size="449" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="baf3cc8d7793b83727c0a1c13d80fbdb" inode="1150354" device="2304" mtime="928080225" flags="0" name="/usr/share/texmf/doc/tetex/FEATURES" file_size="1055" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="93b08965118dce431a97659bac6d557b" inode="1150351" device="2304" mtime="928610902" flags="0" name="/usr/share/texmf/doc/tetex/Makefile" file_size="593" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="23f17b27795292949c63a6dcfd54d547" inode="1150345" device="2304" mtime="928611034" flags="0" name="/usr/share/texmf/doc/tetex/NEWS" file_size="5142" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="31bc82ba0d79d26c5c8b074f17f05703" inode="1150352" device="2304" mtime="928613448" flags="0" name="/usr/share/texmf/doc/tetex/README" file_size="1568" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c3a71eda09c86070999f82a2a5da1b1a" inode="1150347" device="2304" mtime="928605369" flags="0" name="/usr/share/texmf/doc/tetex/TETEXDOC.bib" file_size="417" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1a51e2b668ee4884134a7bb588118a60" inode="1150348" device="2304" mtime="942234401" flags="0" name="/usr/share/texmf/doc/tetex/TETEXDOC.dvi" file_size="52036" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f488d9dbe139b5ca359d9943c0e3b875" inode="1150349" device="2304" mtime="950382448" flags="0" name="/usr/share/texmf/doc/tetex/TETEXDOC.pdf" file_size="112056" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="db0076876dd41c40d30ef0c81ddcbdd6" inode="1150355" device="2304" mtime="950382412" flags="0" name="/usr/share/texmf/doc/tetex/TETEXDOC.ps" file_size="105271" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6b6c384be914a4116a4b1b48602da0c2" inode="1150350" device="2304" mtime="942234742" flags="0" name="/usr/share/texmf/doc/tetex/TETEXDOC.tex" file_size="34310" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e2f90716a3ce33e8425b3d3156e39d0a" inode="1150346" device="2304" mtime="928197041" flags="0" name="/usr/share/texmf/doc/tetex/eutotex98-te.pdf" file_size="172832" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="f157c288592d58813acf12cee2aec817" inode="1150353" device="2304" mtime="928610059" flags="0" name="/usr/share/texmf/doc/tetex/teTeX-FAQ" file_size="27330" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="934632071fc944e73c7765a7c8fcbe5d" inode="3618750" device="2304" mtime="969984780" flags="0" name="/usr/share/texmf/doc/generic/babel/install.OzTeX-4" file_size="3445" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="bf8533c971df7f456dfd81f4ed764c08" inode="2704483" device="2304" mtime="984176282" flags="0" name="/usr/share/texmf/doc/latex/base/ltnews13.dvi" file_size="7252" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4efb9e2340973c281d9669976b47e704" inode="2702612" device="2304" mtime="984178119" flags="0" name="/usr/share/texmf/doc/latex/base/manual.dvi" file_size="11336" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9525d03e0bb648e13ffc8420d0bc4961" inode="2703059" device="2304" mtime="984178120" flags="0" name="/usr/share/texmf/doc/latex/base/webcomp.dvi" file_size="3484" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="b71854688ead2f595a471b34ff65e841" inode="3914536" device="2304" mtime="953911260" flags="0" name="/usr/share/texmf/doc/latex/amscls/install.txt" file_size="7566" groupname="root" linkto="" rdev="1280" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c0224f77a49e01b06b119b3e9d621545" inode="971085" device="2304" mtime="939819194" flags="0" name="/usr/share/texmf/doc/latex/hyperref/paper.pdf" file_size="161506" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8df2afbd00876a1b84fecec2a627a609" inode="2833289" device="2304" mtime="978491940" flags="0" name="/usr/share/texmf/doc/fonts/txfonts/txfontsdocA4.tex" file_size="40389" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ffa4b7dac216e4274c105cc8b94bd113" inode="2702602" device="2304" mtime="984178118" flags="0" name="/usr/share/texmf/doc/latex/base/grphcomp.dvi" file_size="38168" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="6360729757efa927315f24e5a17eaf3d" inode="2703063" device="2304" mtime="984178117" flags="0" name="/usr/share/texmf/doc/latex/base/compan.dvi" file_size="103424" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="45d7d81eb51cd0e7d2ccc7fed165ad7f" inode="544558" device="2304" mtime="955631040" flags="0" name="/usr/share/texmf/doc/latex/psnfss/psnfss2e.pdf" file_size="121805" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="12b4e61ef781409a0ee42a554bf33b3a" inode="2703072" device="2304" mtime="965082660" flags="0" name="/usr/share/texmf/doc/latex/base/webcompg.err" file_size="10411" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="544557" device="2304" mtime="984325626" flags="0" name="/usr/share/texmf/doc/latex/psnfss" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="3358559" device="2304" mtime="982859731" flags="0" name="/usr/share/texmf/doc/fonts/pxfonts" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e8c04daa26c1b35f55a697f90ff3aa39" inode="3358564" device="2304" mtime="983385000" flags="0" name="/usr/share/texmf/doc/fonts/pxfonts/pxfontsdocA4.tex" file_size="32350" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="c9b9de6b805a709be8343cfa122d5be8" inode="3358561" device="2304" mtime="983385000" flags="0" name="/usr/share/texmf/doc/fonts/pxfonts/pxfontsdoc.tex" file_size="32750" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="0e9b4034490cf8af54ab6145f2a252e7" inode="3618754" device="2304" mtime="969984780" flags="0" name="/usr/share/texmf/doc/generic/babel/install.OzTeX-pre4" file_size="5272" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="4c297aa367795b49058491e5949b9495" inode="2703071" device="2304" mtime="984178143" flags="0" name="/usr/share/texmf/doc/latex/base/webcompg.dvi" file_size="8996" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="62132fe41e6f7fb4ce228db02d682306" inode="2833276" device="2304" mtime="983384760" flags="0" name="/usr/share/texmf/doc/fonts/txfonts/txfontsdoc.pdf" file_size="413037" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="" inode="2833275" device="2304" mtime="982859731" flags="0" name="/usr/share/texmf/doc/fonts/txfonts" file_size="4096" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="16877" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="7cf55b0dcb2ac2deea46e18747447212" inode="3358563" device="2304" mtime="983385000" flags="0" name="/usr/share/texmf/doc/fonts/pxfonts/pxfontsdocA4.pdf" file_size="272611" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="e5c2efdf0fecadb5d34ac1b3162ea59e" inode="3358565" device="2304" mtime="983385000" flags="0" name="/usr/share/texmf/doc/fonts/pxfonts/pxfontsdoc.ps" file_size="1019055" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="30bb33f26527e662dfd0706189cac4cc" inode="2833277" device="2304" mtime="978492780" flags="0" name="/usr/share/texmf/doc/fonts/txfonts/txfontsdoc.tex" file_size="41018" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="17d25babc07a4e8bcc225443007221e3" inode="2833290" device="2304" mtime="983384760" flags="0" name="/usr/share/texmf/doc/fonts/txfonts/txfontsdoc.ps" file_size="1238813" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="ecdeb2913b8e2835daa1f4dd84deff2a" inode="3914537" device="2304" mtime="960298980" flags="0" name="/usr/share/texmf/doc/latex/amscls/00readme.txt" file_size="2338" groupname="root" linkto="" rdev="9025" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="de53d0a867006fd4357e8134259da18c" inode="971084" device="2304" mtime="939819194" flags="0" name="/usr/share/texmf/doc/latex/hyperref/slides.pdf" file_size="346068" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8bc084ed2be4711f4f06ed725bac9b25" inode="2833278" device="2304" mtime="983384760" flags="0" name="/usr/share/texmf/doc/fonts/txfonts/txfontsdocA4.ps" file_size="1238013" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="09be91104f9c2b74975cd228416a2b33" inode="3618743" device="2304" mtime="982901040" flags="0" name="/usr/share/texmf/doc/generic/babel/00readme.heb" file_size="24033" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="747c329c54abcb2490ff78e9e7da1fc7" inode="3358560" device="2304" mtime="983385000" flags="0" name="/usr/share/texmf/doc/fonts/pxfonts/pxfontsdoc.pdf" file_size="273578" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="1180e2d64d7a661682fc5bb6fe176e4d" inode="2833279" device="2304" mtime="983384760" flags="0" name="/usr/share/texmf/doc/fonts/txfonts/txfontsdocA4.pdf" file_size="411586" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="5ce24b263644b7cd7ed3ccc5f495a2c6" inode="3618746" device="2304" mtime="982897020" flags="0" name="/usr/share/texmf/doc/generic/babel/babel.dvi" file_size="1662644" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="8207f52724df0fe47f7424cb65f7a675" inode="3358562" device="2304" mtime="983385000" flags="0" name="/usr/share/texmf/doc/fonts/pxfonts/pxfontsdocA4.ps" file_size="1019029" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/><rhn-package-file checksum-type="md5" checksum="9ade460b0b3f50e22db09156fa16cc98" inode="2702603" device="2304" mtime="984178118" flags="0" name="/usr/share/texmf/doc/latex/base/handbuch.dvi" file_size="6088" groupname="root" linkto="" rdev="0" verifyflags="-1" file_mode="-32348" lang="" username="root"/></rhn-package-files></rhn-package>
  07070100000200000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002F00000000spacewalk-backend/server/test/unit-test/rhnSQL    07070100000201000081B40000000000000000000000015FBBE8EE00000057000000000000000000000000000000000000003F00000000spacewalk-backend/server/test/unit-test/rhnSQL/db_settings.ini    [postgresql]
host: localhost
user: spacewalk
password: spacewalk
database: susemanager
 07070100000202000081B40000000000000000000000015FBBE8EE00003A7F000000000000000000000000000000000000004100000000spacewalk-backend/server/test/unit-test/rhnSQL/misc_functions.py  #!/usr/bin/python
#
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
#
#

import os
import sys
import time
from uyuni.common import usix

try:
    #  python 2
    from ConfigParser import ConfigParser
except ImportError:
    #  python3
    from configparser import ConfigParser
from spacewalk.common.rhnConfig import CFG
from spacewalk.server import rhnSQL, rhnUser

# Add backend/server/test/attic directory to PYTHONPATH
sys.path.insert(
    0,
    os.path.abspath(os.path.dirname(os.path.abspath(__file__) + "/../../../attic/"))
)
import rhnActivationKey
import rhnServerGroup


def create_new_org():
    "Create a brand new org; return the new org id"
    org_name = "unittest-org-%.3f" % time.time()
    org_password = "unittest-password-%.3f" % time.time()

    org_id = rhnServerGroup.create_new_org(org_name, org_password)
    rhnSQL.commit()
    return org_id


def _create_server_group(org_id, name, description):
    "Create a server group; return the server group object"
    s = rhnServerGroup.ServerGroup()
    s.set_org_id(org_id)
    s.set_name(name)
    s.set_description(description)
    s.save()
    rhnSQL.commit()
    return s


def create_server_group(params):
    "Create a server group from a dictionary with the params"
    return _create_server_group(*(), **params)


def fetch_server_group(org_id, name):
    "Load a server group object from the org id and name"
    s = rhnServerGroup.ServerGroup()
    s.load(org_id, name)
    return s

_query_fetch_server_groups = rhnSQL.Statement("""
    select sgm.server_group_id
      from rhnServerGroupMembers sgm,
           rhnServerGroup sg
     where sgm.server_id = :server_id
      and sgm.server_group_id = sg.id
      and sg.group_type is null
""")


def fetch_server_groups(server_id):
    "Return a server's groups"
    h = rhnSQL.prepare(_query_fetch_server_groups)
    h.execute(server_id=server_id)
    groups = [x['server_group_id'] for x in h.fetchall_dict() or []]
    groups.sort()
    return groups


def build_server_group_params(**kwargs):
    "Build params for server groups"
    params = {
        'org_id':   'no such org',
        'name':   "unittest group name %.3f" % time.time(),
        'description':   "unittest group description %.3f" % time.time(),
    }
    params.update(kwargs)
    return params


def create_new_user(org_id=None, username=None, password=None, roles=None, encrypt_password=False):
    "Create a new user"
    if org_id is None:
        org_id = create_new_org()
    else:
        org_id = lookup_org_id(org_id)

    if username is None:
        username = "unittest-user-%.3f" % time.time()
    if password is None:
        password = "unittest-password-%.3f" % time.time()
    if encrypt_password:
        password = rhnUser.encrypt_password(password)
    if roles is None:
        roles = []

    login = username
    oracle_contact_id = None
    prefix = "Mr."
    first_names = "First Name %3.f" % time.time()
    last_name = "Last Name %3.f" % time.time()
    genqual = None
    parent_company = None
    company = "ACME"
    title = ""
    phone = ""
    fax = ""
    email = "%s@example.com" % username
    pin = 0
    first_names_ol = " "
    last_name_ol = " "
    address1 = " "
    address2 = " "
    address3 = " "
    city = " "
    state = " "
    zip_code = " "
    country = " "
    alt_first_names = None
    alt_last_name = None
    contact_call = "N"
    contact_mail = "N"
    contact_email = "N"
    contact_fax = "N"

    f = rhnSQL.Function('create_new_user', rhnSQL.types.NUMBER())
    ret = f(
        org_id,
        login,
        password,
        oracle_contact_id,
        prefix,
        first_names,
        last_name,
        genqual,
        parent_company,
        company,
        title,
        phone,
        fax,
        email,
        pin,
        first_names_ol,
        last_name_ol,
        address1,
        address2,
        address3,
        city,
        state,
        zip_code,
        country,
        alt_first_names,
        alt_last_name,
        contact_call,
        contact_mail,
        contact_email,
        contact_fax
    )

    u = rhnUser.search(username)

    if u is None:
        raise Exception("Couldn't create the new user - user not found")

    # Set roles
    h = rhnSQL.prepare("""
        select ug.id
          from rhnUserGroupType ugt, rhnUserGroup ug
         where ug.org_id = :org_id
           and ug.group_type = ugt.id
           and ugt.label = :role
    """)
    create_ugm = rhnSQL.Procedure("rhn_user.add_to_usergroup")
    for role in roles:
        h.execute(org_id=org_id, role=role)
        row = h.fetchone_dict()
        if not row:
            raise InvalidRoleError(org_id, role)

        user_group_id = row['id']
        create_ugm(u.getid(), user_group_id)

    return u


def lookup_org_id(org_id):
    "Look up the org id by user name"
    if isinstance(org_id, usix.StringType):
        # Is it a user?
        u = rhnUser.search(org_id)

        if not u:
            raise rhnServerGroup.InvalidUserError(org_id)

        return u.contact['org_id']

    t = rhnSQL.Table('web_customer', 'id')
    row = t[org_id]
    if not row:
        raise rhnServerGroup.InvalidOrgError(org_id)
    return row['id']


class InvalidEntitlementError(Exception):
    pass


class InvalidRoleError(Exception):
    pass


def get_server_arch_id(architecture):
    lookup = """
        SELECT id
        FROM rhnServerArch
        WHERE label = :architecture
    """
    h = rhnSQL.prepare(lookup)
    h.execute(
        architecture=architecture
    )
    row = h.fetchone_dict()

    if row:
        return row['id']
    else:
        return None


def create_activation_key(org_id=None, user_id=None, groups=None,
                          channels=None, entitlement_level=None, note=None, server_id=None, release=None):
    if org_id is None:
        need_user = 1
        org_id = create_new_org()
    else:
        need_user = 0

    if user_id is None:
        if need_user:
            u = create_new_user(org_id=org_id)
            user_id = u.getid()
    else:
        u = rhnUser.User("", "")
        u.reload(user_id)

    if groups is None:
        groups = []
        for i in range(3):
            params = build_server_group_params(org_id=org_id)
            sg = create_server_group(params)
            groups.append(sg.get_id())

    if channels is None:
        channels = ['rhel-i386-as-3-beta', 'rhel-i386-as-2.1-beta']

    channel_arch_id = find_or_create_channel_arch(
        name="channel - test",
        label="test"
    )

    # ensure channels are created
    for channel_label in channels:
        channel = add_channel(
            label=channel_label,
            org_id=org_id,
            channel_arch_id=channel_arch_id
        )
        populate_rhn_dist_channel_map(
            channel_id=channel['id'],
            channel_arch_id=channel_arch_id,
            org_id=org_id,
            release=release
        )

    if entitlement_level is None:
        entitlement_level = 'enterprise_entitled'

    if note is None:
        note = "Test activation key %d" % int(time.time())

    a = rhnActivationKey.ActivationKey()
    a.set_user_id(user_id)
    a.set_org_id(org_id)
    a.set_entitlement_level(entitlement_level)
    a.set_note(note)
    a.set_server_groups(groups)
    a.set_channels(channels)
    a.set_server_id(server_id)
    a.save()
    rhnSQL.commit()

    return a


def db_settings(backend=None):
    """
    Parses the contents of the db_settings.ini file and returns the connection
    settings of the required backend inside of a dictionary with the following
    keys:
      * backend
      * user
      * password
      * database
      * host (returned only by PostgreSQL backend)

    When backend is None the code looks for the value of the DATABASE environment
    variable. If the environment variable is not set Postgresql is going to be
    used as the default backend.
    """

    if not backend and os.getenv("DATABASE"):
        backend = os.getenv("DATABASE")
    elif not backend:
        backend = "postgresql"

    settings = {}

    config = ConfigParser()
    config.read(os.path.dirname(os.path.abspath(__file__)) + "/db_settings.ini")

    settings['backend'] = backend
    settings['user'] = config.get(backend, 'user')
    settings['password'] = config.get(backend, 'password')
    settings['database'] = config.get(backend, 'database')
    if backend == 'postgresql':
        settings['host'] = config.get(backend, 'host')

    return settings


def setup_db_connection():
    """
    Fetches database configuration using db_settings and initializes the
    database connection.
    """

    settings = db_settings()
    rhnSQL.initDB(
        backend=settings['backend'],
        username=settings["user"],
        password=settings["password"],
        database=settings["database"]
    )


def grant_channel_family_entitlements(org_id, channel_family, quantity):
    """
    Check to see if org has a channelfamily associated with it.
    If not, Create one.
    """
    _lookup_chfam = """
       SELECT 1 from rhnChannelFamily
        WHERE label='%s'
    """ % channel_family
    h = rhnSQL.prepare(_lookup_chfam)
    row = h.execute()
    # some extra check for upgrades
    if row:
        # Already exists, move on
        return
    _query_create_chfam = """
       INSERT INTO  rhnChannelFamily
              (id, name, label, org_id)
       VALUES (sequence_nextval('rhn_channel_family_id_seq'), :name, :label, :org)

    """
    h = rhnSQL.prepare(_query_create_chfam)
    try:
        h.execute(
            name='Private Channel Family %s' % channel_family,
            label=channel_family,
            org=org_id
        )
    except rhnSQL.SQLError:
        e = sys.exc_info()[1]
        # if we're here that means we're voilating something
        raise


def find_or_create_arch_type(name, label):
    lookup = """
       SELECT id from rhnArchType
        WHERE label='%s' AND name = '%s'
    """ % (label, name)
    h = rhnSQL.prepare(lookup)
    h.execute()
    row = h.fetchone_dict()
    if row:
        return row['id']

    query_create = """
       INSERT INTO  rhnArchType
              (id, label, name)
       VALUES (sequence_nextval('rhn_archtype_id_seq'), :label, :name)

    """
    h = rhnSQL.prepare(query_create)
    try:
        h.execute(
            label=label,
            name=name
        )
        rhnSQL.commit()
    except rhnSQL.SQLError:
        e = sys.exc_info()[1]
        # if we're here that means we're voilating something
        raise

    return find_or_create_arch_type(name, label)


def find_or_create_channel_arch(name, label):
    lookup = """
       SELECT id from rhnChannelArch
        WHERE label='%s' AND name = '%s'
    """ % (label, name)
    h = rhnSQL.prepare(lookup)
    h.execute()
    row = h.fetchone_dict()
    if row:
        return row['id']

    query_create = """
       INSERT INTO  rhnChannelArch
              (id, arch_type_id, label, name)
       VALUES (sequence_nextval('rhn_channel_arch_id_seq'), :arch_type_id, :label, :name)

    """
    arch_type_id = find_or_create_arch_type(name=name, label=label)
    h = rhnSQL.prepare(query_create)
    try:
        h.execute(
            arch_type_id=arch_type_id,
            label=label,
            name=name
        )
        rhnSQL.commit()
    except rhnSQL.SQLError:
        e = sys.exc_info()[1]
        # if we're here that means we're voilating something
        raise

    return find_or_create_channel_arch(name, label)


def add_channel(label, org_id, channel_arch_id):
    lookup = """
       SELECT * from rhnChannel
        WHERE label = :label
    """

    h = rhnSQL.prepare(lookup)
    h.execute(label=label)
    row = h.fetchone_dict()

    if row:
        if row['org_id'] != org_id or row['channel_arch_id'] != channel_arch_id:
            delete = "DELETE FROM rhnChannel WHERE id = :id"
            h = rhnSQL.prepare(delete)
            h.execute(id=row['id'])
            rhnSQL.commit()
        else:
            return row

    query_create = """
       INSERT INTO  rhnChannel
              (id, label, org_id, name, channel_arch_id, basedir, summary)
       VALUES (sequence_nextval('rhn_channel_id_seq'), :label, :org_id, :name, :channel_arch_id, :basedir, :summary)

    """

    h = rhnSQL.prepare(query_create)
    try:
        h.execute(
            label=label,
            org_id=org_id,
            name="Name for label %s" % label,
            channel_arch_id=channel_arch_id,
            basedir='basedir',
            summary='summary'
        )
        rhnSQL.commit()

        h = rhnSQL.prepare(lookup)
        h.execute(label=label)
        return h.fetchone_dict()
    except rhnSQL.SQLError:
        e = sys.exc_info()[1]
        # if we're here that means we're voilating something
        raise


def populate_rhn_dist_channel_map(channel_id, channel_arch_id, org_id, release):
    if not release:
        release = 'unit test'

    lookup = """
        SELECT 1 FROM rhnDistChannelMap
            WHERE release = :release AND
                channel_arch_id  = :channel_arch_id AND
                org_id = :org_id
    """

    h = rhnSQL.prepare(lookup)
    h.execute(
        release=release,
        channel_arch_id=channel_arch_id,
        org_id=org_id
    )
    if h.fetchone_dict():
        return

    query_create = """
       INSERT INTO rhnDistChannelMap
              (os, release, channel_arch_id, channel_id, org_id)
       VALUES (:os, :release, :channel_arch_id, :channel_id, :org_id)
    """

    h = rhnSQL.prepare(query_create)
    h.execute(
        os="TestOS",
        release=release,
        channel_arch_id=channel_arch_id,
        channel_id=channel_id,
        org_id=org_id
    )
    rhnSQL.commit()


def add_channel_to_server(channel_id, server_id):
    lookup = """
        SELECT 1 FROM rhnServerChannel
            WHERE server_id = :server_id AND
                  channel_id = :channel_id
    """

    h = rhnSQL.prepare(lookup)
    row = h.execute(server_id=server_id, channel_id=channel_id)
    if row:
        return

    query_create = """
       INSERT INTO rhnServerChannel
              (server_id, channel_id)
       VALUES (:server_id, :channel_id)
    """

    h = rhnSQL.prepare(query_create)
    h.execute(
        channel_id=channel_id,
        server_id=server_id
    )
    rhnSQL.commit()
 07070100000203000081B40000000000000000000000015FBBE8EE0000088F000000000000000000000000000000000000003F00000000spacewalk-backend/server/test/unit-test/rhnSQL/rhnsql-tests.py    #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

"""
Pure unit tests for components of rhnSQL.

NOTE: Not hitting the database here!
"""

import unittest

from spacewalk.server.rhnSQL.driver_postgresql import convert_named_query_params


class RhnSQLTests(unittest.TestCase):

    """ Pure unit tests for components of rhnSQL. """

    def test_convert_named_query_params(self):
        query = "INSERT INTO people(id, name, phone) VALUES(:id, :name, :phone)"
        expected_query = \
            "INSERT INTO people(id, name, phone) VALUES(%(id)s, %(name)s, %(phone)s)"

        new_query = convert_named_query_params(query)
        self.assertEqual(expected_query, new_query)

    def test_convert_named_params_none_required(self):
        query = "SELECT * FROM people"

        new_query = convert_named_query_params(query)
        self.assertEqual(query, new_query)

    def test_convert_named_params_multiple_uses(self):
        query = "INSERT INTO people(a, b, c, d) VALUES(:a, :b, :a, :b)"
        expected_query = \
            "INSERT INTO people(a, b, c, d) VALUES(%(a)s, %(b)s, %(a)s, %(b)s)"

        new_query = convert_named_query_params(query)
        self.assertEqual(expected_query, new_query)

    def test_date_format_conversion_issue(self):
        query = "SELECT TO_CHAR(issued, 'YYYY-MM-DD HH24:MI:SS') issued FROM rhnSatelliteCert WHERE id=:id, name=:name"
        expected_query = "SELECT TO_CHAR(issued, 'YYYY-MM-DD HH24:MI:SS') issued FROM rhnSatelliteCert WHERE id=%(id)s, name=%(name)s"
        new_query = convert_named_query_params(query)
        self.assertEqual(expected_query, new_query)
 07070100000204000081B40000000000000000000000015FBBE8EE00000FCF000000000000000000000000000000000000003900000000spacewalk-backend/server/test/unit-test/rhnSQL/test_1.py  #!/usr/bin/python
# Copyright (c) 2005--2016 Red Hat, Inc.
#
#
#

import os
import string
import unittest
import time
from uyuni.common import usix
from spacewalk.server import rhnSQL

import misc_functions

DB_SETTINGS = misc_functions.db_settings("postgresql")


class Tests1(unittest.TestCase):

    def setUp(self):
        self.table_name = "misatest_%d" % os.getpid()
        rhnSQL.initDB(
            backend="postgresql",
            username=DB_SETTINGS["user"],
            password=DB_SETTINGS["password"],
            database=DB_SETTINGS["database"],
            host=DBSETTINGS["host"]
        )
        self._cleanup()

        rhnSQL.execute("create table %s (id int, val varchar2(10))" %
                       self.table_name)
        rhnSQL.commit()

    def _cleanup(self):
        try:
            rhnSQL.execute("drop table %s" % self.table_name)
        except rhnSQL.SQLStatementPrepareError:
            pass

    def tearDown(self):
        self._cleanup()

        rhnSQL.commit()

    def test_exception_procedure_1(self):
        "Tests exceptions raised by procedure calls"
        p = rhnSQL.Procedure("rhn_channel.subscribe_server")
        self.assertRaises(rhnSQL.SQLError, p, 1000102174, 33)

    def _run_stproc(self):
        p = rhnSQL.Procedure("create_new_org")
        username = password = "unittest-%.3f" % time.time()
        args = (username, password, rhnSQL.types.NUMBER())
        return p(*args), args

    def test_procedure_1(self):
        "Tests procedure calls that return things in their OUT variables"
        ret, args = self._run_stproc()
        self.assertEqual(len(args), len(ret))
        self.assertEqual(args[0], ret[0])
        self.assertEqual(args[1], ret[1])
        self.assertTrue(isinstance(ret[2], usix.FloatType))

    def test_procedure_2(self):
        """Run the same stored procedure twice. This should excerise the
        cursor cache"""
        self.test_procedure_1()
        self.test_procedure_1()

    def test_executemany_1(self):
        """Tests executemany"""
        q = "insert into %s (id, val) values (:id, :val)" % self.table_name
        h = rhnSQL.prepare(q)
        ids = [1, 2, 3] * 100
        vals = [11, 22, 33] * 100
        h.executemany(id=ids, val=vals)

    def test_ddl_1(self):
        """Tests table creation/table removal"""
        table_name = self.table_name + "_1"
        rhnSQL.execute("create table %s (id int)" % table_name)
        tables = self._list_tables()
        self.assertTrue(string.upper(table_name) in tables,
                        "Table %s not created" % table_name)
        rhnSQL.execute("drop table %s" % table_name)

    def test_ddl_2(self):
        """Tests table creation twice"""
        self.test_ddl_1()
        self.test_ddl_1()

    def test_execute_rowcount(self):
        """Tests row counts"""
        table_name = "misatest"
        try:
            tables = self._list_tables()
            if not table_name in tables:
                rhnSQL.execute("create table %s (id int, value int)" % table_name)
            else:
                rhnSQL.execute("delete from %s" % table_name)

            insert_statement = rhnSQL.Statement(
                "insert into %s values (:item_id, :value)" % table_name
            )
            h = rhnSQL.prepare(insert_statement)
            ret = h.execute(item_id=1, value=2)
            self.assertEqual(ret, 1)
            ret = h.execute(item_id=2, value=2)
            self.assertEqual(ret, 1)

            delete_statement = rhnSQL.Statement("delete from %s" % table_name)
            h = rhnSQL.prepare(delete_statement)
            ret = h.execute()
            self.assertEqual(ret, 2)
            rhnSQL.commit()
        finally:
            rhnSQL.execute("drop table %s" % table_name)

    def _list_tables(self):
        h = rhnSQL.prepare("select table_name from user_tables")
        h.execute()
        return [string.upper(x['table_name']) for x in h.fetchall_dict()
                   or []]

if __name__ == '__main__':
    unittest.main()
 07070100000205000081B40000000000000000000000015FBBE8EE000004FD000000000000000000000000000000000000004200000000spacewalk-backend/server/test/unit-test/rhnSQL/test_exceptions.py #!/usr/bin/python
# Copyright (c) 2005--2015 Red Hat, Inc.
#
#
#

import unittest
from spacewalk.common.rhnConfig import CFG, initCFG
from spacewalk.server import rhnSQL

import misc_functions

DB_SETTINGS = misc_functions.db_settings("postgresql")


class ExceptionsTest(unittest.TestCase):

    def test_failed_connection(self):
        # Connect to localhost and look for db on a totally bogus port, this
        # makes the test faster.
        host = "localhost"
        username = "x"
        password = "y"
        database = "z"
        port = 9000

        self.assertRaises(
            rhnSQL.SQLConnectError,
            rhnSQL.initDB,
            "postgresql",
            host,
            port,
            database,
            username,
            password
        )

        try:
            rhnSQL.initDB(
                backend="postgresql",
                username=DB_SETTINGS["user"],
                password=DB_SETTINGS["password"],
                database=DB_SETTINGS["database"],
                host=DB_SETTINGS["host"]
            )
        except:
            self.fail(
                "Exception raised while trying to connect to the db using proper settings. That's not expected to happen.")


if __name__ == '__main__':
    unittest.main()
   07070100000206000081B40000000000000000000000015FBBE8EE0000083D000000000000000000000000000000000000003B00000000spacewalk-backend/server/test/unit-test/rhnSQL/test_lob.py    #!/usr/bin/python
# Copyright (c) 2005--2016 Red Hat, Inc.
#
#
#

import sys
import unittest
from spacewalk.server import rhnSQL

import misc_functions

DB_SETTINGS = misc_functions.db_settings("oracle")


class ExceptionsTest(unittest.TestCase):

    def setUp(self):
        rhnSQL.initDB(
            backend="oracle",
            username=DB_SETTINGS["user"],
            password=DB_SETTINGS["password"],
            database=DB_SETTINGS["database"]
        )
        self._cleanup()

        rhnSQL.execute("create table misatestlob (id int, val blob)")
        rhnSQL.execute("create sequence misatestlob_id_seq")

    def _cleanup(self):
        try:
            rhnSQL.execute("drop table misatestlob")
        except rhnSQL.SQLStatementPrepareError:
            pass

        try:
            rhnSQL.execute("drop sequence misatestlob_id_seq")
        except rhnSQL.SQLStatementPrepareError:
            pass
        except rhnSQL.SQLError:
            e = sys.exc_info()[1]
            if e.args[0] != 2289:
                raise

    def tearDown(self):
        self._cleanup()

        rhnSQL.commit()

#
# TODO: convert to BYTEA 
#    def test_lobs(self):
#        new_id = rhnSQL.Sequence('misatestlob_id_seq').next()
#        h = rhnSQL.prepare("""
#            insert into misatestlob (id, val) values (:id, empty_blob())
#        """)
#        h.execute(id=new_id)
#
#        h = rhnSQL.prepare("""
#            select val from misatestlob where id = :id for update of val
#        """)
#        h.execute(id=new_id)
#        row = h.fetchone_dict()
#        self.assertNotEqual(row, None)
#        lob = row['val']
#        s = ""
#        for i in range(256):
#            s = s + chr(i)
#        lob.write(s)
#        rhnSQL.commit()
#
#        h = rhnSQL.prepare("""
#            select val from misatestlob where id = :id
#        """)
#        h.execute(id=new_id)
#        row = h.fetchone_dict()
#        self.assertNotEqual(row, None)
#        lob = row['val']
#        data = rhnSQL.read_lob(lob)
#        self.assertEqual(data, s)


if __name__ == '__main__':
    unittest.main()
   07070100000207000081B40000000000000000000000015FBBE8EE00000CBC000000000000000000000000000000000000004600000000spacewalk-backend/server/test/unit-test/rhnSQL/test_misc_functions.py #!/usr/bin/python
#
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
#
#

import sys
import unittest
from spacewalk.common.rhnConfig import initCFG
from spacewalk.server import rhnSQL, rhnUser

import misc_functions

DB_SETTINGS = misc_functions.db_settings("postgresql")


class Tests(unittest.TestCase):

    def setUp(self):
        initCFG("server")
        rhnSQL.initDB(
            backend="postgresql",
            username=DB_SETTINGS["user"],
            password=DB_SETTINGS["password"],
            database=DB_SETTINGS["database"],
            host=DB_SETTINGS["host"]
        )

    def tearDown(self):
        # Roll back any unsaved data
        rhnSQL.rollback()

    def test_new_org_1(self):
        org_id = misc_functions.create_new_org()
        h = rhnSQL.prepare("select id from web_customer where id = :id")
        h.execute(id=org_id)
        row = h.fetchone_dict()
        self.assertNotEqual(row, None)
        self.assertEqual(row['id'], org_id)

    def _verify_new_user(self, u):
        uid = u.getid()
        login = u.contact["login"]
        org_id = u.contact["org_id"]

        h = rhnSQL.prepare("select login, org_id from web_contact where id = :id")
        h.execute(id=uid)
        row = h.fetchone_dict()
        self.assertNotEqual(row, None)
        self.assertEqual(row['login'], login)
        self.assertEqual(row['org_id'], org_id)

    def test_new_user_1(self):
        "Create a new user"
        u = misc_functions.create_new_user()
        self._verify_new_user(u)

    def test_new_user_2(self):
        "Create a new user in an existing org"
        org_id = misc_functions.create_new_org()
        u = misc_functions.create_new_user(org_id=org_id)
        self._verify_new_user(u)
        self.assertEqual(org_id, u.contact['org_id'])

    def test_new_users_1(self):
        "Create a bunch of new users in an org"
        org_id = misc_functions.create_new_org()
        for i in range(10):
            u = misc_functions.create_new_user(org_id=org_id)
            self._verify_new_user(u)
            self.assertEqual(org_id, u.contact['org_id'])

    def test_disabled_users_are_listed(self):
        "Create a user, disable it and check if it is listed"
        u = misc_functions.create_new_user()
        self._verify_new_user(u)
        username = u.contact['login']
        uid = u.getid()
        h = rhnSQL.prepare("""
        INSERT INTO rhnwebcontactchangelog
           (id, web_contact_id, change_state_id)
        VALUES
           (5555, :user_id, 2)
        """)
        h.execute(user_id=uid)
        self.assertNotEqual(rhnUser.search(username), None)


if __name__ == '__main__':
    sys.exit(unittest.main() or 0)
07070100000208000081B40000000000000000000000015FBBE8EE00000DE0000000000000000000000000000000000000004800000000spacewalk-backend/server/test/unit-test/rhnSQL/test_rhnActivationKey.py   #!/usr/bin/python
#
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
#
#

import os
import sys
import time
import unittest
from spacewalk.server import rhnSQL

sys.path.insert(
    0,
    os.path.abspath(os.path.dirname(os.path.abspath(__file__) + "/../../../attic/"))
)
import rhnActivationKey

import misc_functions

DB_SETTINGS = misc_functions.db_settings("postgresql")


class Tests(unittest.TestCase):

    def setUp(self):
        rhnSQL.initDB(
            backend="postgresql",
            username=DB_SETTINGS["user"],
            password=DB_SETTINGS["password"],
            database=DB_SETTINGS["database"],
            host=DB_SETTINGS["host"]
        )

    def tearDown(self):
        # Roll back any unsaved data
        rhnSQL.rollback()

    def test_new_activation_key_1(self):
        org_id = misc_functions.create_new_org()
        u = misc_functions.create_new_user(org_id=org_id)

        groups = []
        for i in range(3):
            params = misc_functions.build_server_group_params(org_id=org_id)
            sg = misc_functions.create_server_group(params)
            groups.append(sg.get_id())
        groups.sort()

        channels = ['rhn-tools-rhel-2.1-as-i386',
                    'rhn-tools-rhel-2.1-es-i386', 'rhn-tools-rhel-2.1-ws-i386']
        channels.sort()

        token_user_id = u.getid()
        token_org_id = org_id
        token_entitlement_level = {
            'enterprise_entitled': None,
        }
        token_note = "Test activation key %d" % int(time.time())

        a = misc_functions.create_activation_key(org_id=token_org_id,
                                                 user_id=token_user_id, entitlement_level=token_entitlement_level,
                                                 note=token_note, groups=groups, channels=channels)

        token = a.get_token()

        a = rhnActivationKey.ActivationKey()
        a.load(token)

        self.assertEqual(a.get_user_id(), token_user_id)
        self.assertEqual(a.get_org_id(), token_org_id)
        self.assertEqual(a.get_entitlement_level(), token_entitlement_level)
        self.assertEqual(a.get_note(), token_note)
        g = a.get_server_groups()
        g.sort()
        self.assertEqual(g, groups)

        g = a.get_channels()
        g.sort()
        self.assertEqual(g, channels)

    def test_exception_token_load_1(self):
        a = rhnActivationKey.ActivationKey()
        self.assertRaises(rhnActivationKey.InvalidTokenError, a.load, "a")

    def test_exception_token_channels_1(self):
        a = rhnActivationKey.ActivationKey()
        self.assertRaises(rhnActivationKey.InvalidChannelError, a.set_channels,
                          ["a"])

    def test_exception_token_entitlement_level_1(self):
        a = rhnActivationKey.ActivationKey()
        self.assertRaises(rhnActivationKey.InvalidEntitlementError,
                          a.set_entitlement_level, {'a': None})

if __name__ == '__main__':
    sys.exit(unittest.main() or 0)
07070100000209000081B40000000000000000000000015FBBE8EE000019AF000000000000000000000000000000000000004200000000spacewalk-backend/server/test/unit-test/rhnSQL/test_rhnChannel.py #!/usr/bin/python
#
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
#
#

import sys
import time
import unittest
from spacewalk.server import rhnSQL, rhnChannel

import misc_functions

DB_SETTINGS = misc_functions.db_settings("postgresql")


class Tests(unittest.TestCase):

    def setUp(self):
        rhnSQL.initDB(
            backend="postgresql",
            username=DB_SETTINGS["user"],
            password=DB_SETTINGS["password"],
            database=DB_SETTINGS["database"],
            host=DB_SETTINGS["host"]
        )

    def tearDown(self):
        # Roll back any unsaved data
        rhnSQL.rollback()

    def test_new_channel_1(self):
        """Tests new channel creation"""
        cf = rhnChannel.ChannelFamily()
        cf.load_from_dict(self._new_channel_family_dict())
        cf.save()

        label = cf.get_label()
        vdict = self._new_channel_dict(label=label, channel_family=label)

        c = rhnChannel.Channel()
        for k, v in list(vdict.items()):
            method = getattr(c, "set_" + k)
            method(v)
        c.save()
        channel_id = c.get_id()

        c = rhnChannel.Channel()
        c.load_by_label(label)
        for k, v in list(vdict.items()):
            method = getattr(c, "get_" + k)
            dbv = method()
            self.assertEqual(v, dbv)
        rhnSQL.commit()
        return c

    def test_new_channel_2(self):
        """Tests new channel creation from dictionary"""
        cf = rhnChannel.ChannelFamily()
        cf.load_from_dict(self._new_channel_family_dict())
        cf.save()

        label = cf.get_label()
        vdict = self._new_channel_dict(label=label, channel_family=label)

        c = rhnChannel.Channel()
        c.load_from_dict(vdict)
        c.save()
        channel_id = c.get_id()

        c = rhnChannel.Channel()
        c.load_by_label(label)
        for k, v in list(vdict.items()):
            method = getattr(c, "get_" + k)
            dbv = method()
            self.assertEqual(v, dbv)
        rhnSQL.commit()
        return c

    def test_new_channel_family_1(self):
        """Tests new channel family creation"""
        vdict = self._new_channel_family_dict()
        label = vdict['label']

        c = rhnChannel.ChannelFamily()
        for k, v in list(vdict.items()):
            method = getattr(c, "set_" + k)
            method(v)
        c.save()
        channel_id = c.get_id()

        c = rhnChannel.ChannelFamily()
        c.load_by_label(label)
        for k, v in list(vdict.items()):
            method = getattr(c, "get_" + k)
            dbv = method()
            self.assertEqual(v, dbv)
        rhnSQL.commit()
        return c

    def test_new_channel_family_2(self):
        """Tests new channel family creation from a dict"""
        vdict = self._new_channel_family_dict()
        label = vdict['label']

        c = rhnChannel.ChannelFamily()
        c.load_from_dict(vdict)
        c.save()
        channel_id = c.get_id()

        c = rhnChannel.ChannelFamily()
        c.load_by_label(label)
        for k, v in list(vdict.items()):
            method = getattr(c, "get_" + k)
            dbv = method()
            self.assertEqual(v, dbv)
        rhnSQL.commit()
        return c

    def test_list_channel_families_1(self):
        """Tests rhnChannel.list_channel_families"""
        channel_families = rhnChannel.list_channel_families()
        self.assertTrue(len(channel_families) > 0)

    def test_list_channels_1(self):
        """Tests rhnChannel.list_channels"""

        # create some channel
        cf = rhnChannel.ChannelFamily()
        cf.load_from_dict(self._new_channel_family_dict())
        cf.save()

        label = cf.get_label()
        vdict = self._new_channel_dict(label=label, channel_family=label)

        c = rhnChannel.Channel()
        for k, v in list(vdict.items()):
            method = getattr(c, "set_" + k)
            method(v)
        c.save()

        channels = rhnChannel.list_channels(pattern="rhn-unittest-%")
        self.assertTrue(len(channels) > 0)

    def _new_channel_dict(self, **kwargs):
        if not hasattr(self, '_counter'):
            self._counter = 0

        label = kwargs.get('label')
        if label is None:
            label = 'rhn-unittest-%.3f-%s' % (time.time(), self._counter)
            self._counter = self._counter + 1

        release = kwargs.get('release') or 'release-' + label
        os = kwargs.get('os') or 'Unittest Distro'
        if 'org_id' in kwargs:
            org_id = kwargs['org_id']
        else:
            org_id = misc_functions.create_new_org()

        vdict = {
            'label': label,
            'name': kwargs.get('name') or label,
            'summary': kwargs.get('summary') or label,
            'description': kwargs.get('description') or label,
            'basedir': kwargs.get('basedir') or '/',
            'channel_arch': kwargs.get('channel_arch') or 'channel-x86_64',
            'channel_families': [kwargs.get('channel_family') or label],
            'org_id': org_id,
            'gpg_key_url': kwargs.get('gpg_key_url'),
            'gpg_key_id': kwargs.get('gpg_key_id'),
            'gpg_key_fp': kwargs.get('gpg_key_fp'),
            'end_of_life': kwargs.get('end_of_life'),
            'dists': [{
                'release': release,
                'os': os,
            }],
        }
        return vdict

    def _new_channel_family_dict(self, **kwargs):
        if not hasattr(self, '_counter'):
            self._counter = 0

        label = kwargs.get('label')
        if label is None:
            label = 'rhn-unittest-%.3f-%s' % (time.time(), self._counter)
            self._counter = self._counter + 1

        product_url = kwargs.get('product_url') or 'http://rhn.redhat.com'

        vdict = {
            'label': label,
            'name': kwargs.get('name') or label,
            'product_url': product_url,
        }
        return vdict

if __name__ == '__main__':
    sys.exit(unittest.main() or 0)
 0707010000020A000081B40000000000000000000000015FBBE8EE00000A20000000000000000000000000000000000000004600000000spacewalk-backend/server/test/unit-test/rhnSQL/test_rhnServerGroup.py #!/usr/bin/python
#
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
#
#

import os
import sys
import unittest
from spacewalk.server import rhnSQL

sys.path.insert(
    0,
    os.path.abspath(os.path.dirname(os.path.abspath(__file__) + "/../../../attic/"))
)
import rhnServerGroup

import misc_functions

DB_SETTINGS = misc_functions.db_settings("postgresql")


class Tests(unittest.TestCase):

    def setUp(self):
        rhnSQL.initDB(
            backend="postgresql",
            username=DB_SETTINGS["user"],
            password=DB_SETTINGS["password"],
            database=DB_SETTINGS["database"],
            host=DB_SETTINGS["host"]
        )

    def tearDown(self):
        # Roll back any unsaved data
        rhnSQL.rollback()

    def test_new_org_1(self):
        org_id = misc_functions.create_new_org()
        h = rhnSQL.prepare("select id from web_customer where id = :id")
        h.execute(id=org_id)
        row = h.fetchone_dict()
        self.assertNotEqual(row, None)
        self.assertEqual(row['id'], org_id)

    def test_new_server_group_new_org_1(self):
        org_id = misc_functions.create_new_org()
        params = misc_functions.build_server_group_params(org_id=org_id)

        misc_functions.create_server_group(params)

        s = misc_functions.fetch_server_group(params['org_id'], params['name'])
        self.assertEqual(s.get_name(), params['name'])
        self.assertEqual(s.get_description(), params['description'])

    def test_exception_user_missing_1(self):
        params = misc_functions.build_server_group_params(org_id="no such user")
        self.assertRaises(rhnServerGroup.InvalidUserError,
                          misc_functions.create_server_group, params)

    def test_exception_org_missing_1(self):
        params = misc_functions.build_server_group_params(org_id=-1)
        self.assertRaises(rhnServerGroup.InvalidOrgError,
                          misc_functions.create_server_group, params)


if __name__ == '__main__':
    sys.exit(unittest.main() or 0)
0707010000020B000081B40000000000000000000000015FBBE8EE0000243E000000000000000000000000000000000000004B00000000spacewalk-backend/server/test/unit-test/rhnSQL/test_server_registration.py    #!/usr/bin/python
#
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# Tests verious codepaths for server registration
#

import sys
import time
import unittest
from spacewalk.common import rhnFlags
from spacewalk.common.rhnConfig import initCFG, CFG
from spacewalk.server import rhnSQL, rhnServer, rhnChannel, rhnUser
from spacewalk.server.handlers.xmlrpc import registration

import misc_functions
DB_SETTINGS = misc_functions.db_settings("postgresql")


class Tests(unittest.TestCase):
    _channel = 'redhat-advanced-server-i386'
    _channel_family = 'rhel-as'
    _entitlements = {
        'enterprise_entitled': None
    }

    def setUp(self):
        initCFG("server.xmlrpc")
        rhnSQL.initDB(
            backend="postgresql",
            username=DB_SETTINGS["user"],
            password=DB_SETTINGS["password"],
            database=DB_SETTINGS["database"],
            host=DB_SETTINGS["host"]
        )

    def tearDown(self):
        # Roll back any unsaved data
        rhnSQL.rollback()

    def test_new_server_1(self):
        "Test normal server registration, with username/password"
        u, password = self._create_new_user()
        username = u.contact['login']
        org_id = u.contact['org_id']
        entitlements = self._entitlements
        os_release = "2.1as"

        t = misc_functions.create_activation_key(
            org_id=u.contact['org_id'],
            entitlement_level=entitlements,
            user_id=u.getid(),
            release=os_release
        )

        params = build_new_system_params_with_username(username=username,
                                                       password=password, os_release=os_release)

        system_id = register_new_system(params)
        rhnSQL.commit()

        s = rhnServer.get(system_id)
        self.assertNotEqual(s, None)

        server_id = s.getid()
        channels = rhnChannel.channels_for_server(server_id)
        self.assertEqual(len(channels), 1)
        self.assertEqual(channels[0]['label'], self._channel)

    def test_new_server_token_1(self):
        "test registration with token"
        u, _ = self._create_new_user()
        org_id = u.contact['org_id']
        entitlements = self._entitlements
        os_release = "2.1as"

        t = misc_functions.create_activation_key(
            org_id=u.contact['org_id'],
            entitlement_level=entitlements,
            user_id=u.getid(),
            release=os_release
        )

        token = t.get_token()

        params = build_new_system_params_with_token(
            token=token,
            os_release=os_release
        )

        system_id = register_new_system(params)
        rhnSQL.commit()

        s = rhnServer.get(system_id)
        self.assertNotEqual(s, None)

    def test_new_server_token_2(self):
        "Test registration with token that specifies a base channel"

        # FIXME: the test fails because there's no channel associated with the
        # freshly created Server: rhnServerChannel is not populated by the
        # registration code.

        u, _ = self._create_new_user()
        org_id = u.contact['org_id']
        base_channel = 'rhel-i386-as-3'
        entitlements = self._entitlements
        os_release = "2.1as"

        t = misc_functions.create_activation_key(org_id=u.contact['org_id'],
                                                 entitlement_level=entitlements, user_id=u.getid(),
                                                 channels=[base_channel], release=os_release)

        token = t.get_token()

        params = build_new_system_params_with_token(
            token=token,
            os_release=os_release
        )

        system_id = register_new_system(params)
        rhnSQL.commit()

        s = rhnServer.get(system_id)
        self.assertNotEqual(s, None)

        server_id = s.getid()
        channels = rhnChannel.channels_for_server(server_id)
        self.assertEqual(len(channels), 1)
        self.assertEqual(channels[0]['label'], base_channel)

    def test_new_server_reactivation_token_1(self):
        "Test server re-registration"
        u, password = self._create_new_user()
        username = u.contact['login']
        os_release = "2.1AS"

        params = build_new_system_params_with_username(username=username,
                                                       password=password, os_release="2.1AS")

        system_id = register_new_system(params)
        rhnSQL.commit()

        s1 = rhnServer.get(system_id)
        self.assertNotEqual(s1, None)

        server_id_1 = s1.getid()
        groups1 = misc_functions.fetch_server_groups(server_id_1)

        # Build a re-registration token
        base_channel = 'rhel-i386-as-3'
        entitlements = self._entitlements
        t = misc_functions.create_activation_key(org_id=u.contact['org_id'],
                                                 entitlement_level=entitlements, user_id=u.getid(),
                                                 channels=[base_channel], server_id=server_id_1, release=os_release)

        token = t.get_token()

        params = build_new_system_params_with_token(
            token=token,
            os_release=os_release
        )
        system_id = register_new_system(params)
        rhnSQL.commit()

        s2 = rhnServer.get(system_id)
        server_id_2 = s2.getid()

        groups2 = misc_functions.fetch_server_groups(server_id_2)

        self.assertNotEqual(s2, None)
        self.assertEqual(server_id_1, server_id_2)
        # Should be subscribed to the same groups
        self.assertEqual(groups1, groups2)

    def test_new_server_multiple_tokens_1(self):
        """Test registration with multiple activation tokens
        Resulting server group is the union of all server groups from all
        tokens
        """
        u, _ = self._create_new_user()
        org_id = u.contact['org_id']
        entitlements = self._entitlements
        os_release = "2.1AS"

        t = misc_functions.create_activation_key(org_id=u.contact['org_id'],
                                                 entitlement_level=entitlements, user_id=u.getid(), release=os_release)

        token1 = t.get_token()
        sg1 = t.get_server_groups()

        t = misc_functions.create_activation_key(org_id=u.contact['org_id'],
                                                 entitlement_level=entitlements, user_id=u.getid(), release=os_release)

        token2 = t.get_token()
        sg2 = t.get_server_groups()

        token = token1 + ',' + token2

        params = build_new_system_params_with_token(token=token,
                                                    os_release=os_release)

        system_id = register_new_system(params)
        rhnSQL.commit()

        s = rhnServer.get(system_id)
        self.assertNotEqual(s, None)

        server_id = s.getid()
        sgs = misc_functions.fetch_server_groups(server_id)
        sgstgt = sg1 + sg2
        sgstgt.sort()

        self.assertEqual(sgs, sgstgt)

    def _create_new_user(self):
        # Create new org
        org_id = misc_functions.create_new_org()
        users_unencrypted_password = "unittest-password-%.3f" % time.time()

        # Grant entitlements to the org
        misc_functions.grant_channel_family_entitlements(
            org_id,
            "%s-%.3f" % (self._channel_family, time.time()),
            1
        )

        # Create new user
        u = misc_functions.create_new_user(
            org_id=org_id,
            roles=['org_admin'],
            password=users_unencrypted_password,
            encrypt_password=CFG.encrypted_passwords
        )

        return u, users_unencrypted_password


class Counter:
    _counter = 0

    def value(self):
        val = self._counter
        self._counter = val + 1
        return val


def build_new_system_params_with_username(**kwargs):
    val = Counter().value()
    rnd_string = "%d-%d" % (int(time.time()), val)

    params = {
        'os_release': '9',
        'architecture': 'i686-redhat-linux',
        'profile_name': "unittest server " + rnd_string,
        'username': 'no such user',
        'password': 'no such password',
    }
    params.update(kwargs)
    if 'token' in params:
        del params['token']
    return params


def build_new_system_params_with_token(**kwargs):
    params = {
        'token': kwargs.get('token', "no such token"),
    }
    params.update(build_new_system_params_with_username(**kwargs))
    del params['username']
    del params['password']
    return params


def register_new_system(params):
    rhnFlags.reset()
    return registration.Registration().new_system(params)


if __name__ == '__main__':
    sys.exit(unittest.main() or 0)
  0707010000020C000081B40000000000000000000000015FBBE8EE00000925000000000000000000000000000000000000004000000000spacewalk-backend/server/test/unit-test/rhnSQL/test_suseEula.py   #!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright (c) 2014 SUSE LLC
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#

import hashlib
import unittest
import time
from spacewalk.server import rhnSQL, suseEula
import misc_functions

import os

class SUSEEulaTest(unittest.TestCase):

    def setUp(self):
        misc_functions.setup_db_connection()
        self.__transaction_name = 'eula_test_%d' % (int(time.time()))
        rhnSQL.transaction(self.__transaction_name)

    def tearDown(self):
        # Roll back any unsaved data
        rhnSQL.rollback(self.__transaction_name)

    def test_create_eulas(self):
        text, _ = self.__generate_fake_eula()

        self.assertEqual(0, self.__count_eulas())
        suseEula.find_or_create_eula(text)
        self.assertEqual(1, self.__count_eulas())

        # try creating another EULA with the same text
        suseEula.find_or_create_eula(text)
        self.assertEqual(1, self.__count_eulas())

    def test_get_eula_by_id(self):
        text, _ = self.__generate_fake_eula()

        self.assertEqual(0, self.__count_eulas())
        self.assertEqual(None, suseEula.get_eula_by_id(1))

        eula_id = suseEula.find_or_create_eula(text)
        self.assertEqual(text, suseEula.get_eula_by_id(eula_id))

    def test_get_eula_by_checksum(self):
        text, checksum = self.__generate_fake_eula()

        self.assertEqual(0, self.__count_eulas())
        self.assertEqual(None, suseEula.get_eula_by_checksum('foo'))

        eula_id = suseEula.find_or_create_eula(text)
        self.assertEqual(text, suseEula.get_eula_by_checksum(checksum))

    def __count_eulas(self):
        count_eulas_query = "SELECT COUNT(id) AS eulas from suseEula"
        h = rhnSQL.prepare(count_eulas_query)
        h.execute()
        return h.fetchone_dict()['eulas']

    def __generate_fake_eula(self):
        text     = "Fake EULA %d" % int(time.time())
        checksum = hashlib.new("sha256", text).hexdigest()
        return text, checksum
   0707010000020D000081B40000000000000000000000015FBBE8EE00000964000000000000000000000000000000000000004100000000spacewalk-backend/server/test/unit-test/test_rhnLib_timestamp.py  #!/usr/bin/python
#
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
#
#

import sys
import time
import unittest
from uyuni.common import rhnLib


class Tests(unittest.TestCase):

    def _test_timestamp_1(self):
        # Start with some timestamp, and verify that
        # timestamp(strftime(t)) is # t
        t = 85345
        increment = 123456
        while t < time.time() + increment:
            is_eq, t1, tstr, t2 = self._test(t)
            #self.assertEqual(t, t2, "%s %s %s %s" % (t, t2, ttuple, tstr))
            if not is_eq:
                print(("%s %s %s" % (t1, t2, tstr)))
            t = t + increment

    def _str(self, t):
        tformat = "%Y-%m-%d %H:%M:%S"
        ttuple = time.localtime(t)
        return time.strftime(tformat, ttuple)

    def _test(self, t, dstshift=0):
        t = int(t)
        tstr = self._str(t)
        t2 = int(rhnLib.timestamp(tstr))
        return (t + dstshift == t2), t, tstr, t2

    def _test_timestamp_2(self):
        y = 1969
        while y < 2015:
            y = y + 1
            # Guess that year's time switch
            tlist = [y, 10, 31, 1, 41, 37, 0, 0, -1]
            t = time.mktime(tlist)
            tlist = list(time.localtime(t))
            # Last Sat of October
            tlist[2] = tlist[2] - (1 + tlist[6]) % 7
            t = int(time.mktime(tlist))

            is_eq, t1, tstr, t2 = self._test(t)
            if not is_eq:
                print(("%s %s %s" % (t, t2, tstr)))

    def test_timestamp_3(self):
        t = 57739297
        dstshift = (time.localtime(t)[8] - time.daylight) * 3600
        is_eq, t1, tstr, t2 = self._test(t, dstshift)
        self.assertTrue(is_eq, "Failed: %s, %s" % (t1, t2))

    def _test_timestamp_4(self):
        return self.test_timestamp_3()

if __name__ == '__main__':
    sys.exit(unittest.main() or 0)
0707010000020E000081B40000000000000000000000015FBBE8EE00012CC0000000000000000000000000000000000000002C00000000spacewalk-backend/spacewalk-backend.changes   -------------------------------------------------------------------
Mon Nov 23 17:50:59 CET 2020 - jgonzalez@suse.com

- version 4.1.18-1
- Fix missing 'LiteServer.add_suse_products' method (bsc#1178704)

-------------------------------------------------------------------
Mon Nov 23 15:11:42 CET 2020 - jgonzalez@suse.com

- version 4.1.17-1
- Do not raise TypeError when processing SUSE products (bsc#1178704)
- Fix spacewalk-repo-sync to successfully manage and sync ULN repositories
- fix errors in spacewalk-debug and align postgresql queries to new DB version
- ISS: Differentiate packages with same nevra but different checksum in the same channel (bsc#1178195)
- Re-enables possibility to use local repos with repo-sync (bsc#1175607)
- add 'allow_vendor_change' option to rhn clients for dist upgrades

-------------------------------------------------------------------
Thu Oct 22 10:43:27 CEST 2020 - jgonzalez@suse.com

- version 4.1.16-1
- prevent IntegrityError during mgr-inter-sync execution (bsc#1177235)

-------------------------------------------------------------------
Tue Sep 15 10:36:45 CEST 2020 - jgonzalez@suse.com

- version 4.1.15-1
- Fix strings (mentions of Satellite, replace SUSE Manager with PRODUCT_NAME, etc)
- Only regenerate bootstrap repositories when linking new packages (bsc#1174636)
- support installer_updates flag in ISS
- Remove duplicate languages and update translation strings

-------------------------------------------------------------------
Thu Aug 20 13:40:31 CEST 2020 - jgonzalez@suse.com

- version 4.1.14-1
- Take care of SCC auth tokens on DEB repos GPG checks (bsc#1175485)

-------------------------------------------------------------------
Thu Aug 20 10:51:09 CEST 2020 - jgonzalez@suse.com

- version 4.1.13-1
- Use spacewalk keyring for GPG checks on DEB repos (bsc#1175485)

-------------------------------------------------------------------
Thu Jul 23 13:25:13 CEST 2020 - jgonzalez@suse.com

- version 4.1.12-1
- Adds basic functionality for gpg check

-------------------------------------------------------------------
Mon Jun 29 10:06:58 CEST 2020 - jgonzalez@suse.com

- version 4.1.11-1
- make media.1/products available for every channel. Needed for
  autoinstallation of SLE15 SP2 (bsc#1173204)

-------------------------------------------------------------------
Tue Jun 23 17:20:14 CEST 2020 - jgonzalez@suse.com

- version 4.1.10-1
- Only check strongest available Ubuntu/Debian repository index checksum
- Verify GPG signature of Ubuntu/Debian repository metadata (Release file)

-------------------------------------------------------------------
Wed Jun 10 12:14:57 CEST 2020 - jgonzalez@suse.com

- version 4.1.9-1
- Allow spacewalk-repo-sync to sync empty DEB repositories.
- supportconfig speedup fixes, add option to not compress spacewalk-debug output dir
- Prevent failure when syncing from RHEL CDN due extra params (bsc#1171885)
- Ubuntu repos sync uses http proxy (bsc#1168845)

-------------------------------------------------------------------
Wed May 20 10:53:18 CEST 2020 - jgonzalez@suse.com

- version 4.1.8-1
- reposync speedup fixes, which require psycopg2 to be at least version 2.8.4
- use default sender address from web namespace
- Enable extra HTTP headers support for "spacewalk-repo-sync".
- Add missing Zypper plugin to deal with ULN repositories.

-------------------------------------------------------------------
Mon Apr 13 09:32:22 CEST 2020 - jgonzalez@suse.com

- version 4.1.7-1
- validate cached package entries on ISS slave (bsc#1159184)
- restore config namespace in debian repo module to fix
  autogeneration of bootstrap repos
- send CreateBootstrapRepoFailed Notification

-------------------------------------------------------------------
Thu Mar 19 12:07:22 CET 2020 - jgonzalez@suse.com

- version 4.1.6-1
- Read MODULARITYLABEL tag from RPM packages

-------------------------------------------------------------------
Wed Mar 11 10:49:22 CET 2020 - jgonzalez@suse.com

- version 4.1.5-1
- Add Ubuntu repository checksum index checking for flat and default repository formats
- Always use the same RPM database when running "spacewalk-repo-sync"
  from the command line or via taskomatic (bsc#1163468)
- call mgr-create-bootstrap-repo after repo sync
- fix mgrcfg-client python3 breakage (bsc#1164309
- Remove oracle backend support and tests
- remove code to handle tables used for forwarding registrations
  to NCC.

-------------------------------------------------------------------
Mon Feb 17 12:47:56 CET 2020 - jgonzalez@suse.com

- version 4.1.4-1
- Remove auditlog-keeper
- update doc link to point to new documentation server

-------------------------------------------------------------------
Thu Jan 30 14:48:13 CET 2020 - jgonzalez@suse.com

- version 4.1.3-1
- Prevent timestamp format exception on mgr-inter-sync while processing comps (bsc#1157346)

-------------------------------------------------------------------
Wed Jan 22 12:10:51 CET 2020 - jgonzalez@suse.com

- version 4.1.2-1
- When downloading repo metadata, don't add "/" to the repo url if it already ends with one (bsc#1158899)
- Use HTTP proxy settings when fetching the mirrorlist on spacewalk-repo-sync (bsc#1159076)
- enhance suseProducts via ISS to fix SP migration on slave server (bsc#1159184)
- generate metadata with empty vendor (bsc#1158480)
- prevent a traceback when reposyncing openSUSE 15.1 (bsc#1158672)
- close config files after reading them (bsc#1158283)
- Associate VMs and systems with the same machine ID at bootstrap (bsc#1144176)

-------------------------------------------------------------------
Wed Nov 27 16:58:20 CET 2019 - jgonzalez@suse.com

- version 4.1.1-1
- Revert fixes systems that do not yet use systemd as spacewalk-backend
  is no more part of client tools (replaced by uyuni-base)
- convert spacewalk-backend to a python3 only package
- fix spacewalk-update-signatures for python3 (bsc#1156521)
- port diskcheck utility to 4.0.3 branch (bsc#1156397)
- add systemd service macros for diskcheck.service
- removed spacewalk-backend-libs subpackage; replaces by uyuni-common-libs
- read LOBs explicitly
- Bump version to 4.1.0 (bsc#1154940)
- Improve error message when deleting channel that's in a content lifecycle project (bsc#1145769)
- fix specfile for systems that do not yet use systemd
- fix problems with Package Hub repos having multiple rpms with same NEVRA
  but different checksums (bsc#1146683)
- fix re-registration with re-activation key (bsc#1154275)
- Change the default value of taskomatic maxmemory to 4GB
- Add basic support for importing modular repositories
- Add script to update additional fields in the DB for existing Deb packages
- use active values for diskchecker mails
- parse restart_suggested flag from patches and set it as keywords (bsc#1151467)
- Import additional fields for Deb packages
- do not require parameters to start on column 1
- Add Requires: systemd for completeness
- create /usr/lib/systemd/systemd during build
- BuildRequires: systemd for spacewalk-diskcheck
- add option spacecheck_shutdown; tidy up wording of notifications
- add disk space checker script
- Prevent "reposync" crash when handling metadata on RPM repos (bsc#1138358)
- Do not show expected WARNING messages from "c_rehash"
- fix misspelling in spacewalk-repo-sync (bsc#1149633)
- remove credentials also from potential rhn.conf backup files in spacewalk-debug (bsc#1146419)
- Do not crash 'rhn-satellite-exporter' with ModuleNotFound error (bsc#1146869)
- Don't skip Deb package tags on package import (bsc#1130040)
- For backend-libs subpackages, exclude files for the server
  (already part of spacewalk-backend) to avoid conflicts (bsc#1148125)
- prevent duplicate key violates on repo-sync with long changelog
  entries (bsc#1144889)
- spacewalk-remove-channel check that channel doesn't have cloned channels before deleting it (bsc#1138454)
- Fix broken spacewalk-data-fsck utility (bsc#1131556)
- /etc/rhn also was packaged for spacewalk-backend-tools
- Add '--latest' support for reposync on DEB based repositories
- Require uyuni-base-common for /etc/rhn
- Do not try to download RPMs from the unresolved mirrorlist URL
- Fix encoding issues with DB bytes values (bsc#1144300)
- Avoid traceback on mgr-inter-sync when there are problems
  with cache of packages (bsc#1143016)
- do not overwrite comps and module data with older versions
- fix issue with "dists" keyword in url hostname
- import packages from all collections of a patch not just first one

-------------------------------------------------------------------
Thu Aug 01 12:43:45 CEST 2019 - jgonzalez@suse.com

- version 4.0.19-1
- Fix import of rhnAuthPAM to avoid issues when using rhnpush.

-------------------------------------------------------------------
Wed Jul 31 17:30:57 CEST 2019 - jgonzalez@suse.com

- version 4.0.18-1
- Ensure bytes type when using hashlib to avoid traceback
  on XMLRPC call to "registration.register_osad" (bsc#1138822)
- Fix for CVE-2019-10136. An attacker with a valid, but expired,
  authenticated set of headers could move some digits around,
  artificially extending the session validity without modifying
  the checksum. (bsc#1136480)
- Do not duplicate "http://" protocol when using proxies with "deb"
  repositories (bsc#1138313)
- Fix reposync when dealing with RedHat CDN (bsc#1138358)
- Prevent FileNotFoundError: repomd.xml.key traceback (bsc#1137940)
- Add journalctl output to spacewalk-debug tarballs
- Prevent unnecessary triggering of channel-repodata tasks when GPG
  signing is disabled (bsc#1137715)
- Fix spacewalk-repo-sync for Ubuntu repositories in mirror case (bsc#1136029)
- Add support for ULN repositories on new Zypper based reposync.

-------------------------------------------------------------------
Wed May 15 17:06:26 CEST 2019 - jgonzalez@suse.com

- version 4.0.17-1
- use new names in code for client tool packages which were renamed (bsc#1134876)

-------------------------------------------------------------------
Wed May 15 15:07:45 CEST 2019 - jgonzalez@suse.com

- version 4.0.16-1
- SPEC cleanup
- Fix password prompt within mgr-sign-metadata
- Fix TypeError for 'errata.getErrataInfo' XMLRPC handler (bsc#1132346)
- fix typo in syncing product extensions (bsc#1118492)
- Fix mgr-sign-metadata-ctl checking of exported keys.

-------------------------------------------------------------------
Thu Apr 25 18:00:41 CEST 2019 - jgonzalez@suse.com

- version 4.0.15-1
- Use suseLib.get_proxy to get the HTTP proxy configuration 
  properly on DEB repos (bsc#1133424)

-------------------------------------------------------------------
Mon Apr 22 12:07:39 CEST 2019 - jgonzalez@suse.com

- version 4.0.14-1
- Add support for mirrorlist and metalink on Zypper reposync.
- Solve situations where synced packages have epoch 0 but reposync
  does not find them them on the database.
- Fix path to the RPM database used by Zypper at reposync.
- add makefile for python linter and unit/integration tests

-------------------------------------------------------------------
Mon Apr 08 10:26:33 CEST 2019 - jgonzalez@suse.com

- version 4.0.13-1
- fix linking of packages in reposync (bsc#1131677)

-------------------------------------------------------------------
Fri Mar 29 10:29:46 CET 2019 - jgonzalez@suse.com

- version 4.0.12-1
- Include arch to distinct latest packages on reposync.
- Migrate missing spacewalk-cfg-get script to Python3
- Improve dependency solving algorithm for spacewalk-repo-sync.

-------------------------------------------------------------------
Mon Mar 25 16:41:48 CET 2019 - jgonzalez@suse.com

- version 4.0.11-1
- remove apache access_compat module and adapt config files
- Add support for getting latest versions from RPM packages
  when running "spacewalk-repo-sync" after migration to Zypper.
- Include packages dependencies on "spacewalk-repo-sync" when using filters
  for RPM packages.
- Allow package filtering (name matching) on spacewalk-repo-sync after
  migrating away from yum.
- Fix crash when importing new channel families on 'mgr-inter-sync' (bsc#1129300)
- Make Zypper to use the spacewalk GPG keyring in reposync (bsc#1128529)
- Fix: handle non-standard filenames for comps.xml (bsc#1120242)
- Make reposync use and append token correctly to the URL
- Avoid DB constraint violations caused by extended UTF8 characters on the RPM headers
- Prevent mgr-inter-sync crash because 'SuseProductRepository' not found (bsc#1129300)
- Fix invalid mode error when doing spacewalk-repo-sync on Ubuntu
  official repos.

-------------------------------------------------------------------
Tue Mar 12 11:20:08 CET 2019 - jgonzalez@suse.com

- version 4.0.10-1
- Make sure the package download url does not have '//' (bsc#1127488)
- Fix bootstrapping SLE15 traditional client (bsc#1128564)

-------------------------------------------------------------------
Mon Mar 04 09:54:01 CET 2019 - jgonzalez@suse.com

- version 4.0.9-1
- fix reading LOB objects with python3

-------------------------------------------------------------------
Sat Mar 02 00:09:45 CET 2019 - jgonzalez@suse.com

- version 4.0.8-1
- Fix "mgr-inter-sync" problems after Python 3 migration.
- mgr-sign-metadata can optionally clear-sign metadata files
- Added 'mgr-sign-metadata-ctl' for repository metadata signing

-------------------------------------------------------------------
Wed Feb 27 12:59:35 CET 2019 - jgonzalez@suse.com

- version 4.0.7-1
- Allow errata import from local repositories.
- Fix "rhnpush" after migration to Python 3.
- Fix package import issues when package encoding is ISO8859-1.
- Fix issues with HTTP proxy and reposync.
- Solve Python 3 problem and allow traditional registration.

-------------------------------------------------------------------
Fri Feb 08 17:38:16 CET 2019 - jgonzalez@suse.com

- version 4.0.6-1
- Add "python-urlgrabber" as a new dependency.
- Fix Python3 issues on satellite_tools scripts

-------------------------------------------------------------------
Thu Jan 31 09:40:56 CET 2019 - jgonzalez@suse.com

- version 4.0.5-1
- Use "Zypper" and "libsolv" in "spacewalk-repo-sync". Replace "yum".
- Require the correct dependency for python-rpm to allow the Proxy
  to work with Python3 only
- Make rhn-ssl-dbstore compatible with python3

-------------------------------------------------------------------
Wed Jan 16 12:21:06 CET 2019 - jgonzalez@suse.com

- version 4.0.4-1
- Take only text files from /srv/salt to make spacewalk-debug smaller (bsc#1103388)
- move channel update close to commit to avoid long lock (bsc#1121424)
- Adapt Inter Server Sync code to new SCC sync backend

-------------------------------------------------------------------
Mon Dec 17 14:34:38 CET 2018 - jgonzalez@suse.com

- version 4.0.3-1
- Fix issue raising exceptions 'with_traceback' on Python 2
- Hide Python traceback and show only error message (bsc#1110427)
- honor renamed postgresql10 log directory for supportconfig

-------------------------------------------------------------------
Fri Oct 26 10:06:41 CEST 2018 - jgonzalez@suse.com

- version 4.0.2-1
- support mirroring of source packages
- Make spacewalk-backend code compatible with Python 3
- Channels to be actually un-subscribed from the assigned systems when being removed
  using spacewalk-remove-channel tool(bsc#1104120)
- Prepare spacewalk-backend packages to build on Python 3
- Replace PyPAM with python-python-pam

-------------------------------------------------------------------
Fri Aug 10 15:13:14 CEST 2018 - jgonzalez@suse.com

- version 4.0.1-1
- Bump version to 4.0.0 (bsc#1104034)
- Fix copyright for the package specfile (bsc#1103696)
- fix directory permissions (bsc#1101152)
- Feature: implement optional signing repository metadata
- Fix truncated result message of server actions (bsc#1039043)
- Do not copy 'foreign_entitlement' from virtual host to the
  registered guest (bsc#1093381) 
- Disable Oracle support for openSUSE (bsc#1095804)

-------------------------------------------------------------------
Tue Jun 05 10:03:59 CEST 2018 - jgonzalez@suse.com

- version 2.8.57.5-1
- spacewalk-debug: add Postgres configuration files
- Initial branding change for Uyuni (bsc#1094497)

-------------------------------------------------------------------
Wed May 16 17:20:45 CEST 2018 - jgonzalez@suse.com

- version 2.8.57.4-1
- Bugfix: do not fail boostrap if no ip6addr interface (bsc#1090395)
- allow again to use a higher version of spacewalk-backend-libs
  with spacewalk-backend (bsc#1092383)

-------------------------------------------------------------------
Mon May 07 14:59:31 CEST 2018 - jgonzalez@suse.com

- version 2.8.57.3-1
- Sync with upstream (bsc#1083294)

-------------------------------------------------------------------
Mon Apr 23 09:00:29 CEST 2018 - jgonzalez@suse.com

- version 2.8.57.2-1
- Fix encoding for RPM package group in reposync (bsc#1083001)
- Sync with upstream (bsc#1083294)
- 1567157 - remove 'www' part from cve.mitre.org domain name
- 1198723 - rhnRepository.py: add support for Debian / Ubuntu Release files
- 1549546 - Allow spacewalk-channel to add parent channel

-------------------------------------------------------------------
Wed Apr 04 12:09:11 CEST 2018 - jgonzalez@suse.com

- version 2.8.56.3-1
- Temporary revert bsc#1083001

-------------------------------------------------------------------
Thu Mar 29 01:22:02 CEST 2018 - jgonzalez@suse.com

- version 2.8.56.2-1
- SLE15 support: recommended/required flag for products and
  channels (bsc#1087373)

-------------------------------------------------------------------
Mon Mar 26 08:46:00 CEST 2018 - jgonzalez@suse.com

- version 2.8.56.1-1
- Sync with upstream (bsc#1083294)
- Updating .po translations from Zanata
- Fixing incorrect syntax of format string
- Fixing newline error in translation

-------------------------------------------------------------------
Mon Mar 05 09:17:05 CET 2018 - jgonzalez@suse.com

- version 2.8.52.1-1
- 1550001 - KeyError: 'severity' caught when exporting channel with rhn-satellite-exporter
- 1534417 - sanitize pwds in backup files and http-proxy-pwds as well
- remove empty clean section from spec (bsc#1083294)

-------------------------------------------------------------------
Fri Feb 23 10:52:03 CET 2018 - jgonzalez@suse.com

- version 2.8.48.1-1
- 1540981 - Clarify error-reporting when checksum_cache is bad
- 1537098 - Teach packageImport to ignore flags RPM doesn't know
- add --no-packages option to spacewalk-repo-sync
- use --force-all-errata only to re-sync patches
  --deep-verify still used for package checksum check and single
  errata import (bsc#1077244)

-------------------------------------------------------------------
Mon Feb 05 12:46:38 CET 2018 - jgonzalez@suse.com

- version 2.8.41.3-1
- use GTM for rpm build_time (bsc#1078056)

-------------------------------------------------------------------
Fri Feb 02 12:00:22 CET 2018 - jgonzalez@suse.com

- version 2.8.41.2-1
- fix spacewalk-data-fsck restore of broken package db entry (bsc#1071526)
- support multiple FQDNs per system (bsc#1063419)

-------------------------------------------------------------------
Wed Jan 17 11:51:01 CET 2018 - jgonzalez@suse.com

- version 2.8.37.1-1
- fix issues with syncing deb repos (bsc#1050433)
- honor MAX_LOG_AGE for (renamed) cobbler/tasks logs file
  in spacewalk-debug (bsc#1025201)
- add hostname to duplicate machine_id email (bsc#1055292)
- fix link to manual and the described procedure
- don't crash when token is set to 'fake' (bsc#1060022)
- when searching for not installed products exclude release packages
  which are provided by others (bsc#1067509)
- search for product packages when installed packages are available
  (bsc#1060182)
- rhnServerNetwork refactoring (bsc#1063419)
- Fix: restore hostname and ip*addr in templated documents (bsc#1075044)
- fix directory name in spacewalk-data-fsck
- search for product packages when installed packages are available
  (bsc#1060182)
- rhnServerNetwork refactoring (bsc#1063419)

-------------------------------------------------------------------
Fri Nov 10 16:30:32 CET 2017 - mc@suse.de

- version 2.8.27.1-1
- Change the virtualization backend not to duplicate data in case
  host and guests are in different organizations
- fix joining strings
- yum ContentSource() should set number of packages during raw listing.
- convert release to long while checking which is older or newer
- Do not import ignored errata
- process comps file before package import
- yum on RHEL6 has no idea about environments
- make rhn_rpm python3 compatible
- open checksummed files in binary mode
- mention package groups in help
- detect and parse package groups in filters
- add new spacewalk-repo-sync command line option to synopsis of man-page
- add new parameter '--show-packages' for spacewalk-repo-sync.

-------------------------------------------------------------------
Thu Oct 26 17:12:49 CEST 2017 - mc@suse.de

- version 2.8.15.1-1
- build python3 subpackage for -libs package
- fix issues with syncing deb repos (bsc#1050433)
- honor MAX_LOG_AGE for (renamed) cobbler/tasks logs file
  in spacewalk-debug (bsc#1025201)
- add hostname to duplicate machine_id email (bsc#1055292)
- fix link to manual and the described procedure
- don't crash when token is set to 'fake' (bsc#1060022)
- when searching for not installed products exclude release packages
  which are provided by others (bsc#1067509)

-------------------------------------------------------------------
Thu Sep 14 11:40:39 CEST 2017 - mc@suse.de

- version 2.7.73.9-1
- Fix SP migration for traditional clients which were registered
  by a currently disabled user (bsc#1057126)

-------------------------------------------------------------------
Wed Aug 30 16:03:25 CEST 2017 - mc@suse.de

- version 2.7.73.8-1
- increase rpclib timeout to 10 minutes (bsc#1026930)

-------------------------------------------------------------------
Wed Aug 09 12:11:50 CEST 2017 - fkobzik@suse.de

- version 2.7.73.7-1
- disable pylint check during build also for RHEL7

-------------------------------------------------------------------
Tue Aug 08 11:07:41 CEST 2017 - fkobzik@suse.de

- version 2.7.73.6-1
- make master_label static to keep its value when retrying (bsc#1038321)
- adapt for the new gpgcheck flag for the channels

-------------------------------------------------------------------
Mon Jun 12 09:11:59 CEST 2017 - mc@suse.de

- version 2.7.73.5-1
- Removing conflicting epoch fix (bsc#1042861)
- remove not implemented option --force-all-packages (bsc#1040194)
- fix parsing oscap results - not every Rule has an
  XCCDF ID Tag (bsc#1041992)

-------------------------------------------------------------------
Mon May 29 16:08:58 CEST 2017 - mc@suse.de

- version 2.7.73.4-1
- move to different file to not conflict with web.default_mail_from
  in Java code
- don't trim channel content if there is major sync error in any
  repository
- disable pylint on Fedora 26 because it's python3
- rhn-charsets is meant to be run only under root user
- hashlib is included in python since RHEL6
- Unable to run cdn-sync if older channels do not exist anymore

-------------------------------------------------------------------
Tue May 23 08:55:07 CEST 2017 - mc@suse.de

- version 2.7.73.3-1
- add missing bugnumber to changelog

-------------------------------------------------------------------
Tue May 23 07:51:37 CEST 2017 - mc@suse.de

- version 2.7.73.2-1
- don't let disabled user log in
- updating help and man page
- satellite-sync (iss) - enhancements to channel selection
- make batch size configurable
- wildcard support for channel names
- optimize linking packages to channel
- disassociate packages later or keep them in channel if
  they are same but missing package path
- Rename incomplete_package_import to package_import_skip_changelog
- spacewalk-backend should require the exact version of spacewalk-backend-libs
  (bsc#1037635)
- try to finish work in threads when KeyboardInterrupt occurs during
  download
- fix errata lookup for NULL org
- optimize package importing during syncing a software channel
- allow sync of the same erratum to more orgs

-------------------------------------------------------------------
Thu May  4 10:23:23 UTC 2017 - can.bulut.bayburt@suse.com

-  Non admin or disabled user cannot make changes to a system anymore
   using spacewalk-channel (CVE-2017-7470) (bsc#1026633)

-------------------------------------------------------------------
Wed May 03 16:56:32 CEST 2017 - michele.bologna@suse.com

- version 2.7.73.1-1
- Repository sync can causes ORA-01878 on insertion of timestamp that
  doesn't exist in timezone - fix python 2.4 build
- do not store SSL certificates per repository on disk cache
- Prevent ORA-01878 on repository sync.
- default_mail_from key exists but may be empty
- (bsc#1024923) fixed a typo in SQL statement

-------------------------------------------------------------------
Mon Apr 03 14:51:38 CEST 2017 - mc@suse.de

- version 2.7.65.1-1
- update man page
- adding Candlepin API to call manifest refresh
- call Candlepin API to download manifests and implement missing
  pieces of code
- adding handler for calling Candlepin API requests with export
  manifest support

-------------------------------------------------------------------
Fri Mar 31 10:01:31 CEST 2017 - mc@suse.de

- version 2.7.63.1-1
- create scap files dir beforehand (bsc#1029755)
- do not fail with traceback when media.1 does not exist (bsc#1032256)
- adapt new proxy setting
- python3 compatibility changes
- filter channels to removed by patern with '*' - e.g. 'fedora19*'
  interrupt downloading
- if package was not downloaded and message-less Exception catched,
  don't print empty line and don't print to stream on default verbose setting
- show list of non-available channels at the beginning of syncing
- ignore channels which are not exist or not available
- show error message if we cannot download repomd.xml during counting
  packages
- fix http proxy configuration for yum_src
- fix package downloading for Kickstart addons. Add parsing repodata
  for addons repository and download all packages according to its location.
- fix reading repo certificates (bsc#1029022)
- fixing 'WARNING:  there is already a transaction in progress' in
  postgresql logs
- cleanup orphaned repositories not attached to any channel
- ContentSourceImport can't unlink last associated repository, do it
  differently
- break mappings dependency on spacewalk
- list custom CDN channels and sorting repositories
- make sure content is in null org, not in custom org
- filter channels with lost entitlement and include custom repos with
  null content source assigned
- Move aa-spacewalk-server.conf to backend from server
- do not package common/__init__ to prevent file conflicts with spacewalk-usix
- incomplete_package_import: do import rhnPackageFile as it breaks some package
  installations

-------------------------------------------------------------------
Tue Mar 07 15:04:25 CET 2017 - mc@suse.de

- version 2.7.50.1-1
- Don't skip 'rhnErrataPackage' cleanup during an errata update (bsc#1023233)
- set scap store dir mod to 775 and group owner to susemanager
- fix errata sync
- provide option for forcibly syncing all errata, similarly as in
  satsync
- do not import always all errata by default for performance reasons
- don't re-insert existing files again
- Updated links to github in spec files
- sync RPM packages for addons in Kickstart Tree
- Add support for running spacewalk-debug without creating reports.
  (bsc#1024714)
- install product packages during traditional registration
- Fix selection of primary interface
- trigger repodata generation after and only if channel packages are
  updated
- do not re-subscribe packages to channel if nothing was added
- Remove legacy audit logging Python code
- Add strict-httpd-workaround *FIRST* in httpd conf files
- Postgresql 9.6 support
- fixing 'ERROR: expected a readable buffer object' on Oracle
- catch exception InvalidArchError and send back an error message
- require spacewalk-usix indead of spacewalk-backend-usix
- support importing KS files with other checksum type than md5
- adding more details of current SSL certificates in DB
- support creating repository tree with only repos provided by single
  client certificate
- catch on higher level to not mark missing repositories as found
  repositories with no SSL certificates
- check SSL dates in reposync

-------------------------------------------------------------------
Tue Feb 07 17:48:48 CET 2017 - michele.bologna@suse.com

- version 2.7.28.1-1
- Align with upstream versioning

-------------------------------------------------------------------
Wed Jan 11 15:49:50 CET 2017 - michele.bologna@suse.com

- version 2.7.18.1-1
- Version 2.7.18-1

-------------------------------------------------------------------
Fri Dec 16 12:10:26 CET 2016 - michele.bologna@suse.com

- version 2.5.24.7-1
- Handle non-unique machine_id after migrate from 2.1 (bsc#1013002)
- Refer to scc.suse.com instead of bugzilla.novell.com in case of problem
  (bsc#967818)
- Fix: selection of primary interface bsc#1009677
- spacewalk-backend.spec: add link to SUSE name of program (bsc#1009435)
- Reposync - assign orphaned vendor packages to the default org (bsc#995764)

-------------------------------------------------------------------
Thu Oct 06 16:09:07 CEST 2016 - mc@suse.de

- version 2.5.24.6-1
- Fix for non-integer IDs for bugzilla bug
- silently ignore non-existing errata severity label on errata import,
  remove non-used exception (bsc#986447, bsc#996609)
- make suseLib usable on a proxy

-------------------------------------------------------------------
Mon Jul 18 13:55:56 CEST 2016 - jrenner@suse.com

- version 2.5.24.5-1
- copy the subscription-matcher directory instead of the content
- machine_info capability and check for client tool compatibility with Suma 2.1
- modify test setup for oracle DB

-------------------------------------------------------------------
Tue Jun 14 12:45:36 UTC 2016 - kwalter@suse.com

- add machine info capability

-------------------------------------------------------------------
Tue May 24 15:08:01 CEST 2016 - kwalter@suse.com

- version 2.5.24.4-1
- spacewalk-repo-sync - Improved date handling (bsc#975161)
- better error message for system that is already registered as minion
- Only trigger virtualization notification on server save when the
  virtualization data is not falsy (bsc#975120)
- fix GPG bad signature detection and improve error messages (bsc#979313)
- send and save machine_id on traditional registration
- vendor channels may have no repo assigned (bsc#977781)
- do not crash now that multiple urls are passed (bnc#970951)

-------------------------------------------------------------------
Wed Apr 06 08:40:42 CEST 2016 - mc@suse.de

- version 2.5.24.3-1
- Include the Matcher data directory in supportconfig
- qemu-kvm guests created on my Fedora 22 have different signature
- fix SLE12 patch style detection in case of cloned patches (bsc#972972)
- Grab the entire pillar structure at once
- trigger regeneration of metadata on product or keyword changes (bsc#972096)
- Find all user configured places of the custom pillars and get an info about
  them
- Rename static Salt states directory
- Gather also static pillars
- Add missing title about custom Salt states
- Check if directory exists at all prior checking its content
- Copy all Salt state files and generated pillars
- Copy all Salt Master configuration

-------------------------------------------------------------------
Mon Mar 21 17:48:47 CET 2016 - mc@suse.de

- version 2.5.24.2-1
- Fix rhnreg_ks doesn't work with activation key
- update checksumtype after setting the SSL values (bsc#970824)

-------------------------------------------------------------------
Wed Mar 09 10:47:12 CET 2016 - mc@suse.de

- version 2.5.24.1-1
- include salt master config files into spacewalk-debug
- we need to import either cx_Oracle or psycopg2
- better never import foreign private channel families, custom
  channels will be synced into your org anyway
- org_id of channel family is probably never filled, just not make
  private channel families public
- all strings should be truncated, not only unicode instances

-------------------------------------------------------------------
Wed Mar 02 12:16:58 CET 2016 - mc@suse.de

- version 2.5.22.1-1
- make sure truncated value does not contain incomplete characters
- allow sat-sync-error-email to be configurable
- Remove custom latest RPM handling in spacewalk-repo-sync and use
  the same logic as reposync from yum-utils instead.
- honor no_proxy variable in InterServerSync (bsc#965651)

-------------------------------------------------------------------
Wed Feb 10 08:38:56 CET 2016 - mc@suse.de

- version 2.5.18.1-1
- provide empty no_proxy variable for reference in rhn.conf
- do not import errata to all synced channels because some may not
  have all packages synced
- advise users to purge satsync cache on IntegrityError
- making sure packages without errata are included
- fixing invalid query

-------------------------------------------------------------------
Tue Jan 26 14:19:55 CET 2016 - mc@suse.de

- version 2.5.13.1-1
- update guest also on re-registration
- allow to change uuid of already registered guests
- there can be guests without hypervisor registered
- fixing exception when reactivating system without base channel and without
  any available
- use 2048MB as default for taskomatic max java memory
- add comment about taskomatic jvm max memory to rhn.conf (bsc#957653)
- Added filename in the error message of satellite-sync, in case file
  has wrong size
- Added processing of ValueError exception, during spacewalk-data-
  fsck
- local variable 'primif' referenced before assignment

-------------------------------------------------------------------
Sat Jan 16 11:39:21 CET 2016 - mc@suse.de

- version 2.5.10.1-1
- cleaning few old translations

-------------------------------------------------------------------
Thu Jan 14 13:37:12 CET 2016 - mc@suse.de

- version 2.5.9.1-1
- removing old duplicate template file
- allow client responses to be in Unicode
- cut string after full characters (bsc#960801)

-------------------------------------------------------------------
Tue Jan 05 15:57:59 CET 2016 - mc@suse.de

- version 2.5.8.2-1
- update CPU only if it has changed
- set "last_boot" and "os" for the host
- read SystemInfomation, create a foreign mainframe system
  and link to virtual instance
- add "mainframe_sysinfo" capability

-------------------------------------------------------------------
Wed Dec 16 11:18:47 CET 2015 - mc@suse.de

- version 2.5.8.1-1
- making synced channels in null org visible to all orgs
- during installation insert default SSL crypto key with null org
- fix typos

-------------------------------------------------------------------
Thu Dec 10 17:58:23 CET 2015 - mc@suse.de

- version 2.5.4.2-1
- avoid referencing unassigned variable (bsc#956981)

-------------------------------------------------------------------
Mon Nov 30 11:36:32 CET 2015 - mc@suse.de

- version 2.5.4.1-1
- Fix lookup virtual instance by uuid in virtualization backend in case so that
  it ignores the host id when uuid is not null. Removed invalid comment.
- Change the virtualization backend not to duplicate data in case host and
  guests are in different organizations
- fix patch syning if no issued date is given. Use now as date (bsc#953584)
- fix SUSE patch style detection for RES4 (bsc#953825)
- move support report creation to spacewalk-debug
- don't print python object details in reposync.py
- spacewalk-repo-sync: support multiple '-c channel' as in satellite-sync

-------------------------------------------------------------------
Thu Oct 22 16:35:50 CEST 2015 - mc@suse.de

- version 2.5.1.2-1
- use sle_version macro while checking for SLE only

-------------------------------------------------------------------
Wed Oct 07 14:53:10 CEST 2015 - mc@suse.de

- version 2.5.1.1-1
- drop monitoring
- replace upstream subscription counting with new subscription
  matching (FATE#311619)
- integrate SaltStack for configuration management (FATE#312447)

-------------------------------------------------------------------
Sun Sep 27 14:44:12 CEST 2015 - mc@suse.de

- version 2.1.55.21-1
- read repository checksum type after setting the certificate
  for a repository

-------------------------------------------------------------------
Wed Sep 23 15:10:55 CEST 2015 - mc@suse.de

- version 2.1.55.20-1
- define db_password to be read as a string (bsc#946381)

-------------------------------------------------------------------
Wed Jul 29 14:53:27 CEST 2015 - mc@suse.de

- version 2.1.55.19-1
- Enhance date only in patches to full ISO datetime (bsc#937029)
- Fix UnboundLocalError on rhnFault in dist upgrade (bsc#936182)
- detect new and old SUSE patch style (bsc#936869)

-------------------------------------------------------------------
Tue Jun 23 11:12:57 CEST 2015 - jrenner@suse.de

- version 2.1.55.18-1
- Require pyliblzma to enable sync of EPEL repos (bsc#934417)

-------------------------------------------------------------------
Mon Jun 22 16:15:43 CEST 2015 - jrenner@suse.de

- version 2.1.55.17-1
- detect SUSE Manager Tools channel as well (bsc#935433)
- import RPMs which vendor is an empty string (bsc#934124)
- set primary interface during registration (bnc#929058)
- do not reset primary network interface at hardware refresh (bnc#895071)

-------------------------------------------------------------------
Tue Mar 31 14:55:31 CEST 2015 - mc@suse.de

- version 2.1.55.16-1
- Copyright texts updated to SUSE LLC
- package inventory and channel report into spacewalk-debug
- Adding on the spacewalk-data-fsck man page the option --remove-mismatch
- add funcionality on spacewalk-data-fsck to remove the RPM which does not
  match checksum
- Fix the primary key definition for rhnPackageFile
- don't crash re-registrations if the original owner has been deleted
- sw-repo-sync fix to sync kickstart.
- init the second DB connection only when needed (inspired by bsc#915581)
- check for reboot type only (inspired by bsc#915581)

-------------------------------------------------------------------
Tue Feb 03 12:05:52 CET 2015 - mc@suse.de

- version 2.1.55.15-1
- convert mtime to localtime to prevent invalid times because of DST
  (bsc#914437)
- Do not exit with error if a vendor channel has no URL associated
  (bsc#914260)
- Getting rid of Tabs and trailing spaces
- copy all SUSE Manager logfiles into spacewalk-debug
- Update spacewalk-debug man page
- Exclude old backup-logs from spacewalk-debug to reduce size
- fix ISS export with unset patch severity
- ISS export/import informations about cloned channels (FATE#317789)
- convert empty string to null for DMI values (bsc#911272)

-------------------------------------------------------------------
Thu Dec 18 13:38:25 CET 2014 - mc@suse.de

- version 2.1.55.14-1
- fix encoding of submit message
- create (and label) /var/cache/rhn/satsync
- fixed double-counting of systems subscribed to more than one
  channel

-------------------------------------------------------------------
Thu Dec 04 16:31:03 CET 2014 - mc@suse.de

- version 2.1.55.13-1
- insert update tag at the correct place for SLE12 (bsc#907677)
- different registration paths should lock tables in the same order
  This could potentially cause deadlocks
- spacewalk-data-fsck: use config file variable instead of hardcoded path part
- drop unused column product_list in suseProducts table
- sanitize db_* config values

-------------------------------------------------------------------
Mon Nov 24 13:49:38 CET 2014 - mc@suse.de

- trigger generation of metadata if the repo contains no packages
  (bsc#870159)

-------------------------------------------------------------------
Fri Nov 07 13:27:27 CET 2014 - mc@suse.de

- version 2.1.55.12-1
- With NCC Backend still use the old style ISS method
- Make spacewalk-debug scc migration compatible

-------------------------------------------------------------------
Sat Nov 01 15:54:13 CET 2014 - mc@suse.de

- version 2.1.55.11-1
- ISS: Ignore errors if deprecated files do not exist on export
- ISS: export/import Subscriptions and entitlements
- ISS: remove old import code for NCC products and subscriptions
- ISS: export/import suseProductChannels and suseUpgradePaths via ISS
- ISS: export/import SUSE Products via ISS
- Fix cleanup when DB init goes wrong
- sanitize db_name config value
- fixed variable name

-------------------------------------------------------------------
Tue Oct 14 14:57:25 CEST 2014 - mc@suse.de

- version 2.1.55.10-1
- require python-enum34
- update channel checksum type for vendor channels
- read mirror credenatials from DB depending on the cc_backend.
- move current_backend() from susemanager to backend and rename it to
  current_cc_backend
- Speed up satellite-sync by avoiding commonly-called dblink_exec
- backend should correctly checksum config files with macros in them
- Add /usr/share/rhn/config-defaults in spacewalk-debug
- fix spacewalk-debug to be fully postgreSQL aware.
- correct UTF8 config files from being marked as binary
- increase size of update_tag column in rhnChannel table

-------------------------------------------------------------------
Fri Sep 12 15:34:51 CEST 2014 - mc@suse.de

- version 2.1.55.9-1
- preserve the query params in the url
- allow missing packages in patches if they are not part of this repo
- handle SLE12 update tag correctly in reposync
- fix traceback when pushing rpms with archive size > 4GB
- queue server for errata cache update when package list changes
- recognize oVirt node as virtual system
- adding handling for new rpm header information

-------------------------------------------------------------------
Wed Sep  3 01:41:39 CEST 2014 - ro@suse.de

- sanitize release line in specfile

-------------------------------------------------------------------
Tue Jun 17 11:04:37 CEST 2014 - jrenner@suse.de

- version 2.1.55.8-1
- Additional spacewalk backend methods and capability needed
- Spacewalk changes needed to support collisionless proxy lookaside

-------------------------------------------------------------------
Tue May 27 17:14:40 CEST 2014 - mc@suse.de

- version 2.1.55.7-1
- Fix crash when EULA comes with broken encoding and unexpected
  symbols from the susedata.xml file

-------------------------------------------------------------------
Thu May 22 14:32:50 CEST 2014 - mc@suse.de

- version 2.1.55.6-1
- spacewalk-update-signatures: fix logging, find more wrong keyids
     and remove existing associations before updating (bnc#874634)
- fixed 'empty separator' error
- Branding fixes
- fix syntax error in SQL statement

-------------------------------------------------------------------
Fri May 16 13:15:09 CEST 2014 - mc@suse.de

- version 2.1.55.5-1
- ISS: fix EULA import on Oracle db
- add suseEula to RPM package
- package and install suseEula
- ISS: sync SUSE's package EULAs
- Parse and import packages' EULAs

-------------------------------------------------------------------
Wed May 07 12:14:10 CEST 2014 - mc@suse.de

- version 2.1.55.4-1
- Revert "Adding option [-l|--list] to spacewalk-repo-sync"

-------------------------------------------------------------------
Tue May 06 15:26:31 CEST 2014 - mc@suse.de

- version 2.1.55.3-1
- remove ; in SQL statement to fix error with oracle DB
- Raise error if channel cannot be subscribed (bnc#875958)
- Format oldRoute to match newRoute, so that rhnServerPath isn't
  updated every time
- Adding option [-l|--list] to reposync
- Add --justks to sw-remove-channel
- sw-remove-channel --justdb has no impact on ks trees.
- rename channel-with-childs to channel-with-children
- Add option to spacewalk-remove-channel parent
- Added spacewalk-data-fsck man page(8)
- uniquify repo-sync packages in case of bad metadata
- allow MD5 config file checksums in fips mode
- commit after adding a job to taskomatic queue
- generate empty metadata for repos without primary
- proper failure handle (bnc#822644)

-------------------------------------------------------------------
Thu Apr 10 17:33:33 CEST 2014 - mc@suse.de

- version 2.1.55.2-1

-------------------------------------------------------------------
Thu Apr 10 17:33:22 CEST 2014 - mc@suse.de

- fix release in specfile for SLE12 (bnc#872970)

-------------------------------------------------------------------
Thu Mar 27 10:12:51 CET 2014 - fcastelli@suse.com

- version 2.1.55.1-1
- Package lock - python code: handle multiple lock events
- Catch more error message from gpg
- Reposync: remove interrupted downloads [bnc#866490]
- Not all machines provide manufacturer, was not None safe
- Spacewalk-debug: dereference links [bnc#865934]
- Specify package only with version
-------------------------------------------------------------------
Thu Feb 27 14:55:10 CET 2014 - fcastelli@suse.com

- version 2.1.54.1-1
- workaround for rpm-python bug
- update openstack guest requirements

-------------------------------------------------------------------
Fri Feb 21 15:31:07 CET 2014 - fcastelli@suse.com

- version 2.1.52.1-1
- Detect OpenStack guests as virtual so they can consume flex guest
- Rename variable so it doesn't colide with reserved word

-------------------------------------------------------------------
Thu Feb 13 15:24:31 CET 2014 - mc@suse.de

- version 2.1.49.2-1
- query should not end with semicolon in oracle
- add /usr/share/rhn to filelist
- no pre-requires of spacewalk-config on SLE12
- make unittests work on python 2.7 and higher without
  extra package installed
- no pylint on SLE12

-------------------------------------------------------------------
Fri Feb 07 13:16:58 CET 2014 - mc@suse.de

- version 2.1.49.1-1
- add functions to query ISS Master server from DB
- apply exclude filters to dependencies in repo-sync
- don't remove files referenced from other distributions/trees
- propagate --skip-kickstart-trees to delete_channels()
- remove clean-reposync-logs cronjob
- fixed man page for spacewalk-remove-channel
- added option to skip kickstart trees removal
- sw-remove-channel does not rm ks trees.
- Inter server sync: export also errata's severity
- Fixing InvalidPackageError when importing from channel dump
- commit after updating server's package profile
- Add extra log folder /var/log/rhn/tasko/sat/ in spacewalk-debug.
  [bnc#854090]
- allow CVE-IDs with more then 13 chars
  new syntax since 2014
- fixing sat-sync daylight-savings-related 'NoneType is
  unsubscriptable' error

-------------------------------------------------------------------
Mon Jan 13 09:53:00 CET 2014 - mc@suse.de

- version 2.1.39.1-1
- set reboot action status to sucess after the reboot (FATE#312591)
- added setLocked actions (FATE#312359)

-------------------------------------------------------------------
Wed Dec 18 14:05:37 CET 2013 - mc@suse.de

- version 2.1.38.2-1
- allow 1 character system profile names

-------------------------------------------------------------------
Mon Dec 09 16:02:08 CET 2013 - mc@suse.de

- version 2.1.38.1-1
- better detection for SUSE KVM and Cloud systems
- support bootstrap entitlement for bare-metal registration
  (FATE#312329)
- use new ISS slave detection

-------------------------------------------------------------------
Thu Nov 28 16:24:43 CET 2013 - mc@suse.de

- version 1.7.38.30-1
- replace encode/decode with to_string/to_unicode
- make sure we put strings to fd.write()
- replace application code with database lookup to prevent conflicting
  inserts
- python server: better logging of exceptions
- log errors on bad request (bnc#849856)
- fixed table alias
- updated spacewalk-repo-sync's man page (bnc#846351)
- add support for enhances rpm weak dependencies (backend) (bnc#846436)
- python pgsql driver: handled ProgrammingError exceptions
- Fix typos in entitlement report (bnc#840751)

-------------------------------------------------------------------
Fri Sep 27 09:59:33 CEST 2013 - mc@suse.de

- version 1.7.38.29-1
- with deep-verify import patches step by step
- check if mountpoint exists and send error mail (bnc#839111)
- bool(0) == False, but is a valid file mode

-------------------------------------------------------------------
Tue Aug 27 17:42:46 CEST 2013 - mc@suse.de

- version 1.7.38.28-1
- Ensure the file object is closed only when no IOError took place
  (bnc#837035)

-------------------------------------------------------------------
Wed Aug 21 15:54:56 CEST 2013 - mc@suse.de

- version 1.7.38.27-1
- add option to disable Expect header for post request (bnc#834200)
- re-import all patches with param deep-verify (bnc#833643)
- rewrite package org to match where they got imported (bnc#834780)
- Fix field length of erratum-advisory-name to match real DB field length
- forward register and de-register requests to parent
- debranding satellite-sync
- provide dummy repoindex handler for auth test in ISS case
- use needed mgr_ncc_sync_lib calles in satellite-sync
- copy SUSE product and subscription information into the disk dump
- add handler for ncc sync data used by iss (bnc#832776)
- package mgr-inter-sync and mgr-exporter commands (FATE#312371)
- import/export Support Information
- sync suseProductFiles with inter-server-sync
- dump and read rhn-channel-update-tag
- Add curl debugging to send and accessible (bnc#834200)
- filter out bad package/architecture combinations
- add debug code to import_susedata
- handle unicode tracebacks
- handle compressed products file
- Fix pylint errors - bnc#829073
- Fix code to work with python 2.4 - bnc#829073
- Make reposync work with local repositories - bnc#829073

-------------------------------------------------------------------
Wed Jun 12 13:26:43 CEST 2013 - mc@suse.de

- version 1.7.38.26-1
- fix reactivation of systems (bnc#823241)
- remove incorrect path from db
- Adding file path restoration functionality to spacewalk-data-fsck
- update copyright column length
- don't truncate channel name to 64 chars
- make API compatible with old RHEL5 clients
- No line break at the end of the package summary (bnc#821968)
- don't truncate filepath when exporting
- fix registration issues on PG
- update expired gpg keys in the keyring
- set copy_local urlgrabber option to copy also file URLs (bnc#819781)
- implement no_proxy usage (FATE#315039)
- use timeout config option also in suseLib send function (bnc#815460)

-------------------------------------------------------------------
Thu May 17 17:13:44 CEST 2013 - mc@suse.de

- version 1.7.38.25-1
- make satellite-sync work with new rhnlib (bnc#815460)
- search for CVE numbers also in the description
- require rhnlib with timeout option
- make rpclib connection timeout configurable (bnc#815460)
- return 404 Not Found on requests of content or installation.xml (bnc#815441)
- fix encoding in products summary and description

-------------------------------------------------------------------
Fri May 17 15:04:28 CEST 2013 - mc@suse.de

- fix authentication checking in inter server sync
  CVE-2013-2056 (bnc#819365)

-------------------------------------------------------------------
Thu Apr 04 15:32:18 CEST 2013 - mc@suse.de

- version 1.7.38.24-1
- Write better error message if the GPG key is not imported
  (bnc#812599)
- correct size for old rpms > 2 GiB
- do not read rpm into memory before transferring to client
  (bnc#801151)
- do not log passwords in URL
- If the database host is localhost, use Unix sockets in backend.
- SSH Server Push (backend) (FATE#312909)
- support V4 RSA/SHA1 signature
- Use FQDN in reposync error emails
- fix unicode encoding (bnc#803866)
- do not change the channels on future actions request

-------------------------------------------------------------------
Fri Feb 08 11:09:35 CET 2013 - mc@suse.de

- version 1.7.38.23-1
- send patch notifications only for new patches (FATE#314765)
- log with debug level, if wanted
- collect download errors and send error mail (bnc#801189)
- compare patch version as integers
- do not send null values for new products via XMLRPC (bnc#798131)
- change_base_channel should honor suse_products info if available

-------------------------------------------------------------------
Tue Dec 18 12:55:55 CET 2012 - mc@suse.de

- version 1.7.38.22-1
- fix formatstring error with proxy user and password

-------------------------------------------------------------------
Tue Nov 27 17:24:02 CET 2012 - mc@suse.de

- version 1.7.38.21-1
- remove product reference while deleting channel (bnc#790987)

-------------------------------------------------------------------
Thu Nov 22 15:28:52 CET 2012 - jrenner@suse.de

- version 1.7.38.20-1
- fix is_sha256_capable() function (bnc#790717)
- use SUSE specific proxy settings in reposync (bnc#779992)
- read proxy from rhn.conf before other places
- fix wrong variable binding (bnc#790143)
- rollback any unfinished transaction
- for the installed_size, ignore situation when it was not populated
  in the database.
- don't fail when from attribute is missing
- make sure proxy is enabled in sysconfig before reading it
- Add support for multiple mirror credentials
- SP migration backend (FATE#312431, FATE#312312)
- use smdba space-overview for report if exists
- do not return not existing patchnames (bnc#786105)
- add xmlrpc function update_status and server capability

-------------------------------------------------------------------
Fri Oct 05 10:56:43 CEST 2012 - mc@suse.de

- version 1.7.38.19-1

-------------------------------------------------------------------
Thu Oct 04 15:52:25 CEST 2012 - mc@suse.de

- version 1.7.38.18-1
- support upgrade_version without channel switching

-------------------------------------------------------------------
Fri Sep 28 16:18:24 CEST 2012 - mc@suse.de

- version 1.7.38.17-1
- load suse_products in the server object if not available
- reposync: do not use a proxy to access localhost
- Adding IPv6 ip-address detection to proxy auth fix (bnc#783667)
- separate proxy auth error hostname into separate header
- multi-tiered proxies don't update auth tokens correctly
  (bnc#783667)

-------------------------------------------------------------------
Tue Aug 07 16:40:35 CEST 2012 - mc@suse.de

- version 1.7.38.16-1
- fix SQL syntax for postgres

-------------------------------------------------------------------
Thu Aug 02 16:34:21 CEST 2012 - mc@suse.de

- version 1.7.38.15-1
- Truncating date string and therefore preventing ORA-01830
- skip ignored errata also in the second step (bnc#773108)
- fix detection of old suse style patches (bnc#773108)
- Fixing placeholder syntax in sql statement

-------------------------------------------------------------------
Thu Jul 19 14:39:32 CEST 2012 - ug@suse.de

- version 1.7.38.14-1
- yet another branding fix

-------------------------------------------------------------------
Mon Jul 16 15:10:16 CEST 2012 - ug@suse.de

- version 1.7.38.13-1
- postgresql don't know about decode
- fixed ERROR: subquery in FROM must have an alias
- fixed AttributeError: 'buffer' object has no attribute 'write'
- Correct SQL query for installing and removing solaris patches
- Correct query for PGSQL, addressing: SQL syntax error
- man page fix and root-level user warning for rhn-satellite-exporter

-------------------------------------------------------------------
Mon Jun 25 10:21:36 CEST 2012 - mc@suse.de

- version 1.7.38.12-1
- handle locally exception in entitle_server()
- made error message more detailed

-------------------------------------------------------------------
Thu Jun 21 11:35:17 CEST 2012 - jrenner@suse.de

- version 1.7.38.11-1
- removed functions which were orphaned by client v1 API removal
- fix call of save_suse_products()
- do not entitle virt guests twice during registration
- fix parsing susedata (bnc#765667)
- removed support for Red Hat Linux 6.2 and 7.[0123]
- print reasonable error message when something wrong with repo

-------------------------------------------------------------------
Wed Jun  6 11:58:16 CEST 2012 - ug@suse.de

- added a workaround for bnc#761350
  registering of a VM does not work

-------------------------------------------------------------------
Fri Jun  1 18:19:38 CEST 2012 - mc@suse.de

- fix ISE during registration because of duplicate ids
  (bnc#765123)

-------------------------------------------------------------------
Thu May 31 10:56:09 CEST 2012 - mc@suse.de

- version 1.7.38.10-1
- decode unicode string on IDN machines
- mock import_susedata
- allow retrieving susedata.xml.gz
- implement get_susedata()
- implement import_susedata()

-------------------------------------------------------------------
Mon May 14 15:16:11 CEST 2012 - mc@suse.de

- version 1.7.38.9-1
- fix registration of virt. machines (bnc#761350)

-------------------------------------------------------------------
Mon May 14 10:54:49 CEST 2012 - mc@suse.de

- version 1.7.38.8-1
- better check for empty version, release and arch
- with postgres empty varchar has to be null
- fix CVE test in testsuite
- improve patch handling for broken updateinfo files

-------------------------------------------------------------------
Wed May 09 13:41:34 CEST 2012 - mc@suse.de

- version 1.7.38.7-1
- define python macros
- No need to be autonomous when inserting to rhnArchType,
  only satellite-sync does it.

-------------------------------------------------------------------
Tue May  8 14:48:10 CEST 2012 - ug@suse.de

- integrated upstream feedback for studio integration (bnc#764532)

-------------------------------------------------------------------
Wed May 02 14:23:29 CEST 2012 - mc@suse.de

- version 1.7.38.6-1
- no fileprovide of gettext in SUSE
- Assign a dummy profile when none is selected.
- xccdf_eval should not send null value

-------------------------------------------------------------------
Fri Apr 27 16:13:22 CEST 2012 - mc@suse.de

- version 1.7.38.5-1
- update monitoring probes in small batches to reduce the chance of a
  deadlock
- raise SQLSchemaError alike oracle driver does
- fix sql query with --use-sync-date and --start-date of
  rhn-satellite-exporter

-------------------------------------------------------------------
Fri Apr 20 15:34:23 CEST 2012 - mc@suse.de

- version 1.7.38.4-1
- Fix inserting installed products
- set a bug title if we do not get one
- The mod_wsgi insists on having something after the numeric value on the
  Status line.
- Workaround httplib in 2.4 which did not have the responses dictionary.
- write nicer error message in case you are missing rpm files
- update man-pages
- copy postgres initlog in SUSE
- adding PostgreSQL configuration and log files to the debug.
- updating rhn-charsets man page -- update list of value names, no
  command line options.
- make rhn-charsets working on PostgreSQL as well; the output format
  changed even for Oracle.

-------------------------------------------------------------------
Fri Apr 13 15:43:45 CEST 2012 - mc@suse.de

- version 1.7.38.3-1
- Update config default to preserve base channel on reactivation
- rhn-schema-stats: support for PostgreSQL
- rhn-db-stats: support for PostgreSQL
- check channel permissions when unsubscribing a channel
- fix empty references in updateinfo
- remove source packages from compatible arch. We do not mirror them.

-------------------------------------------------------------------
Fri Apr 13 13:46:19 CEST 2012 - ug@suse.de

- fixed packaging of spacewalk-backend-xmlrpc
- fixed python bug in SUSE Studio image deployment

-------------------------------------------------------------------
Fri Mar 30 14:55:29 CEST 2012 - mc@suse.de

- version 1.7.38.2-1
- Truncate data which are longer than db allows
- Store also @idref of xccdf:rule-result element
- We want to store all idents per rule-result
- return products.xml metadata on request
- fixing sql queries with alias
- need to use timestamp datatype to preserve the precision.
- cast to string to force lookup_evr prototype.
- spacewalk-repo-sync documentation fix : add include/exclude options to
  manpage
- add default value for taskomatic.channel_repodata_workers
- created module for usefull cli functions

-------------------------------------------------------------------
Sat Mar 24 15:57:24 CET 2012 - mc@suse.de

- parameters should not be None

-------------------------------------------------------------------
Thu Mar 22 16:06:49 CET 2012 - mc@suse.de

- rotate logfiles with user www (bnc#681984) CVE-2011-1550

-------------------------------------------------------------------
Thu Mar 22 15:10:42 CET 2012 - mc@suse.de

- fix arbitrary package upload (bnc#751837)
  CVE-2012-1145

-------------------------------------------------------------------
Wed Mar 21 17:33:17 CET 2012 - mc@suse.de

- version 1.7.38.1-1
- Bumping package version

-------------------------------------------------------------------
Fri Mar 16 16:06:31 CET 2012 - ug@suse.de

- replace passwords in debug files (bnc#752467)

-------------------------------------------------------------------
Thu Mar 15 17:14:40 CET 2012 - jrenner@suse.de

- Add support for studio image deployments

-------------------------------------------------------------------
Mon Mar  5 12:42:12 CET 2012 - mc@suse.de

- add suseLib.accessible() doing a HEAD request to test
  if a URL is accessible

-------------------------------------------------------------------
Tue Jan 31 16:16:31 CET 2012 - mantel@suse.de

- some more renames Novell --> SUSE

-------------------------------------------------------------------
Thu Jan 19 12:17:49 CET 2012 - jrenner@suse.de

- Setting up seclist in registration.py (bnc#782819, brc#749890)
- CVE-2012-0059

-------------------------------------------------------------------
Thu Jan  5 10:10:01 CET 2012 - mc@suse.de

- spacewalk-debug should package NCC data dump into the tar ball

-------------------------------------------------------------------
Thu Dec 22 15:48:30 CET 2011 - mantel@suse.de

- do not change server.pot

-------------------------------------------------------------------
Thu Dec 22 14:59:55 CET 2011 - mantel@suse.de

- rename Novell to SUSE (#708333)

-------------------------------------------------------------------
Thu Dec 22 10:50:34 CET 2011 - mc@suse.de

- remove all unsupported translations

-------------------------------------------------------------------
Mon Dec 19 15:36:20 CET 2011 - mc@suse.de

- parse products.xml during reposync and store values in the
  Database (bnc#644678)

-------------------------------------------------------------------
Mon Dec 12 17:31:32 CET 2011 - iartarisi@suse.cz

- Add new --deep-copy option to spacewalk-repo-sync to allow skipping
  the re-calculation of package checksums

-------------------------------------------------------------------
Tue Nov  8 14:09:44 CET 2011 - jrenner@suse.de

- Implement audit logging for the backend API (fate#312607)

-------------------------------------------------------------------
Wed Oct 26 13:59:09 CEST 2011 - mc@suse.de

- add support for V4 DSA and RSA rpm signatures to display correct
  content provider (bnc#726577)
- enhance spacewalk-update-signatures to clean wrong keyids
  before update starts

-------------------------------------------------------------------
Thu Oct 13 14:51:29 CEST 2011 - iartarisi@suse.cz

- fix reposync failure when trying to associate package which couldn't
  be downloaded (bnc#722917)

-------------------------------------------------------------------
Tue Oct 11 17:01:46 CEST 2011 - mc@suse.de

- fix spacewalk-remove-channel to work on SUSE Manager (bnc#670206)

-------------------------------------------------------------------
Tue Oct 11 15:59:36 CEST 2011 - mc@suse.de

- adapt spacewalk-debug for SUSE Manager

-------------------------------------------------------------------
Mon Oct 10 15:19:31 CEST 2011 - mc@suse.de

- fix typo in reposync cleanup script (bnc#712860)

-------------------------------------------------------------------
Fri Oct  7 12:33:18 CEST 2011 - iartarisi@suse.cz

 - fix bug when parsing a patches.xml file with an extra <category> tag

-------------------------------------------------------------------
Wed Oct  5 19:01:45 CEST 2011 - mc@suse.de

- drop incompatible packages of a patch

-------------------------------------------------------------------
Fri Sep 30 12:39:33 CEST 2011 - mc@suse.de

- remove default currency from backend part of rhn.conf

-------------------------------------------------------------------
Thu Sep 29 13:52:25 CEST 2011 - mc@suse.de

- set patch severity to Low if none is specified to get all
  security patches listed in the currency report

-------------------------------------------------------------------
Mon Sep 26 17:57:36 CEST 2011 - iartarisi@suse.cz

- fix e['channels'].append AttributeError in case existing_errata is None
- fix failing unittest

-------------------------------------------------------------------
Mon Sep 26 17:06:15 CEST 2011 - mc@suse.de

- fix loosing patches if a repository is synced into
  different channels (bnc#720312)

-------------------------------------------------------------------
Fri Sep 23 14:36:11 CEST 2011 - mc@suse.de

- add unittests to check again

-------------------------------------------------------------------
Fri Sep 23 13:21:58 CEST 2011 - mc@suse.de

- change BuildRoot to SUSE default required for BuildService
- recompile python after unittests to remove buildroot path
  in binaries

-------------------------------------------------------------------
Tue Sep 20 17:35:42 CEST 2011 - iartarisi@suse.cz

- use pylint instead of python-pylint for checks

-------------------------------------------------------------------
Mon Sep 12 13:47:36 CEST 2011 - iartarisi@suse.cz

- remove extra toy targets that we don't use from Makefile.defs, which
  were mangling the PYTHONPATH

-------------------------------------------------------------------
Mon Sep 12 11:24:58 CEST 2011 - iartarisi@suse.cz

- run unittests and pylint from Makefile.backend at build time

-------------------------------------------------------------------
Fri Sep  9 12:24:19 CEST 2011 - iartarisi@suse.cz

- fixed E:442:XML_Dumper._validate_channels: Too many arguments for
  format string

-------------------------------------------------------------------
Wed Sep  7 16:23:27 CEST 2011 - mc@suse.de

- add cronjob to cleanup reposync log directory (bnc#712860)

-------------------------------------------------------------------
Wed Sep  7 12:42:51 CEST 2011 - mc@suse.de

- refactor reposync

-------------------------------------------------------------------
Mon Sep  5 16:22:04 CEST 2011 - iartarisi@suse.cz

- fix another typo in the specfile

-------------------------------------------------------------------
Mon Sep  5 16:17:15 CEST 2011 - iartarisi@suse.cz

- fix typo in specfile

-------------------------------------------------------------------
Mon Sep  5 16:08:51 CEST 2011 - iartarisi@suse.cz

- only run unittests during package build where we have the right
  BuildRequires

-------------------------------------------------------------------
Mon Sep  5 11:31:49 CEST 2011 - iartarisi@suse.cz

- added suseLib.py - library that deals with NCC/proxy configs/products
  etc.
- make unittests run during package build

-------------------------------------------------------------------
Mon Aug 22 16:35:42 CEST 2011 - iartarisi@suse.cz

- fixed TypeError in find_bugs method caused by empty patch descriptions

-------------------------------------------------------------------
Thu Aug 18 10:33:49 CEST 2011 - iartarisi@suse.cz

- fixed an import error in diskImportLib.py

-------------------------------------------------------------------
Fri Aug 12 11:09:59 CEST 2011 - iartarisi@suse.cz

- remove 'channel' from server.handlers.app as the sources have already
  been deleted (bnc#711967)

-------------------------------------------------------------------
Fri Aug 12 07:55:54 UTC 2011 - kkaempf@novell.com

- Remove 'comps' from Makefile (bnc#711938)

-------------------------------------------------------------------
Fri Aug 12 07:20:58 UTC 2011 - kkaempf@novell.com

- fix fetchTraceback and rhnFault import (bnc#711934)

-------------------------------------------------------------------
Thu Aug 11 15:08:03 CEST 2011 - iartarisi@suse.cz

- fix more imports after the move from spacewalk.common

-------------------------------------------------------------------
Thu Aug 11 11:13:46 CEST 2011 - iartarisi@suse.cz

- fix imports on UserDictCase to point to rhn.UserDictCase (bnc#711518)

-------------------------------------------------------------------
Wed Aug 10 11:30:48 CEST 2011 - iartarisi@suse.cz

- removed implicit imports to spacewalk.common (fixes bnc#711214,
  bnc#711211, bnc#711434)

-------------------------------------------------------------------
Tue Aug  9 10:26:35 CEST 2011 - iartarisi@suse.cz

- fixed missing import of 're' module (bnc#711188)

-------------------------------------------------------------------
Wed Aug  3 15:45:41 CEST 2011 - iartarisi@suse.cz

- reposync: fix ambiguous message when skipping a patch which references
  a package that's not in the database (bnc#702932)

-------------------------------------------------------------------
Wed Jul  6 17:49:36 CEST 2011 - mc@suse.de

- add server capability xmlrpc.errata.patch_names'

-------------------------------------------------------------------
Wed Jul  6 14:33:24 CEST 2011 - mc@suse.de

- fix requires for Code10

-------------------------------------------------------------------
Wed Jun 29 15:26:41 CEST 2011 - iartarisi@suse.cz

- added errata.getErrataNamesById function to the XMLRPC API

-------------------------------------------------------------------
Mon Jun  6 17:10:46 CEST 2011 - mc@suse.de

- set RPM vendor to "Not defined" if the RPM say "(none)"
  (FATE#312378, bnc#693291)

-------------------------------------------------------------------
Tue May 24 15:31:16 CEST 2011 - mc@suse.de

- some wierd packages have files in iso8859-1 not utf-8
- fix encoding of summary and description of a package if it is
  wrong

-------------------------------------------------------------------
Mon May 23 17:22:18 CEST 2011 - mc@suse.de

- Improve error message when gpg key is wrong or missing
  (bnc#693574)
- do not trigger a resync if file is missing. This can cause
  an endless loop (bnc#695392)
- do not send tracebacks as email if reposync failed. Send only
  the error message. (bnc#691579)

-------------------------------------------------------------------
Mon May  9 10:23:05 CEST 2011 - mc@suse.de

- fix errata export/import for sync
- handle sync with older spacewalk server which do not support
  weak dependencies

-------------------------------------------------------------------
Wed Apr 20 11:24:05 CEST 2011 - iartarisi@suse.cz

- reposync - parse and insert zypper code10 patches into the database

-------------------------------------------------------------------
Thu Apr 14 15:19:47 CEST 2011 - jrenner@suse.de

- Remove the channel APP handler (bnc#685078)
  (CVE-2009-0788, CVE-2010-1171)

-------------------------------------------------------------------
Fri Apr  1 12:09:01 CEST 2011 - mc@suse.de

- fix adding patches to a channel. Treat no epoch as the same as
  epoch is 0 (bnc#682846)

-------------------------------------------------------------------
Thu Mar 31 16:19:17 CEST 2011 - mc@suse.de

- fix a syntax error with old python versions

-------------------------------------------------------------------
Tue Mar 22 13:51:48 CET 2011 - iartarisi@suse.cz

- fixed bnc#673022 mirror timeout errors shouldn't cause tracebacks

-------------------------------------------------------------------
Thu Mar 17 10:58:24 CET 2011 - mc@suse.de

- check that path is not None

-------------------------------------------------------------------
Wed Mar 16 10:26:17 CET 2011 - iartarisi@suse.cz

- fixed bnc#679866 (downloading subscriptions fails when using integer
  credentials)

-------------------------------------------------------------------
Tue Mar  8 14:28:08 CET 2011 - iartarisi@suse.cz

- fixed bnc#644072 (password guessing vulnerability) with two commits
  from upstream

-------------------------------------------------------------------
Wed Feb 23 16:46:50 CET 2011 - ug@suse.de

- fixed virtual SUSE KVM machines in the webui (bnc#674344)

-------------------------------------------------------------------
Fri Feb 18 15:51:45 CET 2011 - mc@suse.de

- fix extract keyid from RPM header

-------------------------------------------------------------------
Thu Feb 17 16:02:25 CET 2011 - mc@suse.de

- do not remove not existing files

-------------------------------------------------------------------
Thu Feb 17 15:38:05 CET 2011 - mantel@suse.de

- fix debranding issues (bnc#672637)

-------------------------------------------------------------------
Tue Feb 15 10:14:55 CET 2011 - ug@suse.de

- typo fixed (indentation error bnc#671799)

-------------------------------------------------------------------
Mon Feb 14 17:22:39 CET 2011 - mc@suse.de

- expect not signed metadata with spacewalk-repo-sync if
  url is given on the commandline

-------------------------------------------------------------------
Sat Feb 12 16:54:53 CET 2011 - mc@suse.de

- send Mail if repo-sync failed

-------------------------------------------------------------------
Fri Feb 11 17:54:06 CET 2011 - jkupec@suse.cz

- correct strings in rhnException.py

-------------------------------------------------------------------
Fri Feb 11 11:47:57 CET 2011 - mc@suse.de

- catch exception primary not available and print nice message
  (bnc#671225)

-------------------------------------------------------------------
Thu Feb 10 18:15:23 CET 2011 - mc@suse.de

- remove org change again; fixed at another place

-------------------------------------------------------------------
Wed Feb  9 13:46:12 CET 2011 - jkupec@suse.cz

- removed unsupported satellite-sync from the
  spacewalk-backend-tools package (bnc #669610)

-------------------------------------------------------------------
Wed Feb  9 11:36:28 CET 2011 - mc@suse.de

- fix typo in sql statement

-------------------------------------------------------------------
Wed Feb  9 10:51:13 CET 2011 - mantel@suse.de

- some more renames of RHN to NCC (BNC#668824)

-------------------------------------------------------------------
Wed Feb  9 10:08:15 CET 2011 - mantel@suse.de

- change name of default organization (BNC#663983)

-------------------------------------------------------------------
Tue Feb  8 15:58:22 CET 2011 - mc@suse.de

- change mountpoint and prepended_dir (bnc#669558)

-------------------------------------------------------------------
Tue Feb  1 13:26:06 CET 2011 - mc@suse.de

- fix building on RH

-------------------------------------------------------------------
Mon Jan 31 18:14:57 CET 2011 - mc@suse.de

- call yum update_md with the option to get all updateinfos
  and not only the newest (bnc#668333)

-------------------------------------------------------------------
Sun Jan 30 15:26:01 CET 2011 - mc@suse.de

- backport upstrem fixes

-------------------------------------------------------------------
Tue Jan 25 16:19:49 CET 2011 - mc@suse.de

- fix checksum handling.

-------------------------------------------------------------------
Sat Jan 22 12:37:48 CET 2011 - mc@suse.de

- fix macros

-------------------------------------------------------------------
Mon Jan 17 12:25:39 CET 2011 - mc@suse.de

- change suseServer ostarget to a foreign key to suseOSTarget(id)

-------------------------------------------------------------------
Thu Jan 13 13:19:00 CET 2011 - mc@suse.de

- Sending and receiving suse product profile data during
  client registration.
- subscribe channels according to submitted suse product data

-------------------------------------------------------------------
Tue Jan 11 16:46:43 CET 2011 - mc@suse.de

- reposync: search for credentials and add them to the URL
- fix signature handling
- reposync: find checksums for packages in channels with
  org_id null

-------------------------------------------------------------------
Wed Dec 15 17:22:47 CET 2010 - mc@suse.de

- fix KeyError while syncing repos (bnc#657064)
- skip patch instead of abort if no checksum for a package
  was found

-------------------------------------------------------------------
Thu Sep 16 09:13:37 CEST 2010 - mantel@suse.de

- reflect rename of config files (/etc/rhn/default/rhn_server*conf)

-------------------------------------------------------------------
Wed Sep 15 09:10:44 CEST 2010 - mantel@suse.de

- Initial release of spacewalk-backend

-------------------------------------------------------------------
0707010000020F000081B40000000000000000000000015FBBE8EE00006E94000000000000000000000000000000000000002900000000spacewalk-backend/spacewalk-backend.spec  #
# spec file for package spacewalk-backend
#
# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
# Copyright (c) 2008-2018 Red Hat, Inc.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.

# Please submit bugfixes or comments via https://bugs.opensuse.org/
#


%{!?_unitdir: %global _unitdir /lib/systemd/system}

%{!?python3_sitelib: %global python3_sitelib %(%{__python3} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")}
%{!?pylint_check: %global pylint_check 0}
%global rhnroot %{_prefix}/share/rhn
%global rhnconfigdefaults %{rhnroot}/config-defaults
%global rhnconf %{_sysconfdir}/rhn
%global m2crypto m2crypto
%global python3rhnroot %{python3_sitelib}/spacewalk

%if 0%{?fedora} || 0%{?rhel}
%global apacheconfd %{_sysconfdir}/httpd/conf.d
%global apache_user apache
%global apache_group apache
%global apache_pkg httpd
%endif

%if 0%{?suse_version}
%global apacheconfd %{_sysconfdir}/apache2/conf.d
%global apache_user wwwrun
%global apache_group www
%global apache_pkg apache2
%global m2crypto python3-M2Crypto
%endif

Name:           spacewalk-backend
Summary:        Common programs needed to be installed on the Spacewalk servers/proxies
License:        GPL-2.0-only
Group:          System/Management
Version:        4.1.18
Release:        1%{?dist}
Url:            https://github.com/uyuni-project/uyuni
Source0:        https://github.com/spacewalkproject/spacewalk/archive/%{name}-%{version}.tar.gz
BuildRoot:      %{_tmppath}/%{name}-%{version}-build
%if !0%{?suse_version} || 0%{?suse_version} >= 1120
BuildArch:      noarch
%endif

Requires:       python3
# /etc/rhn is provided by uyuni-base-common
Requires(pre):  uyuni-base-common
BuildRequires:  uyuni-base-common
Requires:       python3-rhnlib >= 2.5.74
Requires:       python3-rpm
Requires:       python3-uyuni-common-libs
Requires(pre):  %{apache_pkg}
Requires:       %{apache_pkg}
Requires:       python3-pycurl
# for Debian support
Requires:       python3-debian
%if 0%{?pylint_check}
BuildRequires:  spacewalk-python3-pylint
%endif
BuildRequires:  /usr/bin/docbook2man
BuildRequires:  /usr/bin/msgfmt
BuildRequires:  docbook-utils
BuildRequires:  fdupes
BuildRequires:  python3-gzipstream
BuildRequires:  python3-rhn-client-tools
BuildRequires:  python3-rhnlib >= 2.5.74
BuildRequires:  python3-rpm
BuildRequires:  python3-uyuni-common-libs
BuildRequires:  python3-debian
BuildRequires:  %{m2crypto}


%description
Generic program files needed by the Spacewalk server machines.
This package includes the common code required by all servers/proxies.

%package sql
Summary:        Core functions providing SQL connectivity for the Spacewalk backend modules
Group:          System/Management
Requires(pre):  %{name} = %{version}-%{release}
Requires:       %{name} = %{version}-%{release}
Requires:       %{name}-sql-virtual = %{version}-%{release}

%description sql
This package contains the basic code that provides SQL connectivity for
the Spacewalk backend modules.

%package sql-postgresql
Summary:        Postgresql backend for Spacewalk
Group:          System/Management
Requires:       python3-psycopg2 >= 2.8.4
Provides:       %{name}-sql-virtual = %{version}-%{release}

%description sql-postgresql
This package contains provides PostgreSQL connectivity for the Spacewalk
backend modules.

%package server
Summary:        Basic code that provides Spacewalk Server functionality
Group:          System/Management
Requires(pre):  %{name}-sql = %{version}-%{release}
Requires:       %{name}-sql = %{version}-%{release}
Requires:       python3-python-pam
Requires:       spacewalk-config
Requires:       apache2-mod_wsgi-python3

# cobbler-web is known to break our configuration
Conflicts:      cobbler-web


%description server
This package contains the basic code that provides server/backend
functionality for a variety of XML-RPC receivers. The architecture is
modular so that you can plug/install additional modules for XML-RPC
receivers and get them enabled automatically.

%package xmlrpc
Summary:        Handler for /XMLRPC
Group:          System/Management
Requires:       %{name}-server = %{version}-%{release}
Requires:       python3-rpm

%description xmlrpc
These are the files required for running the /XMLRPC handler, which
provide the basic support for the registration client (rhn_register)
and the up2date clients.

%package applet
Summary:        Handler for /APPLET
Group:          System/Management
Requires:       %{name}-server = %{version}-%{release}

%description applet
These are the files required for running the /APPLET handler, which
provides the functions for the Spacewalk applet.

%package app
Summary:        Handler for /APP
Group:          System/Management
Requires:       %{name}-server = %{version}-%{release}

%description app
These are the files required for running the /APP handler.
Calls to /APP are used by internal maintenance tools (rhnpush).

%package iss
Summary:        Handler for /SAT
Group:          System/Management
Requires:       %{name}-server = %{version}-%{release}

%description iss
%{name} contains the basic code that provides server/backend
functionality for a variety of XML-RPC receivers. The architecture is
modular so that you can plug/install additional modules for XML-RPC
receivers and get them enabled automatically.

This package contains /SAT handler, which provide Inter Spacewalk Sync
capability.

%package iss-export
Summary:        Listener for the Server XML dumper
Group:          System/Management
Requires:       %{name}-xml-export-libs = %{version}-%{release}
Requires:       python3-rpm

%description iss-export
%{name} contains the basic code that provides server/backend
functionality for a variety of XML-RPC receivers. The architecture is
modular so that you can plug/install additional modules for XML-RPC
receivers and get them enabled automatically.

This package contains listener for the Server XML dumper.

%package config-files-common
Summary:        Common files for the Configuration Management project
Group:          System/Management
Requires:       %{name}-server = %{version}-%{release}

%description config-files-common
Common files required by the Configuration Management project

%package config-files
Summary:        Handler for /CONFIG-MANAGEMENT
Group:          System/Management
Requires:       %{name}-config-files-common = %{version}-%{release}

%description config-files
This package contains the server-side code for configuration management.

%package config-files-tool
Summary:        Handler for /CONFIG-MANAGEMENT-TOOL
Group:          System/Management
Requires:       %{name}-config-files-common = %{version}-%{release}

%description config-files-tool
This package contains the server-side code for configuration management tool.

%package package-push-server
Summary:        Listener for rhnpush (non-XMLRPC version)
Group:          System/Management
Requires:       %{name}-server = %{version}-%{release}

%description package-push-server
Listener for rhnpush (non-XMLRPC version)

%package tools
Summary:        Spacewalk Services Tools
Group:          System/Management
Requires:       %{name}
Requires:       %{name}-app = %{version}-%{release}
Requires:       %{name}-xmlrpc = %{version}-%{release}
Requires:       systemd
BuildRequires:  systemd
%{?systemd_requires}

Requires:       python3-gzipstream
Requires:       python3-python-dateutil
Requires:       python3-rhn-client-tools
Requires:       python3-solv
Requires:       python3-urlgrabber
Requires:       spacewalk-admin >= 0.1.1-0
Requires:       spacewalk-certs-tools
Requires:       susemanager-tools
%if 0%{?suse_version}
Requires(pre):  libzypp(plugin:system) >= 0
Requires:       zypp-plugin-python
Requires:       apache2-prefork
%endif
%if 0%{?fedora} || 0%{?rhel}
Requires:       mod_ssl
%endif
Requires:       %{name}-xml-export-libs
Requires:       cobbler >= 3.0.0
Requires:       %{m2crypto}
Requires:       python3-requests
Requires:       python3-rhnlib  >= 2.5.57

%description tools
Various utilities for the Spacewalk Server.

%package xml-export-libs
Summary:        Spacewalk XML data exporter
Group:          System/Management
Requires:       %{name}-server = %{version}-%{release}

%description xml-export-libs
Libraries required by various exporting tools

%package cdn
Summary:        CDN tools
Group:          System/Management
Requires:       %{m2crypto}
Requires:       %{name}-server = %{version}-%{release}
Requires:       subscription-manager

%description cdn
Tools for syncing content from Red Hat CDN

%prep
%setup -q

%build
make -f Makefile.backend all PYTHON_BIN=python3

# Fixing shebang for Python 3
for i in `find . -type f`;
do
	sed -i '1s=^#!/usr/bin/\(python\|env python\)[0-9.]*=#!/usr/bin/python3=' $i;
done

%install
install -d $RPM_BUILD_ROOT%{rhnroot}
install -d $RPM_BUILD_ROOT%{python3rhnroot}
install -d $RPM_BUILD_ROOT%{python3rhnroot}/common
install -d $RPM_BUILD_ROOT%{rhnconf}
install -d $RPM_BUILD_ROOT/%{_unitdir}
install -d $RPM_BUILD_ROOT/%{_prefix}/lib/susemanager/bin/

make -f Makefile.backend install PREFIX=$RPM_BUILD_ROOT \
    MANDIR=%{_mandir} APACHECONFDIR=%{apacheconfd} PYTHON_BIN=python3

export PYTHON_MODULE_NAME=%{name}
export PYTHON_MODULE_VERSION=%{version}

# remove all unsupported translations
cd $RPM_BUILD_ROOT
for d in usr/share/locale/*; do
  if [ ! -d "/$d" ]; then
    rm -rfv "./$d"
  fi
done
cd -
ln -s satellite-sync $RPM_BUILD_ROOT/usr/bin/mgr-inter-sync
ln -s satellite-sync.8.gz $RPM_BUILD_ROOT/usr/share/man/man8/mgr-inter-sync.8.gz
ln -s rhn-satellite-exporter $RPM_BUILD_ROOT/usr/bin/mgr-exporter

install -m 644 rhn-conf/signing.cnf $RPM_BUILD_ROOT%{rhnconf}/signing.conf

install -m 644 satellite_tools/spacewalk-diskcheck.service $RPM_BUILD_ROOT/%{_unitdir}
install -m 644 satellite_tools/spacewalk-diskcheck.timer $RPM_BUILD_ROOT/%{_unitdir}

install -m 644 satellite_tools/ulnauth.py $RPM_BUILD_ROOT/%{python3rhnroot}/satellite_tools

%find_lang %{name}-server

%if 0%{?is_opensuse}
sed -i 's/^product_name.*/product_name = Uyuni/' $RPM_BUILD_ROOT%{rhnconfigdefaults}/rhn.conf
%endif
%if 0%{?fedora} || 0%{?rhel} > 6
sed -i 's/#LOGROTATE-3.8#//' $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/spacewalk-backend-*
sed -i 's/#DOCUMENTROOT#/\/var\/www\/html/' $RPM_BUILD_ROOT%{rhnconfigdefaults}/rhn.conf
%endif
%if 0%{?suse_version}
sed -i 's/#LOGROTATE-3.8#.*/    su root www/' $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/spacewalk-backend-*
sed -i 's/#DOCUMENTROOT#/\/srv\/www\/htdocs/' $RPM_BUILD_ROOT%{rhnconfigdefaults}/rhn.conf

%py3_compile -O %{buildroot}/%{python3rhnroot}
%fdupes %{buildroot}/%{python3rhnroot}
%endif

install -m 755 satellite_tools/mgr-update-pkg-extra-tags $RPM_BUILD_ROOT%{_prefix}/lib/susemanager/bin/

## Install Zypper plugins only on SUSE machines
%if 0%{?suse_version}
install -Dd -m 0750 % $RPM_BUILD_ROOT%{_prefix}/lib/zypp/plugins/urlresolver
%{__install} satellite_tools/spacewalk-uln-resolver $RPM_BUILD_ROOT%{_prefix}/lib/zypp/plugins/urlresolver/spacewalk-uln-resolver
%{__install} satellite_tools/spacewalk-extra-http-headers $RPM_BUILD_ROOT%{_prefix}/lib/zypp/plugins/urlresolver/spacewalk-extra-http-headers
%endif

%check
make -f Makefile.backend PYTHONPATH=$RPM_BUILD_ROOT%{python3_sitelib}:$RPM_BUILD_ROOT%{python3_sitelib}/uyuni/common-libs PYTHON_BIN=python3 test

%if 0%{?pylint_check}
# check coding style
export PYTHONPATH=$RPM_BUILD_ROOT%{python3rhnroot}:/usr/lib/rhn:/usr/share/rhn:$RPM_BUILD_ROOT%{python3_sitelib}/uyuni/common-libs
spacewalk-python3 $RPM_BUILD_ROOT%{python3rhnroot}/common \
                     $RPM_BUILD_ROOT%{python3rhnroot}/satellite_exporter \
                     $RPM_BUILD_ROOT%{python3rhnroot}/satellite_tools \
                     $RPM_BUILD_ROOT%{python3rhnroot}/cdn_tools \
                     $RPM_BUILD_ROOT%{python3rhnroot}/upload_server \
                     $RPM_BUILD_ROOT%{python3rhnroot}/wsgi

%endif


%post server
%if 0%{?suse_version}
sysconf_addword /etc/sysconfig/apache2 APACHE_MODULES wsgi
%endif
if [ ! -e %{rhnconf}/rhn.conf ]; then
    exit 0
fi

%pre tools
%service_add_pre spacewalk-diskcheck.service spacewalk-diskcheck.timer

%post tools
%service_add_post spacewalk-diskcheck.service spacewalk-diskcheck.timer

%preun tools
%service_del_preun spacewalk-diskcheck.service spacewalk-diskcheck.timer

%postun tools
%service_del_postun spacewalk-diskcheck.service spacewalk-diskcheck.timer


%files
%defattr(-,root,root)
%doc LICENSE
%dir %{python3rhnroot}
%dir %{_prefix}/lib/susemanager
%dir %{_prefix}/lib/susemanager/bin
%{python3rhnroot}/__init__.py*
%{python3rhnroot}/common
%attr(770,root,%{apache_group}) %dir %{_var}/log/rhn
# Workaround for strict-whitespace-enforcement in httpd
%attr(644,root,%{apache_group}) %config %{apacheconfd}/aa-spacewalk-server.conf
# config files
%attr(644,root,%{apache_group}) %{rhnconfigdefaults}/rhn.conf
%attr(755,root,root) %{_bindir}/spacewalk-cfg-get
%{_mandir}/man8/spacewalk-cfg-get.8.gz
# wsgi stuff
%dir %{rhnroot}/wsgi
%{rhnroot}/wsgi/__init__.py*
%{rhnroot}/wsgi/wsgiHandler.py*
%{rhnroot}/wsgi/wsgiRequest.py*
%dir %{rhnroot}
%dir %{python3rhnroot}/__pycache__/
%{python3rhnroot}/__pycache__/*

%files sql
%defattr(-,root,root)
%doc LICENSE
%dir %{rhnroot}/server
# Need __init__ = share it with rhns-server
%dir %{python3rhnroot}/server
%{python3rhnroot}/server/__init__.py*
%{rhnroot}/server/__init__.py*
%dir %{python3rhnroot}/server/rhnSQL
%{python3rhnroot}/server/rhnSQL/const.py*
%{python3rhnroot}/server/rhnSQL/dbi.py*
%{python3rhnroot}/server/rhnSQL/__init__.py*
%{python3rhnroot}/server/rhnSQL/sql_*.py*
%dir %{python3rhnroot}/server/__pycache__/
%dir %{python3rhnroot}/server/rhnSQL/__pycache__/
%{python3rhnroot}/server/__pycache__/__init__.*
%{python3rhnroot}/server/rhnSQL/__pycache__/*
%exclude %{python3rhnroot}/server/rhnSQL/__pycache__/driver_postgresql.*

%files sql-postgresql
%defattr(-,root,root)
%doc LICENSE
%{python3rhnroot}/server/rhnSQL/driver_postgresql.py*
%{python3rhnroot}/server/rhnSQL/__pycache__/driver_postgresql.*

%files server -f %{name}-server.lang
%defattr(-,root,root)
%doc LICENSE
%dir %{rhnroot}/server
# modules
%{python3rhnroot}/server/apacheAuth.py*
%{python3rhnroot}/server/apacheHandler.py*
%{python3rhnroot}/server/apacheRequest.py*
%{python3rhnroot}/server/apacheServer.py*
%{python3rhnroot}/server/apacheUploadServer.py*
%{python3rhnroot}/server/rhnAction.py*
%{python3rhnroot}/server/rhnAuthPAM.py*
%{python3rhnroot}/server/rhnCapability.py*
%{python3rhnroot}/server/rhnChannel.py*
%{python3rhnroot}/server/rhnDependency.py*
%{python3rhnroot}/server/rhnPackage.py*
%{python3rhnroot}/server/rhnPackageUpload.py*
%{python3rhnroot}/server/basePackageUpload.py*
%{python3rhnroot}/server/rhnHandler.py*
%{python3rhnroot}/server/rhnImport.py*
%{python3rhnroot}/server/rhnLib.py*
%{python3rhnroot}/server/rhnMapping.py*
%{python3rhnroot}/server/rhnRepository.py*
%{python3rhnroot}/server/rhnSession.py*
%{python3rhnroot}/server/rhnUser.py*
%{python3rhnroot}/server/rhnVirtualization.py*
%{python3rhnroot}/server/taskomatic.py*
%{python3rhnroot}/server/suseEula.py*
%dir %{python3rhnroot}/server/rhnServer
%{python3rhnroot}/server/rhnServer/*
%dir %{python3rhnroot}/server/importlib
%{python3rhnroot}/server/importlib/__init__.py*
%{python3rhnroot}/server/importlib/archImport.py*
%{python3rhnroot}/server/importlib/backend.py*
%{python3rhnroot}/server/importlib/backendLib.py*
%{python3rhnroot}/server/importlib/backendOracle.py*
%{python3rhnroot}/server/importlib/backend_checker.py*
%{python3rhnroot}/server/importlib/channelImport.py*
%{python3rhnroot}/server/importlib/debPackage.py*
%{python3rhnroot}/server/importlib/errataCache.py*
%{python3rhnroot}/server/importlib/errataImport.py*
%{python3rhnroot}/server/importlib/headerSource.py*
%{python3rhnroot}/server/importlib/importLib.py*
%{python3rhnroot}/server/importlib/kickstartImport.py*
%{python3rhnroot}/server/importlib/mpmSource.py*
%{python3rhnroot}/server/importlib/packageImport.py*
%{python3rhnroot}/server/importlib/packageUpload.py*
%{python3rhnroot}/server/importlib/productNamesImport.py*
%{python3rhnroot}/server/importlib/userAuth.py*
%{python3rhnroot}/server/importlib/orgImport.py*
%{python3rhnroot}/server/importlib/contentSourcesImport.py*
%{python3rhnroot}/server/importlib/supportInformationImport.py*
%{python3rhnroot}/server/importlib/suseProductsImport.py*
%dir %{python3rhnroot}/server/importlib/__pycache__/
%{python3rhnroot}/server/importlib/__pycache__/*
%{python3rhnroot}/server/__pycache__/*
%exclude %{python3rhnroot}/server/__pycache__/__init__.*
%exclude %{python3rhnroot}/server/__pycache__/configFilesHandler.*
%{rhnroot}/server/handlers/__init__.py*

# Repomd stuff
%dir %{python3rhnroot}/server/repomd
%{python3rhnroot}/server/repomd/__init__.py*
%{python3rhnroot}/server/repomd/domain.py*
%{python3rhnroot}/server/repomd/mapper.py*
%{python3rhnroot}/server/repomd/repository.py*
%{python3rhnroot}/server/repomd/view.py*
%dir %{python3rhnroot}/server/repomd/__pycache__/
%{python3rhnroot}/server/repomd/__pycache__/*

# the cache
%attr(755,%{apache_user},%{apache_group}) %dir %{_var}/cache/rhn
%attr(755,root,root) %dir %{_var}/cache/rhn/satsync
# config files
%attr(644,root,%{apache_group}) %{rhnconfigdefaults}/rhn_server.conf

# main httpd config
%attr(644,root,%{apache_group}) %config %{apacheconfd}/zz-spacewalk-server.conf

# wsgi stuff
%attr(644,root,%{apache_group}) %config %{apacheconfd}/zz-spacewalk-server-wsgi.conf
%{rhnroot}/wsgi/app.py*
%{rhnroot}/wsgi/applet.py*
%{rhnroot}/wsgi/config.py*
%{rhnroot}/wsgi/config_tool.py*
%{rhnroot}/wsgi/package_push.py*
%{rhnroot}/wsgi/sat.py*
%{rhnroot}/wsgi/sat_dump.py*
%{rhnroot}/wsgi/xmlrpc.py*

# logs and other stuff
%config(noreplace) %{_sysconfdir}/logrotate.d/spacewalk-backend-server

%dir %{rhnroot}/server
%dir %{rhnroot}/server/handlers

%files xmlrpc
%defattr(-,root,root)
%doc LICENSE
%dir %{rhnroot}/server/handlers/xmlrpc
%{rhnroot}/server/handlers/xmlrpc/*
%dir %{python3rhnroot}/server/action
%{python3rhnroot}/server/action/*
%dir %{python3rhnroot}/server/action_extra_data
%{python3rhnroot}/server/action_extra_data/*
# config files
%attr(644,root,%{apache_group}) %{rhnconfigdefaults}/rhn_server_xmlrpc.conf
%config(noreplace) %{_sysconfdir}/logrotate.d/spacewalk-backend-xmlrpc
%dir %{rhnroot}/server
%dir %{rhnroot}/server/handlers

%files applet
%defattr(-,root,root)
%doc LICENSE
%dir %{rhnroot}/server
%dir %{rhnroot}/server/handlers/applet
%{rhnroot}/server/handlers/applet/*
# config files
%attr(644,root,%{apache_group}) %{rhnconfigdefaults}/rhn_server_applet.conf
%config(noreplace) %{_sysconfdir}/logrotate.d/spacewalk-backend-applet

%files app
%defattr(-,root,root)
%doc LICENSE
%dir %{rhnroot}/server
%dir %{rhnroot}/server/handlers/app
%{rhnroot}/server/handlers/app/*
# config files
%attr(644,root,%{apache_group}) %{rhnconfigdefaults}/rhn_server_app.conf
%config(noreplace) %{_sysconfdir}/logrotate.d/spacewalk-backend-app

%files iss
%defattr(-,root,root)
%doc LICENSE
%dir %{rhnroot}/server
%dir %{rhnroot}/server/handlers/sat
%{rhnroot}/server/handlers/sat/*
%config(noreplace) %{_sysconfdir}/logrotate.d/spacewalk-backend-iss

%files iss-export
%defattr(-,root,root)
%doc LICENSE
%dir %{python3rhnroot}/satellite_exporter
%{python3rhnroot}/satellite_exporter/__init__.py*
%{python3rhnroot}/satellite_exporter/satexport.py*

%dir %{rhnroot}/satellite_exporter
%dir %{rhnroot}/satellite_exporter/handlers
%{rhnroot}/satellite_exporter/__init__.py*
%{rhnroot}/satellite_exporter/handlers/__init__.py*
%{rhnroot}/satellite_exporter/handlers/non_auth_dumper.py*
%dir %{python3rhnroot}/satellite_exporter/__pycache__/
%{python3rhnroot}/satellite_exporter/__pycache__/*
# config files
%config(noreplace) %{_sysconfdir}/logrotate.d/spacewalk-backend-iss-export

%files config-files-common
%defattr(-,root,root)
%doc LICENSE
%{python3rhnroot}/server/configFilesHandler.py*
%{python3rhnroot}/server/__pycache__/configFilesHandler.*
%dir %{python3rhnroot}/server/config_common
%{python3rhnroot}/server/config_common/*

%files config-files
%defattr(-,root,root)
%doc LICENSE
%dir %{rhnroot}/server
%dir %{rhnroot}/server/handlers/config
%{rhnroot}/server/handlers/config/*
%attr(644,root,%{apache_group}) %{rhnconfigdefaults}/rhn_server_config-management.conf
%config(noreplace) %{_sysconfdir}/logrotate.d/spacewalk-backend-config-files

%files config-files-tool
%defattr(-,root,root)
%doc LICENSE
%dir %{rhnroot}/server
%dir %{rhnroot}/server/handlers/config_mgmt
%{rhnroot}/server/handlers/config_mgmt/*
%attr(644,root,%{apache_group}) %{rhnconfigdefaults}/rhn_server_config-management-tool.conf
%config(noreplace) %{_sysconfdir}/logrotate.d/spacewalk-backend-config-files-tool

%files package-push-server
%defattr(-,root,root)
%doc LICENSE
%dir %{rhnroot}/upload_server
%{rhnroot}/upload_server/__init__.py*
%dir %{rhnroot}/upload_server/handlers
%{rhnroot}/upload_server/handlers/__init__.py*
%{rhnroot}/upload_server/handlers/package_push
%attr(644,root,%{apache_group}) %{rhnconfigdefaults}/rhn_server_upload.conf
%attr(644,root,%{apache_group}) %{rhnconfigdefaults}/rhn_server_upload_package-push.conf
%config(noreplace) %{_sysconfdir}/logrotate.d/spacewalk-backend-package-push-server

%files tools
%defattr(-,root,root)
%doc LICENSE
%doc README.ULN
%attr(644,root,%{apache_group}) %{rhnconfigdefaults}/rhn_server_satellite.conf
%config(noreplace) %{_sysconfdir}/logrotate.d/spacewalk-backend-tools
%config(noreplace) %{rhnconf}/signing.conf
%attr(755,root,root) %{_bindir}/rhn-charsets
%attr(755,root,root) %{_bindir}/rhn-satellite-activate
%attr(755,root,root) %{_bindir}/rhn-schema-version
%attr(755,root,root) %{_bindir}/rhn-ssl-dbstore
%attr(755,root,root) %{_bindir}/satellite-sync
%attr(755,root,root) %{_bindir}/mgr-inter-sync
%attr(755,root,root) %{_bindir}/mgr-exporter
%attr(755,root,root) %{_bindir}/spacewalk-debug
%attr(755,root,root) %{_bindir}/rhn-satellite-exporter
%attr(755,root,root) %{_bindir}/update-packages
%attr(755,root,root) %{_bindir}/spacewalk-repo-sync
%attr(755,root,root) %{_bindir}/rhn-db-stats
%attr(755,root,root) %{_bindir}/rhn-schema-stats
%attr(755,root,root) %{_bindir}/satpasswd
%attr(755,root,root) %{_bindir}/satwho
%attr(755,root,root) %{_bindir}/spacewalk-remove-channel*
%attr(755,root,root) %{_bindir}/spacewalk-update-signatures
%attr(755,root,root) %{_bindir}/spacewalk-data-fsck
%attr(755,root,root) %{_bindir}/spacewalk-fips-tool
%attr(755,root,root) %{_bindir}/mgr-sign-metadata
%attr(755,root,root) %{_bindir}/mgr-sign-metadata-ctl
%attr(755,root,root) %{_bindir}/spacewalk-diskcheck
%attr(755,root,root) %{_prefix}/lib/susemanager/bin/mgr-update-pkg-extra-tags
%{_prefix}/lib/zypp/plugins/urlresolver/spacewalk-uln-resolver
%{_prefix}/lib/zypp/plugins/urlresolver/spacewalk-extra-http-headers
%{python3rhnroot}/satellite_tools/contentRemove.py*
%{python3rhnroot}/satellite_tools/SequenceServer.py*
%{python3rhnroot}/satellite_tools/messages.py*
%{python3rhnroot}/satellite_tools/progress_bar.py*
%{python3rhnroot}/satellite_tools/req_channels.py*
%{python3rhnroot}/satellite_tools/satsync.py*
%{python3rhnroot}/satellite_tools/satCerts.py*
%{python3rhnroot}/satellite_tools/satComputePkgHeaders.py*
%{python3rhnroot}/satellite_tools/syncCache.py*
%{python3rhnroot}/satellite_tools/sync_handlers.py*
%{python3rhnroot}/satellite_tools/rhn_satellite_activate.py*
%{python3rhnroot}/satellite_tools/rhn_ssl_dbstore.py*
%{python3rhnroot}/satellite_tools/xmlWireSource.py*
%{python3rhnroot}/satellite_tools/updatePackages.py*
%{python3rhnroot}/satellite_tools/reposync.py*
%{python3rhnroot}/satellite_tools/constants.py*
%{python3rhnroot}/satellite_tools/download.py*
%{python3rhnroot}/satellite_tools/ulnauth.py*
%dir %{python3rhnroot}/satellite_tools/disk_dumper
%{python3rhnroot}/satellite_tools/disk_dumper/__init__.py*
%{python3rhnroot}/satellite_tools/disk_dumper/iss.py*
%{python3rhnroot}/satellite_tools/disk_dumper/iss_ui.py*
%{python3rhnroot}/satellite_tools/disk_dumper/iss_isos.py*
%{python3rhnroot}/satellite_tools/disk_dumper/iss_actions.py*
%{python3rhnroot}/satellite_tools/disk_dumper/dumper.py*
%{python3rhnroot}/satellite_tools/disk_dumper/string_buffer.py*
%dir %{python3rhnroot}/satellite_tools/repo_plugins
%attr(755,root,%{apache_group}) %dir %{_var}/log/rhn/reposync
%{python3rhnroot}/satellite_tools/repo_plugins/__init__.py*
%{python3rhnroot}/satellite_tools/repo_plugins/yum_src.py*
%{python3rhnroot}/satellite_tools/repo_plugins/uln_src.py*
%{python3rhnroot}/satellite_tools/repo_plugins/deb_src.py*
%dir %{python3rhnroot}/satellite_tools/__pycache__/
%dir %{python3rhnroot}/satellite_tools/disk_dumper/__pycache__/
%dir %{python3rhnroot}/satellite_tools/repo_plugins/__pycache__/
%{python3rhnroot}/satellite_tools/__pycache__/*
%exclude %{python3rhnroot}/satellite_tools/__pycache__/__init__.*
%exclude %{python3rhnroot}/satellite_tools/__pycache__/geniso.*
%exclude %{python3rhnroot}/satellite_tools/__pycache__/connection.*
%exclude %{python3rhnroot}/satellite_tools/__pycache__/diskImportLib.*
%exclude %{python3rhnroot}/satellite_tools/__pycache__/syncLib.*
%exclude %{python3rhnroot}/satellite_tools/__pycache__/xmlDiskSource.*
%exclude %{python3rhnroot}/satellite_tools/__pycache__/xmlSource.*
%{python3rhnroot}/satellite_tools/disk_dumper/__pycache__/*
%{python3rhnroot}/satellite_tools/repo_plugins/__pycache__/*
%config %attr(644,root,%{apache_group}) %{rhnconfigdefaults}/rhn_server_iss.conf
%{_mandir}/man8/rhn-satellite-exporter.8*
%{_mandir}/man8/rhn-charsets.8*
%{_mandir}/man8/rhn-satellite-activate.8*
%{_mandir}/man8/rhn-schema-version.8*
%{_mandir}/man8/rhn-ssl-dbstore.8*
%{_mandir}/man8/rhn-db-stats.8*
%{_mandir}/man8/rhn-schema-stats.8*
%{_mandir}/man8/satellite-sync.8*
%{_mandir}/man8/mgr-inter-sync.8*
%{_mandir}/man8/spacewalk-debug.8*
%{_mandir}/man8/satpasswd.8*
%{_mandir}/man8/satwho.8*
%{_mandir}/man8/spacewalk-fips-tool.8*
%{_mandir}/man8/spacewalk-remove-channel.8*
%{_mandir}/man8/spacewalk-repo-sync.8*
%{_mandir}/man8/spacewalk-data-fsck.8*
%{_mandir}/man8/spacewalk-update-signatures.8*
%{_mandir}/man8/update-packages.8*
%attr(644, root, root) %{_unitdir}/spacewalk-diskcheck.service
%attr(644, root, root) %{_unitdir}/spacewalk-diskcheck.timer

%files xml-export-libs
%defattr(-,root,root)
%doc LICENSE
%dir %{python3rhnroot}/satellite_tools
%{python3rhnroot}/satellite_tools/__init__.py*
%{python3rhnroot}/satellite_tools/geniso.py*
# A bunch of modules shared with satellite-tools
%{python3rhnroot}/satellite_tools/connection.py*
%{python3rhnroot}/satellite_tools/diskImportLib.py*
%{python3rhnroot}/satellite_tools/syncLib.py*
%{python3rhnroot}/satellite_tools/xmlDiskSource.py*
%{python3rhnroot}/satellite_tools/xmlSource.py*
%dir %{python3rhnroot}/satellite_tools/exporter
%{python3rhnroot}/satellite_tools/exporter/__init__.py*
%{python3rhnroot}/satellite_tools/exporter/exportLib.py*
%{python3rhnroot}/satellite_tools/exporter/xmlWriter.py*
%dir %{python3rhnroot}/satellite_tools/exporter/__pycache__/
%{python3rhnroot}/satellite_tools/__pycache__/__init__.*
%{python3rhnroot}/satellite_tools/__pycache__/geniso.*
%{python3rhnroot}/satellite_tools/__pycache__/connection.*
%{python3rhnroot}/satellite_tools/__pycache__/diskImportLib.*
%{python3rhnroot}/satellite_tools/__pycache__/syncLib.*
%{python3rhnroot}/satellite_tools/__pycache__/xmlDiskSource.*
%{python3rhnroot}/satellite_tools/__pycache__/xmlSource.*
%{python3rhnroot}/satellite_tools/exporter/__pycache__/*

%files cdn
%defattr(-,root,root)
%attr(755,root,root) %{_bindir}/cdn-sync
%dir %{python3rhnroot}/cdn_tools
%{python3rhnroot}/cdn_tools/*.py*
%attr(755,root,%{apache_group}) %dir %{_var}/log/rhn/cdnsync
%config(noreplace) %{_sysconfdir}/logrotate.d/spacewalk-backend-cdn
%{_mandir}/man8/cdn-sync.8*
%dir %{python3rhnroot}/cdn_tools
%dir %{python3rhnroot}/cdn_tools/__pycache__/
%{python3rhnroot}/cdn_tools/__pycache__/*

%changelog
07070100000210000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000001700000000spacewalk-backend/test    07070100000211000081B40000000000000000000000015FBBE8EE000001D5000000000000000000000000000000000000001E00000000spacewalk-backend/test/README Python Backend Tests

Use runtests*.py scripts to run the various suites of tests. Install
python-testoob if you'd like slightly prettier test output or tools
like --regex=testname.

runtests.py
- Pure unit tests, no disk, network, or database required.
- Should be lightning fast and able to run in just about any environment.

runtests-postgresql.py
- PostgreSQL database tests.
- Requires connectivity to a PostgreSQL database, read script for connection
  details.
   07070100000212000081B40000000000000000000000015FBBE8EE00000057000000000000000000000000000000000000002700000000spacewalk-backend/test/db_settings.ini    [postgresql]
host: localhost
user: spacewalk
password: spacewalk
database: susemanager
 07070100000213000081FD0000000000000000000000015FBBE8EE000000C4000000000000000000000000000000000000003600000000spacewalk-backend/test/docker-backend-common-tests.sh #! /bin/bash

touch /etc/rhn/rhn.conf
mkdir -p /manager/backend/reports
nosetests -v --with-xunit --xunit-file /manager/backend/reports/common_tests.xml -s /manager/backend/common/test/unit-test/
07070100000214000081FD0000000000000000000000015FBBE8EE0000017D000000000000000000000000000000000000003500000000spacewalk-backend/test/docker-backend-pgsql-tests.sh  #! /bin/bash

/sbin/sysctl -w kernel.shmmax=4067832832
su - postgres -c '/usr/lib/postgresql12/bin/pg_ctl start'
cp /root/rhn.conf /etc/rhn/rhn.conf
mkdir -p /manager/backend/reports
nosetests -v --with-xunit --xunit-file /manager/backend/reports/pgsql_tests.xml /manager/backend/test/runtests-postgresql.py
EXIT=$?
su - postgres -c '/usr/lib/postgresql12/bin/pg_ctl stop'
exit $?
   07070100000215000081FD0000000000000000000000015FBBE8EE000000D1000000000000000000000000000000000000003500000000spacewalk-backend/test/docker-backend-tools-tests.sh  #! /bin/bash

touch /etc/rhn/rhn.conf
mkdir -p /manager/backend/reports
nosetests -v --with-xunit --xunit-file /manager/backend/reports/satellite_tools_tests.xml -s /manager/backend/satellite_tools/test/unit/
   07070100000216000081FD0000000000000000000000015FBBE8EE000029AF000000000000000000000000000000000000002300000000spacewalk-backend/test/johntest.py    #!/usr/bin/python
#
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

import sys
from rhn import rpclib


class Test:

    def __init__(self):
        self._server_url = 'http://rhnblade4.rhndev.redhat.com/XMLRPC'
        self._getserver_url = None
        self._systemid = None
        self._username = None
        self._channel_data = None
        self._package_data = None
        self._server = None
        self._getserver = None
        self._login = None
        self._header_data = None
        self._package = None

    def _get_sysid(self):
        if self._systemid is None:
            self._systemid = open("/etc/sysconfig/rhn/systemid").read()
        return self._systemid

    def _connect(self):
        if self._server is None:
            self._server = rpclib.Server(self._server_url)
        return self._server

    def login(self):
        if self._login is None:
            s = self._connect()
            sysid = self._get_sysid()
            self._login = LoginInfo(s.up2date.login(sysid))
        return self._login

    def list_channels(self):
        if self._channel_data is None:
            s = self._connect()
            sysid = self._get_sysid()
            self._channel_data = ChannelList(s.up2date.listChannels(sysid))
        return self._channel_data

    def list_packages(self):
        if self._package_data is None:
            s = self._connect()
            sysid = self._get_sysid()
            self._package_data = PackagesList(s.up2date.listall(sysid))
        return self._package_data

    def list_packages_size(self):
        if self._package_data is None:
            s = self._connect()
            sysid = self._get_sysid()
            self._package_data = s.up2date.listall_size(sysid)
        return self._package_data

    def header(self, pkglist):
        if pkglist is None:
            return None
        if self._header_data is None:
            s = self._connect()
            sysid = self._get_sysid()
            self._package_data = s.up2date.header(sysid, pkglist)
        return self._header_data

    def package(self, package):
        if package is None:
            return None
        if self._package is None:
            s = self._connect()
            sysid = self._get_sysid()
            self._package = s.up2date.package(sysid, package)
        return self._package

    def reserve_user(self, username, password):
        ret = None
        if username is not None and password is not None:
            s = self._connect()
            sysid = self._get_sysid()
            ret = s.registration.reserve_user(username, password)
        return ret

    def new_user(self, username, password, email=None, org_id=None, org_password=None):
        if email is None or username is None or password is None:
            return None
        s = self._connect()
        ret = s.registration.new_user(username, password, email, org_id, org_password)
        return ret


class PackagesList:

    def __init__(self, packagelist):
        if packagelist is None:
            self.packagelist = None
        else:
            self.packagelist = packagelist
        self._num_packages = None
        self._name = 0
        self._version = 1
        self._release = 2
        self._epoch = 3

    def get_num_packages(self):
        if self._num_packages is None:
            self._num_packages = len(self.packagelist)
        return self._num_packages

    def _get_field(self, pack_index, field):
        if pack_index is None or field is None:
            return None
        if self.packagelist[pack_index] is None:
            return None
        return self.packagelist[pack_index][field]

    def get_name(self, pack_index):
        return self._get_field(pack_index, self._name)

    def get_version(self, pack_index):
        return self._get_field(pack_index, self._version)

    def get_release(self, pack_index):
        return self._get_field(pack_index, self._release)

    def get_epoch(self, pack_index):
        return self._get_field(pack_index, self._epoch)


class ChannelList:

    def __init__(self, channeldata=None):
        if channeldata is None:
            self.channel_list = None
        else:
            self.channel_list = channeldata

        self._last_modified = 'last_modified'
        self._description = 'description'
        self._name = 'name'
        self._local_channel = 'local_channel'
        self._arch = 'arch'
        self._parent_channel = 'parent_channel'
        self._summary = 'summary'
        self._org_id = 'org_id'
        self._id = 'id'
        self._label = 'label'
        self._num_channels = None

    def set_channel_data(self, channeldata):
        if channeldata is None:
            self.channel_list = None
        else:
            self.channel_list = channeldata

    def get_num_channels(self):
        if self._num_channels is None:
            self._num_channels = len(self.channel_list)
        return self._num_channels

    def get_last_modified(self, ch_index):
        if self.channel_list[ch_index].has_key(self._last_modified):
            return self.channel_list[ch_index][self._last_modified]
        return None

    def get_description(self, ch_index):
        if self.channel_list[ch_index].has_key(self._description):
            return self.channel_list[ch_index][self._description]
        return None

    def get_name(self, ch_index):
        if self.channel_list[ch_index].has_key(self._name):
            return self.channel_list[ch_index][self._name]
        return None

    def get_local_channel(self, ch_index):
        if self.channel_list[ch_index].has_key(self._local_channel):
            return self.channel_list[ch_index][self._local_channel]
        return None

    def get_arch(self, ch_index):
        if self.channel_list[ch_index].has_key(self._arch):
            return self.channel_list[ch_index][self._arch]
        return None

    def get_parent_channel(self, ch_index):
        if self.channel_list[ch_index].has_key(self._parent_channel):
            return self.channel_list[ch_index][self._parent_channel]
        return None

    def get_summary(self, ch_index):
        if self.channel_list[ch_index].has_key(self._summary):
            return self.channel_list[ch_index][self._summary]
        return None

    def get_org_id(self, ch_index):
        if self.channel_list[ch_index].has_key(self._org_id):
            return self.channel_list[ch_index][self._org_id]
        return None

    def get_id(self, ch_index):
        if self.channel_list[ch_index].has_key(self._id):
            return self.channel_list[ch_index][self._id]
        return None

    def get_label(self, ch_index):
        if self.channel_list[ch_index].has_key(self._label):
            return self.channel_list[ch_index][self._label]
        return None


class LoginInfo:

    def __init__(self, logininfo=None):
        if logininfo is None:
            self.login_dict = None
        else:
            self.login_dict = logininfo

        self._server_key = 'X-RHN-Server-Id'
        self._user_key = 'X-RHN-Auth-User-Id'
        self._sig_key = 'X-RHN-Auth'
        self._time_key = 'X-RHN-Auth-Server-Time'
        self._expire_key = 'X-RHN-Auth-Expire-Offset'
        self._channel_key = 'X-RHN-Auth-Channels'

    def set_login_dict(self, login_dict):
        self.login_dict = login_dict

    def get_server_id(self):
        if self.login_dict.has_key(self._server_key):
            return str(self.login_dict[self._server_key])
        return None

    def get_user_id(self):
        if self.login_dict.has_key(self._user_key):
            return self.login_dict[self._user_key]
        return None

    def get_signature(self):
        if self.login_dict.has_key(self._sig_key):
            return self.login_dict[self._sig_key]
        return None

    def get_server_time(self):
        if self.login_dict.has_key(self._time_key):
            return self.login_dict[self._time_key]
        return None

    def get_expire_offset(self):
        if self.login_dict.has_key(self._expire_key):
            return self.login_dict[self._expire_key]
        return None

    def get_auth_channels(self):
        if self.login_dict.has_key(self._channel_key):
            return self.login_dict.has_key[self._channel_key]
        return None

if __name__ == "__main__":
    t = Test()
    lg = t.login()
    print("Server ID: " + lg.get_server_id())
    print("User ID: " + lg.get_user_id())
    print("Server Time: " + lg.get_server_time())
    print("Auth: " + lg.get_signature())
    print("Expire Offset: " + lg.get_expire_offset())

    list = t.list_channels()
    print("\n")
    for i in range(list.get_num_channels()):
        print("Channel Name: " + list.get_name(i))
        print("Channel Last Modified: " + list.get_last_modified(i))
        print("Channel Description: " + list.get_description(i))
        print("Channel Local Channel: " + list.get_local_channel(i))
        print("Channel Arch: " + list.get_arch(i))
        print("Channel Parent Channel: " + list.get_parent_channel(i))
        print("Channel Summary: " + list.get_summary(i))
        print("Channel org_id: " + list.get_org_id(i))
        print("Channel id: " + list.get_id(i))
        print("Channel label: " + list.get_label(i))

    print("")
    plist = t.list_packages()
    for j in range(plist.get_num_packages()):
        print("Package Name: " + plist.get_name(j))
        print("Package Version: " + plist.get_version(j))
        print("Package Release: " + plist.get_release(j))
        print("Package Epoch: " + plist.get_epoch(j))
        print("")

    #package = t.package([plist.get_name(0), plist.get_version(0), plist.get_release(0), plist.get_epoch(j)])
    # print package
    if sys.version_info[0] == 3:
        raw_input = input
    uname = raw_input("username:")
    password = raw_input("password:")
    email = raw_input("email:")
    org_id = raw_input("ord_id:")
    org_password = raw_input("org_password:")

    print(t.reserve_user(uname, password))
    print(t.new_user(uname, password, email, org_id, org_password))
 07070100000217000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002000000000spacewalk-backend/test/non-unit   07070100000218000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002700000000spacewalk-backend/test/non-unit/server    07070100000219000081B40000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000003300000000spacewalk-backend/test/non-unit/server/__init__.py    0707010000021A000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002E00000000spacewalk-backend/test/non-unit/server/rhnSQL 0707010000021B000081B40000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000003A00000000spacewalk-backend/test/non-unit/server/rhnSQL/__init__.py 0707010000021C000081B40000000000000000000000015FBBE8EE00001B2F000000000000000000000000000000000000003900000000spacewalk-backend/test/non-unit/server/rhnSQL/dbtests.py  #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

"""
Database specific tests for rhnSQL drivers.

These tests require a database connection, usually configured in a
rhntests-*.py script.
"""

import unittest

from random import randint

from spacewalk.server import rhnSQL
from spacewalk.server.rhnSQL import sql_base

TEST_IDS = [1, 2, 3]
TEST_NAMES = ["Bill", "Susan", "Joe"]
TEST_NUMS = [900.12, 600.49, 34.98]


class RhnSQLDatabaseTests(unittest.TestCase):

    """
    Database connection tests that can be run against any supported database.
    """

    def set_temp_table(self):
        self.temp_table = "testtable%s" % randint(1, 10000000)

    def setUp(self):
        # Expect self.temp_table to have been created by subclass by now:

        # insert_query = "INSERT INTO %s(id, name) VALUES($1, $2)" % \
        #        self.temp_table
        #cursor = rhnSQL.prepare(insert_query)
        #ids = [1, 2, 3, 4, 5]
        #names = ["Bill", "Ted", "Mary", "Tom", "Susan"]
        #cursor.executemany([ids, names])

        insert_query = "INSERT INTO %s(id, name, num) VALUES(:id, :name, :num)" % \
            self.temp_table
        cursor = rhnSQL.prepare(insert_query)
        cursor.execute(id=TEST_IDS[0], name=TEST_NAMES[0], num=TEST_NUMS[0])
        cursor.execute(id=TEST_IDS[1], name=TEST_NAMES[1], num=TEST_NUMS[1])
        cursor.execute(id=TEST_IDS[2], name=TEST_NAMES[2], num=TEST_NUMS[2])

    def tearDown(self):
        drop_table_query = "DROP TABLE %s" % self.temp_table
        cursor = rhnSQL.prepare(drop_table_query)
        cursor.execute()
        rhnSQL.commit()

    def test_execute_not_all_variables_bound(self):
        query = "INSERT INTO %s(id, name) VALUES(:id, :name)" % \
                self.temp_table
        cursor = rhnSQL.prepare(query)
        self.assertRaises(sql_base.SQLError, cursor.execute, name="Blah")

    def test_statement_prepare_error(self):
        rhnSQL.transaction("test_statement_prepare_error")

        query = "aaa bbb ccc"
        cursor = rhnSQL.prepare(query)
        self.assertRaises(rhnSQL.SQLError,
                          cursor.execute)

        rhnSQL.rollback("test_statement_prepare_error")

    def test_execute_bindbyname_extra_params_passed(self):
        query = "SELECT * FROM %s WHERE id = :id" % self.temp_table
        cursor = rhnSQL.prepare(query)
        cursor.execute(id=TEST_IDS[0], name="Sam")  # name should be ignored
        results = cursor.fetchone()
        self.assertEqual(TEST_IDS[0], results[0])
        self.assertEqual(TEST_NAMES[0], results[1])

    def test_executemany(self):
        query = "INSERT INTO %s(id, name) VALUES(:id, :name)" \
                % self.temp_table
        ids = [1000, 1001]
        names = ["Somebody", "Else"]

        cursor = rhnSQL.prepare(query)
        cursor.executemany(id=ids, name=names)

        query = rhnSQL.prepare("SELECT * FROM %s WHERE id >= 1000 ORDER BY ID"
                               % self.temp_table)
        query.execute()
        rows = query.fetchall()
        self.assertEqual(2, len(rows))

        self.assertEqual(1000, rows[0][0])
        self.assertEqual(1001, rows[1][0])
        self.assertEqual("Somebody", rows[0][1])
        self.assertEqual("Else", rows[1][1])

    def test_executemany2(self):
        query = "SELECT * FROM %s" \
                % self.temp_table
        cursor = rhnSQL.prepare(query)

        # Just want to see that this doesn't throw an exception:
        cursor.executemany()

    def test_execute_bulk(self):
        query = "INSERT INTO %s(id, name) VALUES(:id, :name)" \
                % self.temp_table
        ids = [1000, 1001]
        names = ["Somebody", "Else"]

        cursor = rhnSQL.prepare(query)
        d = {
            'id': ids,
            'name': names,
        }
        cursor.executemany(**d)

        query = rhnSQL.prepare("SELECT * FROM %s WHERE id >= 1000 ORDER BY ID"
                               % self.temp_table)
        query.execute()
        rows = query.fetchall()
        self.assertEqual(2, len(rows))

        self.assertEqual(1000, rows[0][0])
        self.assertEqual(1001, rows[1][0])
        self.assertEqual("Somebody", rows[0][1])
        self.assertEqual("Else", rows[1][1])

    def test_numeric_columns(self):
        h = rhnSQL.prepare("SELECT num FROM %s WHERE id = %s" %
                           (self.temp_table, TEST_IDS[0]))
        h.execute()
        row = h.fetchone()
        self.assertEqual(TEST_NUMS[0], row[0])

    def test_fetchone(self):
        query = "SELECT * FROM %s WHERE id = 1 ORDER BY id" % self.temp_table
        cursor = rhnSQL.prepare(query)
        cursor.execute()
        results = cursor.fetchone()
        self.assertEqual(TEST_IDS[0], results[0])
        self.assertEqual(TEST_NAMES[0], results[1])

    def test_fetchone_dict(self):
        query = "SELECT * FROM %s WHERE id = 1 ORDER BY id" % self.temp_table
        cursor = rhnSQL.prepare(query)
        cursor.execute()
        results = cursor.fetchone_dict()
        self.assertEqual(TEST_IDS[0], results['id'])
        self.assertEqual(TEST_NAMES[0], results['name'])
        self.assertEqual(TEST_NUMS[0], results['num'])

    def test_fetchall(self):
        query = rhnSQL.prepare("SELECT * FROM %s ORDER BY id" %
                               self.temp_table)
        query.execute()
        rows = query.fetchall()
        self.assertEqual(len(TEST_IDS), len(rows))

        i = 0
        while i < len(TEST_IDS):
            self.assertEqual(TEST_IDS[i], rows[i][0])
            self.assertEqual(TEST_NAMES[i], rows[i][1])
            i = i + 1

    def test_fetchall_dict(self):
        query = rhnSQL.prepare("SELECT * FROM %s ORDER BY id" %
                               self.temp_table)
        query.execute()
        rows = query.fetchall_dict()
        self.assertEqual(len(TEST_IDS), len(rows))

        i = 0
        while i < len(TEST_IDS):
            self.assertEqual(TEST_IDS[i], rows[i]['id'])
            self.assertEqual(TEST_NAMES[i], rows[i]['name'])
            i = i + 1

    def test_unicode_string_argument(self):
        query = rhnSQL.prepare("SELECT * FROM %s WHERE name=:name" %
                               self.temp_table)
        query.execute(name='blah')

#    def test_procedure(self):
#        sp = rhnSQL.Procedure("return_int")
#        ret = sp(5)
#        self.assertEquals(5, ret)
 0707010000021D000081FD0000000000000000000000015FBBE8EE00000BE5000000000000000000000000000000000000002E00000000spacewalk-backend/test/runtests-postgresql.py #!/usr/bin/python

#
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

"""
Non-pure tests requiring connectivity to a PostgreSQL server configured below.
"""

import os
import sys
import unittest

try:
    #  python 2
    from ConfigParser import ConfigParser
except ImportError:
    #  python3
    from configparser import ConfigParser
from spacewalk.server import rhnSQL

# Import all test modules here:
sys.path.insert(
    0,
    os.path.abspath(os.path.dirname(os.path.abspath(__file__) + "/../non-unit/server/rhnSQL/"))
)
import dbtests

config = ConfigParser()
config.read(os.path.dirname(os.path.abspath(__file__)) + "/db_settings.ini")

PG_HOST = config.get('postgresql', 'host')
PG_USER = config.get('postgresql', 'user')
PG_PASSWORD = config.get('postgresql', 'password')
PG_DATABASE = config.get('postgresql', 'database')

rhnSQL.initDB(backend="postgresql", host=PG_HOST, username=PG_USER,
              password=PG_PASSWORD, database=PG_DATABASE)

# Re-initialize to test re-use of connections:
rhnSQL.initDB(backend="postgresql", host=PG_HOST, username=PG_USER,
              password=PG_PASSWORD, database=PG_DATABASE)


class PostgreSQLDatabaseTests(dbtests.RhnSQLDatabaseTests):
    QUERY_CREATE_TABLE = """
        CREATE TABLE %s(id INT, name TEXT, num NUMERIC(5,2))
    """

    SIMPLE_PROCEDURE = """
CREATE OR REPLACE FUNCTION return_int(returnme INTEGER) RETURNS int AS $$
DECLARE
    myInt int;
BEGIN
    myInt := returnme;
    RETURN myInt;
END
$$ LANGUAGE 'plpgsql';
    """

    def setUp(self):
        self.set_temp_table()
        create_table_query = self.QUERY_CREATE_TABLE % self.temp_table
        cursor = rhnSQL.prepare(create_table_query)
        cursor.execute()

        dbtests.RhnSQLDatabaseTests.setUp(self)

        cursor = rhnSQL.prepare(self.SIMPLE_PROCEDURE)
        cursor.execute()

    def tearDown(self):
        try:
            cursor = rhnSQL.prepare("DROP FUNCTION return_int(returnme integer)")
            cursor.execute()
        except:
            pass

        dbtests.RhnSQLDatabaseTests.tearDown(self)


def suite():
    s = unittest.TestSuite()
    s.addTest(unittest.makeSuite(PostgreSQLDatabaseTests))
    # Append all test suites here:
    return unittest.TestSuite(s)

if __name__ == "__main__":
    try:
        import testoob
        testoob.main(defaultTest="suite")
    except ImportError:
        print("These tests would run prettier if you installed testoob. :)")
        unittest.main(defaultTest="suite")
   0707010000021E000081FD0000000000000000000000015FBBE8EE00000533000000000000000000000000000000000000002300000000spacewalk-backend/test/runtests.py    #!/usr/bin/python

#
# Copyright (c) 2008--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#

"""
Pure unit tests for the Spacewalk backend Python code.

These tests should require no network or disk access and run on just about
any system.
"""

import sys
import unittest

sys.path.insert(0, '../')
sys.path.insert(0, './suites')
sys.path.insert(0, '../../client/rhel/rhnlib')

# Import all test modules here:
import rhnsqltests


def suite():
    # Append all test suites here:
    return unittest.TestSuite((
        rhnsqltests.suite(),
    ))

if __name__ == "__main__":
    try:
        import testoob
        testoob.main(defaultTest="suite")
    except ImportError:
        print("These tests would run prettier if you install testoob. :)")
        unittest.main(defaultTest="suite")
 0707010000021F000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002000000000spacewalk-backend/upload_server   07070100000220000081B40000000000000000000000015FBBE8EE0000008C000000000000000000000000000000000000002900000000spacewalk-backend/upload_server/Makefile  # Makefile for the xmlrpc handlers
#

TOP	= ../
SUBDIR	= upload_server

FILES	= __init__

SUBDIRS = handlers

include $(TOP)/Makefile.defs

07070100000221000081B40000000000000000000000015FBBE8EE000002C0000000000000000000000000000000000000002C00000000spacewalk-backend/upload_server/__init__.py   #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# init module for the XML-RPC handlers. Bare.
#

# we stat all dirs anyway...
__all__ = []
07070100000222000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000002900000000spacewalk-backend/upload_server/handlers  07070100000223000081B40000000000000000000000015FBBE8EE0000009B000000000000000000000000000000000000003200000000spacewalk-backend/upload_server/handlers/Makefile # Makefile for the xmlrpc handlers
#

TOP	= ../..
SUBDIR	= upload_server/handlers

FILES	= __init__

SUBDIRS = package_push

include $(TOP)/Makefile.defs

 07070100000224000081B40000000000000000000000015FBBE8EE000002C0000000000000000000000000000000000000003500000000spacewalk-backend/upload_server/handlers/__init__.py  #
# Copyright (c) 2008--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
# init module for the XML-RPC handlers. Bare.
#

# we stat all dirs anyway...
__all__ = []
07070100000225000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000003600000000spacewalk-backend/upload_server/handlers/package_push 07070100000226000081B40000000000000000000000015FBBE8EE0000009E000000000000000000000000000000000000003F00000000spacewalk-backend/upload_server/handlers/package_push/Makefile    # Makefile for the xmlrpc module
#

TOP	= ../../..
SUBDIR	= upload_server/handlers/package_push

FILES	= __init__ package_push

include $(TOP)/Makefile.defs

  07070100000227000081B40000000000000000000000015FBBE8EE000002FE000000000000000000000000000000000000004200000000spacewalk-backend/upload_server/handlers/package_push/__init__.py #
# Copyright (c) 2008--2013 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
# This file defines the classes available for the XMLRPC receiver
#

__all__ = []

from . import package_push

upload_class = package_push.PackagePush
  07070100000228000081B40000000000000000000000015FBBE8EE000018D8000000000000000000000000000000000000004600000000spacewalk-backend/upload_server/handlers/package_push/package_push.py #
# Code that drops files on the filesystem (/PKG-UPLOAD)
#
#
# Copyright (c) 2008--2017 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

import os
import base64
import sys
from rhn import rpclib

from spacewalk.common import apache, rhnFlags
from spacewalk.common.rhnLog import log_debug, log_error
from spacewalk.common.rhnConfig import CFG
from spacewalk.common.rhnException import rhnFault
from spacewalk.server.importlib.importLib import InvalidArchError
from spacewalk.server import rhnPackageUpload, rhnSQL, basePackageUpload


class PackagePush(basePackageUpload.BasePackageUpload):

    def __init__(self, req):
        basePackageUpload.BasePackageUpload.__init__(self, req)
        self.required_fields.extend([
            'Auth',
            'Force',
        ])
        self.null_org = None
        # Default packaging is rpm
        self.packaging = 'rpm'
        self.username = None
        self.password = None
        self.force = None
        self.rel_package_path = None
        self.org_id = None
        self.package_path = None

    def headerParserHandler(self, req):
        ret = basePackageUpload.BasePackageUpload.headerParserHandler(self, req)
        # Optional headers
        maps = [['Null-Org', 'null_org'], ['Packaging', 'packaging']]
        for hn, sn in maps:
            header_name = "%s-%s" % (self.header_prefix, hn)
            if header_name in req.headers_in:
                setattr(self, sn, req.headers_in[header_name])

        if ret != apache.OK:
            return ret

        if CFG.SEND_MESSAGE_TO_ALL:
            rhnSQL.closeDB()
            log_debug(1, "send_message_to_all is set")

            rhnFlags.set("apache-return-code", apache.HTTP_NOT_FOUND)
            try:
                outage_message = open(CFG.MESSAGE_TO_ALL).read()
            except IOError:
                log_error("Missing outage message file")
                outage_message = "Outage mode"
            raise rhnFault(20001, outage_message, explain=0)

        # Init the database connection
        rhnSQL.initDB()
        use_session = 0
        if self.field_data.has_key('Auth-Session'):
            session_token = self.field_data['Auth-Session']
            use_session = 1
        else:
            encoded_auth_token = self.field_data['Auth']

        if not use_session:
            auth_token = self.get_auth_token(encoded_auth_token)

            if len(auth_token) < 2:
                log_debug(3, auth_token)
                raise rhnFault(105, "Unable to autenticate")

            self.username, self.password = auth_token[:2]

        force = self.field_data['Force']
        force = int(force)
        log_debug(1, "Username", self.username, "Force", force)

        if use_session:
            self.org_id, self.force = rhnPackageUpload.authenticate_session(session_token,
                                                                            force=force, null_org=self.null_org)
        else:
            # We don't push to any channels
            self.org_id, self.force = rhnPackageUpload.authenticate(self.username,
                                                                    self.password, force=force, null_org=self.null_org)

        return apache.OK

    def handler(self, req):
        ret = basePackageUpload.BasePackageUpload.handler(self, req)
        if ret != apache.OK:
            return ret

        a_pkg = rhnPackageUpload.save_uploaded_package(req,
                                                       (self.package_name, None, self.package_version,
                                                        self.package_release, self.package_arch),
                                                       str(self.org_id),
                                                       self.packaging,
                                                       self.file_checksum_type, self.file_checksum)

        self.rel_package_path = rhnPackageUpload.relative_path_from_header(
            a_pkg.header, org_id=self.org_id,
            checksum_type=a_pkg.checksum_type, checksum=a_pkg.checksum)
        self.package_path = os.path.join(CFG.MOUNT_POINT,
                                         self.rel_package_path)

        try:
            package_dict, diff_level = rhnPackageUpload.push_package(a_pkg,
                                                                     force=self.force,
                                                                     relative_path=self.rel_package_path,
                                                                     org_id=self.org_id)
        except InvalidArchError:
            e = sys.exc_info()[1]
            req.write(str(e))
            return apache.HTTP_NOT_ACCEPTABLE
        except Exception:
            e = sys.exc_info()[1]
            req.write(str(e))
            return apache.HTTP_BAD_REQUEST

        if diff_level:
            return self._send_package_diff(req, diff_level, package_dict)

        # Everything went fine
        rhnSQL.commit()
        reply = "All OK"
        req.headers_out['Content-Length'] = str(len(reply))
        req.send_http_header()
        req.write(reply)
        log_debug(2, "Returning with OK")

        return apache.OK

    @staticmethod
    def _send_package_diff(req, diff_level, diff):
        args = {
            'level': diff_level,
            'diff': diff,
        }
        reply = rpclib.xmlrpclib.dumps((args, ))
        ret_stat = apache.HTTP_BAD_REQUEST
        req.status = ret_stat
        req.err_headers_out['Content-Length'] = str(len(reply))
        req.send_http_header()
        req.write(reply)
        return apache.OK

    @staticmethod
    def get_auth_token(value):
        s = ''.join([x.strip() for x in value.split(',')])
        arr = list(map(base64.decodestring, s.split(':')))
        return arr
07070100000229000041FD0000000000000000000000015FBBE8EE00000000000000000000000000000000000000000000001700000000spacewalk-backend/wsgi    0707010000022A000081B40000000000000000000000015FBBE8EE000000C7000000000000000000000000000000000000002000000000spacewalk-backend/wsgi/Makefile   # Makefile for the wsgi module

TOP    = ..

SUBDIR = wsgi

FILES = __init__ app applet config config_tool package_push \
	 sat sat_dump  xmlrpc wsgiHandler wsgiRequest

include $(TOP)/Makefile.defs
 0707010000022B000081B40000000000000000000000015FBBE8EE00000267000000000000000000000000000000000000002300000000spacewalk-backend/wsgi/__init__.py    #
# Copyright (c) 2010--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#
 0707010000022C000081B40000000000000000000000015FBBE8EE000002FD000000000000000000000000000000000000001E00000000spacewalk-backend/wsgi/app.py #
# Copyright (c) 2010--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

from wsgi import wsgiHandler


def application(environ, start_response):
    return wsgiHandler.handle(environ, start_response, "app", "server.app")
   0707010000022D000081B40000000000000000000000015FBBE8EE00000303000000000000000000000000000000000000002100000000spacewalk-backend/wsgi/applet.py  #
# Copyright (c) 2010--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

from wsgi import wsgiHandler


def application(environ, start_response):
    return wsgiHandler.handle(environ, start_response, "applet", "server.applet")
 0707010000022E000081B40000000000000000000000015FBBE8EE0000030E000000000000000000000000000000000000002100000000spacewalk-backend/wsgi/config.py  #
# Copyright (c) 2010--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

from wsgi import wsgiHandler


def application(environ, start_response):
    return wsgiHandler.handle(environ, start_response, "config", "server.config-management")
  0707010000022F000081B40000000000000000000000015FBBE8EE00000318000000000000000000000000000000000000002600000000spacewalk-backend/wsgi/config_tool.py #
# Copyright (c) 2010--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

from wsgi import wsgiHandler


def application(environ, start_response):
    return wsgiHandler.handle(environ, start_response, "config_mgmt", "server.config-management-tool")
07070100000230000081B40000000000000000000000015FBBE8EE00000379000000000000000000000000000000000000002700000000spacewalk-backend/wsgi/package_push.py    #
# Copyright (c) 2010--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

from wsgi import wsgiHandler


def application(environ, start_response):
    return wsgiHandler.handle(environ, start_response,
                              "package_push", "server.upload.package-push",
                              "spacewalk.server.apacheUploadServer")
   07070100000231000081B40000000000000000000000015FBBE8EE000002FE000000000000000000000000000000000000001E00000000spacewalk-backend/wsgi/sat.py #
# Copyright (c) 2010--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#


from wsgi import wsgiHandler


def application(environ, start_response):
    return wsgiHandler.handle(environ, start_response, "sat", "server.iss")
  07070100000232000081B40000000000000000000000015FBBE8EE0000036F000000000000000000000000000000000000002300000000spacewalk-backend/wsgi/sat_dump.py    #
# Copyright (c) 2010--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

from wsgi import wsgiHandler


def application(environ, start_response):
    return wsgiHandler.handle(environ, start_response,
                              "non_auth_dumper", "server.iss",
                              "spacewalk.satellite_exporter.satexport")
 07070100000233000081B40000000000000000000000015FBBE8EE000008E4000000000000000000000000000000000000002600000000spacewalk-backend/wsgi/wsgiHandler.py #
# Copyright (c) 2010--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#

from wsgi import wsgiRequest


def handle(environ, start_response, server, component_type, servertype="spacewalk.server.apacheServer"):
    # wsgi seems to capitalize incoming headers and add HTTP- to the front :/
    # so we strip out the first 5 letters, and transform it into what we want.
    replacements = {'_': '-', 'Rhn': 'RHN', 'Md5Sum': 'MD5sum', 'Xml': 'XML', 'Actualuri': 'ActualURI'}
    for key in list(environ.keys()):
        if key[:5] == "HTTP_":
            new_key = key[5:].title()
            for k, v in list(replacements.items()):
                new_key = new_key.replace(k, v)
            environ[new_key] = environ[key]

    req = wsgiRequest.WsgiRequest(environ, start_response)
    req.set_option("SERVER", server)
    req.set_option("RHNComponentType", component_type)

    parseServ = get_handle(servertype, "HeaderParserHandler")
    ret = parseServ(req)

    if len(req.output) > 0 or ret != 0:
        if not req.sent_header:
            req.send_http_header(status=ret)
        return req.output

    appServ = get_handle(servertype, "Handler")
    ret = appServ(req)

    if not ret:
        ret = None

    if not req.sent_header:
        req.send_http_header(status=ret)

    # exporter doesn't have a logHandler
    if servertype != 'spacewalk.satellite_exporter.satexport':
        logServ = get_handle(servertype, "LogHandler")
        logServ(req)
    cleanServ = get_handle(servertype, "CleanupHandler")
    cleanServ(req)

    return req.output


def get_handle(servertype, name):
    handler_module = __import__(servertype, globals(), locals(), [servertype.split('.')[-1]])
    return getattr(handler_module, name)
07070100000234000081B40000000000000000000000015FBBE8EE000014CE000000000000000000000000000000000000002600000000spacewalk-backend/wsgi/wsgiRequest.py #
# Copyright (c) 2010--2016 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#


import socket
try:
    #  python 2
    import httplib
except ImportError:
    #  python3
    import http.client as httplib


class WsgiRequest:
    # pylint: disable=R0902

    def __init__(self, env, start_response):
        self.method = env['REQUEST_METHOD']
        self.headers_in = env
        self.path_info = env['PATH_INFO']
        self.start_response = start_response
        self.uri = self.unparsed_uri = env['REQUEST_URI']
        self.server = WsgiServer(env['SERVER_NAME'], env['SERVER_PORT'])
        self.connection = WsgiConnection(env)
        self.options = {}
        self.main = 0
        self.proto_num = float(env['SERVER_PROTOCOL'].split('/')[1])
        self.headers_out = WsgiMPtable()
        self.sent_header = 0
        self.content_type = ""
        self.the_request = env['REQUEST_METHOD'] + " " + env['SCRIPT_NAME'] + " " + env['SERVER_PROTOCOL']
        self.output = []
        self.err_headers_out = WsgiMPtable()
        self.status = ""
        self.sent_bodyct = 0
        self.sent_header = 0

    def set_option(self, key, value):
        self.options[key] = value

    def get_options(self):
        return self.options

    def get_config(self):
        return repr(self.__dict__)

    def write(self, msg):
        if isinstance(msg, str):
            msg = msg.encode()
        self.output.append(msg)

    def send_http_header(self, status=None):
        self.sent_header = 1
        self.status = str(self.status)
        if status is not None:
            self.status = str(status)
        if len(self.status) == 0 or self.status is None:
            self.status = "200"
        elif self.status.startswith("500"):
            for i in list(self.err_headers_out.items()):
                self.headers_out.add(i[0], i[1])

        if hasattr(httplib, "responses"):
            self.status = self.status + " " + httplib.responses[int(self.status)]
        else:
            # httplib in 2.4 did not have the responses dictionary
            # and mod_wsgi insists on having something after the numeric value
            self.status = self.status + " Status " + self.status

        if len(self.content_type) > 0:
            self.headers_out['Content-Type'] = self.content_type
        # default to text/xml
        if not self.headers_out.has_key('Content-Type'):
            self.headers_out['Content-Type'] = 'text/xml'

        self.start_response(self.status, list(self.headers_out.items()))
        return

    def get_remote_host(self, _rev=""):
        host = self.headers_in['REMOTE_ADDR']
        try:
            host = socket.gethostbyaddr(host)[0]
        except:
            # pylint: disable=W0702
            pass
        return host

    def read(self, buf=-1):
        return self.headers_in['wsgi.input'].read(buf)


class WsgiServer:
    # pylint: disable=R0903

    def __init__(self, hostname, port):
        self.server_hostname = hostname
        self.port = int(port)


class WsgiConnection:
    # pylint: disable=R0903

    def __init__(self, env):
        self.remote_ip = env['REMOTE_ADDR']
        self.local_addr = (env['SERVER_NAME'], env['SERVER_PORT'])


class WsgiMPtable:

    """ This class emulates mod_python's mp_table. See
        http://www.modpython.org/live/current/doc-html/pyapi-mptable.html

        The table object is a wrapper around the Apache APR table. The table
        object behaves very much like a dictionary (including the Python 2.2
        features such as support of the in operator, etc.), with the following
        differences:

        ...
        - Duplicate keys are allowed (see add() below). When there is more
          than one value for a key, a subscript operation returns a list.

        Much of the information that Apache uses is stored in tables.
        For example, req.headers_in and req.headers_out.
    """

    def __init__(self):
        self.dict = {}

    def add(self, key, value):
        if key in self.dict and value not in self.dict[key]:
            self.dict[key].append(str(value))
        else:
            self.dict[key] = [str(value)]

    def __contains__(self, key):
        return self.has_key(key)

    def __getitem__(self, key):
        if len(self.dict[key]) == 1:
            return self.dict[key][0]
        return self.dict[key]

    def __setitem__(self, key, value):
        self.dict[key] = [str(value)]

    def items(self):
        ilist = []
        for k, v in list(self.dict.items()):
            for vi in v:
                ilist.append((k, vi))
        return ilist

    def has_key(self, key):
        return key in self.dict

    def keys(self):
        return list(self.dict.keys())

    def __str__(self):
        return str(self.items())
  07070100000235000081B40000000000000000000000015FBBE8EE00000304000000000000000000000000000000000000002100000000spacewalk-backend/wsgi/xmlrpc.py  #
# Copyright (c) 2010--2015 Red Hat, Inc.
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are not licensed under GPLv2. No permission is
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
#


from wsgi import wsgiHandler


def application(environ, start_response):
    return wsgiHandler.handle(environ, start_response, "xmlrpc", "server.xmlrpc")
07070100000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000B00000000TRAILER!!!                                                                                                                                                                                                                                                                                                            