File spacewalk-utils-git-943.86f2a19.obscpio of Package spacewalk-utils
07070100000000000041FD00000000000000000000000368DD3ED300000000000000000000000000000000000000000000001000000000spacewalk-utils07070100000001000081B400000000000000000000000168DD3ED300004643000000000000000000000000000000000000001E00000000spacewalk-utils/COPYING.GPLv2 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.
07070100000002000081B400000000000000000000000168DD3ED30000894B000000000000000000000000000000000000001E00000000spacewalk-utils/COPYING.GPLv3 GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. 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
them 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 prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. 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.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey 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;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If 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 convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU 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 that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
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.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
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.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
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
state 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 3 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, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program 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, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU 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. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
07070100000003000081B400000000000000000000000168DD3ED30000040D000000000000000000000000000000000000001900000000spacewalk-utils/Makefile# Makefile for spacewalk-utils
#
NAME := spacewalk-utils
SUBDIR = utils
FILES = __init__ depsolver cloneByDate
SCRIPTS = spacewalk-common-channels \
spacewalk-clone-by-date spacewalk-manage-channel-lifecycle \
taskotop spacewalk-watch-channel-sync.sh
CONFIGS = spacewalk-common-channels.ini
DOCBOOK = $(wildcard /usr/bin/docbook2man)
SGMLS = $(wildcard *.sgml)
MANS = $(patsubst %.sgml,%.8,$(SGMLS) )
BINDIR = /usr/bin
MANDIR ?= /usr/man
CONFDIR = /etc/rhn
EXTRA_DIRS = $(MANDIR)/man8 $(BINDIR) $(CONFDIR)
include 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
install :: $(CONFIGS) $(PREFIX)/$(CONFDIR)
$(INSTALL_DATA) $(CONFIGS) $(PREFIX)/$(CONFDIR)
endif
%.new : %
sed -e 's|@@ROOT@@|$(ROOT)|g' <$* >$@
%.8 : %.sgml
$(DOCBOOK) $<
clean ::
@rm -fv $(MANS) manpage.* *.new
07070100000004000081B400000000000000000000000168DD3ED300000727000000000000000000000000000000000000001E00000000spacewalk-utils/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
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))
# what do we need to install and where
INSTALL_FILES += $(PYFILES)
INSTALL_DEST ?= $(ROOT)/$(SUBDIR)
DIRS += $(addprefix $(PREFIX), \
$(sort $(EXTRA_DIRS)) $(INSTALL_DEST))
all :: $(INSTALL_FILES)
install :: all $(DIRS) $(INSTALL_FILES)
@$(foreach f,$(INSTALL_FILES), \
$(INSTALL_DATA) $(f) $(PREFIX)$(INSTALL_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)
# extra toy targets
# Python checker support
PYTHONPATH = $(TOP)
PYCHECKER = pychecker
PYCHECKEROPTS = --maxreturns 10 --maxbranches 15
DBCHECKER = db-checker.py
DBCHECKEROPTS =
DB = user/pass@instance
pychecker :: $(PYFILES)
@PYTHONPATH=$(PYTHONPATH) $(PYCHECKER) $(PYCHECKEROPTS) $(PYFILES) || :
$(descend-subdirs)
db-checker :: $(PYFILES)
@PYTHONPATH=$(PYTHONPATH) $(TOP)/$(DBCHECKER) $(DBCHECKEROPTS) $(PYFILES) || :
$(descend-subdirs)
graphviz ::
@PYTHONPATH=$(PYTHONPATH) $(PYCHECKER) -Z $(PYCHECKEROPTS) $(PYFILES) || exit 0
07070100000005000081B400000000000000000000000168DD3ED30000047D000000000000000000000000000000000000002000000000spacewalk-utils/Makefile.pythonTHIS_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 grep python ./* | grep -rIzl '^#!/usr/bin') > reports/pylint.log || true
__pytest ::
$(call update_pip_env)
$(call install_pytest)
cd tests
pytest --disable-warnings --tb=native --color=yes -v
docker_pylint ::
docker run --rm -e $(DOCKER_RUN_EXPORT) $(DOCKER_VOLUMES) $(DOCKER_REGISTRY)/$(DOCKER_CONTAINER_BASE)-pgsql /bin/sh -c "cd /manager/utils; make -f Makefile.python __pylint"
docker_pytest ::
docker run --rm -e $(DOCKER_RUN_EXPORT) $(DOCKER_VOLUMES) $(DOCKER_REGISTRY)/$(DOCKER_CONTAINER_BASE)-pgsql /bin/sh -c "cd /manager/utils; make -f Makefile.python __pytest"
docker_shell ::
docker run -t -i --rm -e $(DOCKER_RUN_EXPORT) $(DOCKER_VOLUMES) $(DOCKER_REGISTRY)/$(DOCKER_CONTAINER_BASE)-pgsql /bin/bash
07070100000006000081B400000000000000000000000168DD3ED30000005C000000000000000000000000000000000000001C00000000spacewalk-utils/__init__.py# pylint: disable=missing-module-docstring
# Copyright (c) 2005, Red Hat Inc.
__all__ = []
07070100000007000081B400000000000000000000000168DD3ED30000A7C4000000000000000000000000000000000000001F00000000spacewalk-utils/cloneByDate.py# pylint: disable=missing-module-docstring,invalid-name
#
# Clonse channels by a particular date
#
# 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 shutil
import tempfile
import pprint
import subprocess
import datetime
import re
try:
import xmlrpclib
except ImportError:
import xmlrpc.client as xmlrpclib # pylint: disable=F0401
try:
from spacewalk.common import rhnLog
from spacewalk.common.rhnConfig import CFG, initCFG
from spacewalk.common.rhnLog import log_debug, log_clean
from spacewalk.satellite_tools.progress_bar import ProgressBar
from spacewalk.server import rhnSQL
except ImportError:
# pylint: disable=F0401
_LIBPATH = "/usr/share/rhn"
if _LIBPATH not in sys.path:
sys.path.append(_LIBPATH)
from server import rhnSQL
from common import rhnLog
from common.rhnLog import log_debug, log_clean
from common.rhnConfig import CFG, initCFG
from satellite_tools.progress_bar import ProgressBar
from .depsolver import DepSolver
LOG_LOCATION = "/var/log/rhn/errata-clone.log"
def confirm(txt, options):
if not options.assumeyes:
response = input(txt)
while ["y", "n"].count(response.lower()) == 0:
response = input(txt)
if response.lower() == "n":
print("Cancelling")
sys.exit(0)
print("")
def validate(channel_labels):
tmp_dirs = {}
for llabel in channel_labels:
label = llabel[0]
path = repodata(label)
tmp = tempfile.mkdtemp()
tmp_dirs[label] = tmp
# pylint: disable-next=consider-using-f-string
shutil.copytree(path, "%s/repodata/" % tmp)
cmd = ["repoclosure"]
for label, path in list(tmp_dirs.items()):
# pylint: disable-next=consider-using-f-string
cmd.append("--repofrompath=%s,%s" % (label, path))
# pylint: disable-next=consider-using-f-string
cmd.append("--repoid=%s" % (label))
subprocess.call(cmd)
for tmp in list(tmp_dirs.values()):
shutil.rmtree(tmp, True)
def repodata(label):
# pylint: disable-next=consider-using-f-string
return "%s/rhn/repodata/%s" % (CFG.REPOMD_CACHE_MOUNT_POINT, label)
def create_repodata_link(src_path, dst_path):
if not os.path.exists(os.path.dirname(dst_path)):
# create a dir if missing
os.makedirs(os.path.dirname(dst_path))
if not os.path.exists(dst_path):
if os.path.lexists(dst_path):
# remove dead links
os.unlink(dst_path)
# create the link
os.symlink(src_path, dst_path)
def remove_repodata_link(link_path):
if os.path.exists(link_path):
return os.unlink(link_path)
return None
def diff_packages(old, new):
old_hash = {}
new_hash = {}
to_ret = []
for pkg in old:
old_hash[pkg["id"]] = pkg
for pkg in new:
new_hash[pkg["id"]] = pkg
id_diff = set(new_hash.keys()) - set(old_hash.keys())
for pkg_id in id_diff:
to_ret.append(new_hash[pkg_id])
return to_ret
def main(options):
xmlrpc = RemoteApi(options.server, options.username, options.password)
db = DBApi()
initCFG("server")
rhnLog.initLOG(LOG_LOCATION)
cleansed = vars(options)
cleansed["password"] = "*****"
log_clean(0, "")
log_debug(0, "Started spacewalk-clone-by-date")
log_clean(0, pprint.pformat(cleansed))
print("Reading repository information.")
if options.use_update_date:
options.use_update_date = "update_date"
else:
options.use_update_date = "issue_date"
# pylint: disable-next=consider-using-f-string
print("Using %s." % options.use_update_date)
cloners = []
needed_channels = []
errata = None
if options.errata:
errata = set(options.errata)
for channel_list in options.channels:
parents = None
if options.parents:
# if only the dest parent is specified, look up the src parent
if len(options.parents) == 1:
src_parent = xmlrpc.get_original(options.parents[0])
if not src_parent:
# pylint: disable-next=consider-using-f-string
print(("Channel %s is not a cloned channel." % options.parents[0]))
sys.exit(1)
print(
# pylint: disable-next=consider-using-f-string
"Looking up the original channel for %s, %s found"
% (options.parents[0], src_parent)
)
options.parents = [src_parent] + options.parents
# options.parents is only set by command line, this must be the
# only channel tree
parents = options.parents
# Handle the new-style channel specification that uses
# key value pairs. Transform into channel / parent setup that
# ChannelTreeCloner expects. This code has to be here now that you can
# specify parents for multiple trees.
# TODO: the channel / parents structure needs to be cleaned up throught
# clone-by-date. Probably best thing would to make everywhere use the
# dict structure instead of the list structure.
for src_channel in list(channel_list.keys()):
dest_channel = channel_list[src_channel]
# new-style config file channel specification
if isinstance(dest_channel, dict):
if "label" not in dest_channel:
raise UserError(
# pylint: disable-next=consider-using-f-string
"You must specify a label for the clone of %s"
% src_channel
)
label = dest_channel["label"]
if "name" in dest_channel:
name = dest_channel["name"]
else:
name = label
if "summary" in dest_channel:
summary = dest_channel["summary"]
else:
summary = label
if "description" in dest_channel:
description = dest_channel["description"]
else:
description = label
# This is the options.parents equivalent for config files.
# Add channels to parents option and remove from channels.
if (
"existing-parent-do-not-modify" in dest_channel
and dest_channel["existing-parent-do-not-modify"]
):
parents = [src_channel, label]
del channel_list[src_channel]
else: # else tranform channel_list entry to the list format
channel_list[src_channel] = [label, name, summary, description]
# before we start make sure we can get repodata for all channels
# involved.
channel_labels = list(channel_list.keys())
for label in channel_labels:
if not os.path.exists(repodata(label)):
raise UserRepoError(label)
# ensure the parent's channel metadata is available
if parents:
for label in parents:
if not os.path.exists(repodata(label)):
raise UserRepoError(label)
# if cloning specific errata validate that they actually exist
# in the original channels
if options.errata:
for channel in channel_labels:
channel_errata = set(xmlrpc.list_errata(channel))
if set(errata - channel_errata):
print(
(
"Error: all errata specified with --errata must "
+ "exist in every original channel cloned in "
+ "this operation."
)
)
print(
(
# pylint: disable-next=consider-using-f-string
"Channel %s does not contain these errata: %s"
% (channel, errata - channel_errata)
)
)
sys.exit(1)
tree_cloner = ChannelTreeCloner(
channel_list,
xmlrpc,
db,
options.to_date,
options.blacklist,
options.removelist,
options.security_only,
options.use_update_date,
options.no_errata_sync,
errata,
options.skip_errata_depsolve,
parents,
)
cloners.append(tree_cloner)
needed_channels += list(tree_cloner.needing_create().values())
if options.validate:
if needed_channels:
raise UserError(
# pylint: disable-next=consider-using-f-string
"Cannot validate channels that do not exist %s"
% ", ".join(map(str, needed_channels))
)
for channel_list in options.channels:
validate(list(channel_list.values()))
return
if needed_channels:
print("\nBy continuing the following channels will be created: ")
print(", ".join(needed_channels))
confirm("\nContinue with channel creation (y/n)?", options)
for cloner in cloners:
cloner.create_channels(options.skip_depsolve)
for tree_cloner in cloners:
tree_cloner.prepare()
if options.dry_run:
for tree_cloner in cloners:
d_errata = {}
separator = "|"
d_errata = tree_cloner.get_errata_to_clone()
now = datetime.datetime.now()
for ch in d_errata:
log_file = ch + "_" + now.strftime("%Y-%m-%d-%H:%M")
print("# Log file: " + log_file)
# pylint: disable-next=unspecified-encoding
fh = open(log_file, "w")
for errata in d_errata[ch]:
line = ""
for item in list(set(errata) - set(["id"])):
line = line + str(errata[item]) + separator
fh.write(line + "\n")
fh.close()
sys.exit(0)
print("\nBy continuing the following will be cloned:")
total = 0
for cloner in cloners:
cloner.pre_summary()
total += cloner.pending()
if total == 0:
print("\nNo errata to clone, checking removelist.")
for cloner in cloners:
cloner.remove_packages()
sys.exit(0)
confirm("\nContinue with clone (y/n)?", options)
for cloner in cloners:
cloner.clone(options.skip_depsolve)
cloner.remove_packages()
class ChannelTreeCloner:
"""Usage:
a = ChannelTreeCloner(channel_hash, xmlrpc, db, to_date, blacklist,
removelist, security_only, use_update_date,
no_errata_sync, errata, skip_errata_depsolve, parents)
a.create_channels()
a.prepare()
a.clone()
"""
# pylint: disable=R0902
def __init__(
self,
channels,
remote_api,
db_api,
to_date,
blacklist,
removelist,
security_only,
use_update_date,
no_errata_sync,
errata,
skip_errata_depsolve,
parents=None,
):
self.remote_api = remote_api
self.db_api = db_api
self.channel_map = channels
self.to_date = to_date
self.cloners = []
self.blacklist = blacklist
self.removelist = removelist
if parents:
self.src_parent = parents[0]
self.dest_parent = parents[1]
self.parents_specified = True
else:
self.src_parent = None
self.dest_parent = None
self.parents_specified = False
self.channel_details = None
self.security_only = security_only
self.use_update_date = use_update_date
self.no_errata_sync = no_errata_sync
self.skip_errata_depsolve = skip_errata_depsolve
self.solver = None
self.visited = {}
self.validate_source_channels()
for from_label in self.ordered_labels():
to_label = self.channel_map[from_label][0]
cloner = ChannelCloner(
from_label,
to_label,
self.to_date,
self.remote_api,
self.db_api,
self.security_only,
self.use_update_date,
self.no_errata_sync,
errata,
skip_errata_depsolve,
)
self.cloners.append(cloner)
def needing_create(self):
"""
returns a trimmed down version of channel_map where the
value needs creating
"""
to_create = {}
existing = self.remote_api.list_channel_labels()
if self.parents_specified:
if self.dest_parent not in existing or self.src_parent not in existing:
raise UserError(
"Channels specified with --parents must"
+ " already exist.\nIf you want to clone the"
+ " parent channels too simply add another"
+ " --channels option."
)
for src, dest in list(self.channel_map.items()):
if dest[0] not in existing:
to_create[src] = dest[0]
return to_create
def pending(self):
total = 0
for cloner in self.cloners:
total += cloner.pending()
return total
def find_cloner(self, src_label):
for cloner in self.cloners:
if cloner.src_label() == src_label:
return cloner
return None
def create_channels(self, skip_depsolve=False):
to_create = self.needing_create()
if not to_create:
return
if self.parents_specified:
dest_parent = [self.dest_parent]
else:
dest_parent = self.channel_map[self.src_parent]
nvreas = []
# clone the destination parent if it doesn't exist
if dest_parent[0] in list(to_create.values()):
self.remote_api.clone_channel(self.src_parent, dest_parent, None)
del to_create[self.src_parent]
cloner = self.find_cloner(self.src_parent)
nvreas += [pkg["nvrea"] for pkg in list(cloner.reset_new_pkgs().values())]
# clone the children
for cloner in self.cloners:
if cloner.dest_label() in list(to_create.values()):
dest = self.channel_map[cloner.src_label()]
self.remote_api.clone_channel(cloner.src_label(), dest, dest_parent[0])
nvreas += [
pkg["nvrea"] for pkg in list(cloner.reset_new_pkgs().values())
]
# dep solve all added packages with the parent channel
if not skip_depsolve:
# pylint: disable-next=superfluous-parens
self.dep_solve(nvreas, labels=(list(to_create.keys()) + [self.src_parent]))
def validate_source_channels(self):
self.channel_details = self.remote_api.channel_details(
self.channel_map, values=False
)
if not self.src_parent:
self.src_parent = self.find_parent(list(self.channel_map.keys()))
self.validate_children(self.src_parent, list(self.channel_map.keys()))
def validate_dest_channels(self):
self.channel_details = self.remote_api.channel_details(self.channel_map)
if not self.dest_parent:
self.dest_parent = self.find_parent(list(self.channel_map.values()))
self.validate_children(self.dest_parent, list(self.channel_map.values()))
def validate_children(self, parent, channel_list):
"""Make sure all children are children of the parent"""
for channel in channel_list:
if isinstance(channel, type([])):
channel = channel[0]
if channel != parent:
if self.channel_details[channel]["parent_channel_label"] != parent:
raise UserError(
(
"Child channel '%s' is not a child of "
+ "parent channel '%s'. If you are using --config "
+ "ensure you have not specified "
+ "existing-parent-do-not-modify on a child "
+ "channel."
)
% (channel, parent)
)
def find_parent(self, label_list):
found_list = []
for label in label_list:
if isinstance(label, type([])):
label = label[0]
if self.channel_details[label]["parent_channel_label"] == "":
found_list.append(label)
if not found_list:
raise UserError("Parent Channel not specified.")
if len(found_list) > 1:
raise UserError(
"Multiple parent channels specified within the " + "same channel tree."
)
return found_list[0]
def ordered_labels(self):
"""Return list of labels with parent first"""
if self.parents_specified:
return list(self.channel_map.keys())
labels = list(self.channel_map.keys())
labels.remove(self.src_parent)
labels.insert(0, self.src_parent)
return labels
def prepare(self):
self.validate_dest_channels()
for cloner in self.cloners:
cloner.prepare()
def get_errata_to_clone(self):
d_result = {}
for cloner in self.cloners:
d_result[cloner.src_label() + "_to_" + cloner.dest_label()] = (
cloner.get_errata_to_clone()
)
return d_result
def pre_summary(self):
for cloner in self.cloners:
cloner.pre_summary()
def clone(self, skip_depsolve=False):
added_pkgs = []
for cloner in self.cloners:
cloner.process()
pkg_diff = cloner.pkg_diff()
added_pkgs += pkg_diff
log_clean(0, "")
log_clean(
0,
# pylint: disable-next=consider-using-f-string
"%i packages were added to %s as a result of clone:"
% (len(pkg_diff), cloner.dest_label()),
)
sorted_pkg_diff = sorted(pkg_diff, key=lambda p: p["nvrea"])
log_clean(0, "\n".join([pkg["nvrea"] for pkg in sorted_pkg_diff]))
if added_pkgs and not skip_depsolve:
self.dep_solve([pkg["nvrea"] for pkg in added_pkgs])
def dep_solve(self, nvrea_list, labels=None):
if not labels:
labels = list(self.channel_map.keys())
repos = [{"id": label, "relative_path": repodata(label)} for label in labels]
print("Copying repodata, please wait.")
# dep solver expects the metadata to be in /repodata directory;
# create temporary symlinks
temp_repo_links = []
repo = None
for repo in repos:
# pylint: disable-next=consider-using-f-string
repodata_path = "%s/repodata" % (repo["relative_path"])
create_repodata_link(repo["relative_path"], repodata_path)
temp_repo_links.append(repodata_path)
try:
try:
self.solver = DepSolver(repos)
self.__dep_solve(nvrea_list)
self.report_depsolve_results()
except Exception as e:
# pylint: disable-next=raise-missing-from
raise UserRepoError(repo["id"], e)
finally:
# clean up temporary symlinks
for link in temp_repo_links:
remove_repodata_link(link)
def __dep_solve(self, nvrea_list):
self.solver.setPackages(nvrea_list)
dep_results = self.solver.processResults(self.solver.getDependencylist())
self.process_deps(dep_results)
def process_deps(self, deps):
# pylint: disable-next=unnecessary-lambda-assignment
list_to_set = lambda x: set(
[tuple(y) for y in x]
) # pylint: disable=consider-using-set-comprehension
needed_list = dict(
(channel[0], []) for channel in list(self.channel_map.values())
)
for cloner in self.cloners:
if not cloner.dest_label() in self.visited:
self.visited[cloner.dest_label()] = list_to_set(
needed_list[cloner.dest_label()]
)
self.visited[cloner.dest_label()] |= list_to_set(
needed_list[cloner.dest_label()]
)
print("Processing Dependencies:")
pb = ProgressBar(
prompt="",
endTag=" - complete",
finalSize=len(deps),
finalBarLength=40,
stream=sys.stdout,
)
pb.printAll(1)
# loop through all the deps and find any that don't exist in the
# destination channels
for pkg in deps:
pb.addTo(1)
pb.printIncrement()
for solved_list in list(pkg.values()):
for cloner in self.cloners:
if cloner.src_pkg_exist(solved_list) and not cloner.dest_pkg_exist(
solved_list
):
# grab oldest package
needed_list[cloner.dest_label()].append(solved_list[0])
added_nevras = set()
for cloner in self.cloners:
needed = needed_list[cloner.dest_label()]
needed_str = list_to_set(needed)
for needed_pkg in needed_str:
if needed_pkg in self.visited[cloner.dest_label()]:
while list(needed_pkg) in needed:
needed.remove(list(needed_pkg))
self.visited[cloner.dest_label()] |= needed_str
if needed:
next_added = set(cloner.process_deps(needed))
added_nevras = added_nevras | next_added
cloner.total_added_nevras += len(next_added)
pb.printComplete()
# recursively solve dependencies to get dependencies-of-dependencies
if added_nevras:
print("Dependencies added, looking for new dependencies")
self.__dep_solve(list(added_nevras))
def remove_packages(self):
for cloner in self.cloners:
if self.removelist:
cloner.remove_removelist(self.removelist)
if self.blacklist:
cloner.remove_blacklisted(self.blacklist)
def report_depsolve_results(self):
reported = 0
for cloner in self.cloners:
if cloner.total_added_nevras > 0:
reported = 1
print(
# pylint: disable-next=consider-using-f-string
"%s RPM(s) added to %s to resolve dependencies."
% (cloner.total_added_nevras, cloner.dest_label())
)
cloner.total_added_nevras = 0
if cloner.total_added_errata > 0:
reported = 1
print(
# pylint: disable-next=consider-using-f-string
"%s errata added to %s to resolve dependencies."
% (cloner.total_added_errata, cloner.dest_label())
)
cloner.total_added_errata = 0
if reported:
# pylint: disable-next=consider-using-f-string
print("Please see %s for details." % LOG_LOCATION)
# pylint: disable-next=missing-class-docstring
class ChannelCloner:
# pylint: disable=R0902
def __init__(
self,
from_label,
to_label,
to_date,
remote_api,
db_api,
security_only,
use_update_date,
no_errata_sync,
errata,
skip_errata_depsolve,
):
self.total_added_nevras = 0
self.total_added_errata = 0
self.remote_api = remote_api
self.db_api = db_api
self.from_label = from_label
self.to_label = to_label
self.to_date = to_date
self.from_pkg_hash = None
self.errata_to_clone = None
self.available_errata = None
self.new_pkg_hash = {}
self.old_pkg_hash = {}
self.security_only = security_only
self.use_update_date = use_update_date
self.no_errata_sync = no_errata_sync
self.errata = errata
self.skip_errata_depsolve = skip_errata_depsolve
# construct a set of every erratum name in the original channel
self.original_errata = set(self.remote_api.list_errata(self.from_label))
self.original_pid_errata_map = {}
self.bunch_size = 10
def dest_label(self):
return self.to_label
def src_label(self):
return self.from_label
def pkg_diff(self):
return diff_packages(
list(self.old_pkg_hash.values()), list(self.new_pkg_hash.values())
)
def reset_original_pkgs(self):
self.old_pkg_hash = dict(
(pkg["nvrea"], pkg) for pkg in self.remote_api.list_packages(self.to_label)
)
return self.old_pkg_hash
def reset_new_pkgs(self):
self.new_pkg_hash = dict(
(pkg["nvrea"], pkg) for pkg in self.remote_api.list_packages(self.to_label)
)
return self.new_pkg_hash
def reset_from_pkgs(self):
self.from_pkg_hash = dict(
(pkg["nvrea"], pkg)
for pkg in self.remote_api.list_packages(self.from_label)
)
def prepare(self):
self.reset_original_pkgs()
self.errata_to_clone, self.available_errata = self.get_errata()
def pending(self):
return len(self.errata_to_clone)
def get_errata_to_clone(self):
return self.errata_to_clone
def pre_summary(self):
print(
# pylint: disable-next=consider-using-f-string
" %s -> %s (%i/%i Errata)"
% (
self.from_label,
self.to_label,
len(self.errata_to_clone),
len(self.available_errata),
)
)
def process(self):
self.clone()
# print "New packages added: %i" % (len(self.new_pkg_hash)
# - len(self.old_pkg_hash))
def process_deps(self, needed_pkgs):
needed_ids = []
needed_names = set()
for pkg in needed_pkgs:
found = self.src_pkg_exist([pkg])
if found:
needed_ids.append(found["id"])
needed_names.add(found["nvrea"])
needed_errata = set() # list, [0] = advisory, [1] = synopsis
still_needed_pids = []
for pid in needed_ids:
if pid not in self.original_pid_errata_map:
errata_list = self.remote_api.list_providing_errata(pid)
for erratum in errata_list:
if erratum["advisory"] in self.original_errata:
self.original_pid_errata_map[pid] = erratum["advisory"]
needed_errata.add(
(self.original_pid_errata_map[pid], erratum["synopsis"])
)
break
else: # no match found, store so we don't repeat search
self.original_pid_errata_map[pid] = None
still_needed_pids.append(pid)
needed_ids = still_needed_pids
# Log the RPMs we're adding due to dep-solving
needed_name_set = sorted(set(needed_names))
if needed_name_set:
log_clean(0, "")
log_clean(
0,
# pylint: disable-next=consider-using-f-string
"Adding %i RPM(s) needed for dependencies to %s"
% (len(needed_name_set), self.to_label),
)
for name in needed_name_set:
log_clean(0, name)
# Clone (and log) the errata we are adding for same
if needed_errata:
self.total_added_errata += len(needed_errata)
log_clean(0, "")
log_clean(
0,
# pylint: disable-next=consider-using-f-string
"Cloning %i errata for dependencies to %s :"
% (len(needed_errata), self.to_label),
)
needed_errata_list = sorted(list(needed_errata))
while needed_errata_list:
errata_set = needed_errata_list[: self.bunch_size]
del needed_errata_list[: self.bunch_size]
for e in errata_set:
# pylint: disable-next=consider-using-f-string
log_clean(0, "%s - %s" % e)
if not self.skip_errata_depsolve:
e_pkgs = self.remote_api.get_erratum_packages(e[0])
else:
e_pkgs = []
for pkg in e_pkgs:
if self.from_label in pkg["providing_channels"]:
# pylint: disable-next=consider-using-f-string
pkg["nvrea"] = "%s-%s-%s.%s" % (
pkg["name"],
pkg["version"],
pkg["release"],
pkg["arch_label"],
)
needed_names.add(pkg["nvrea"])
self.remote_api.clone_errata(self.to_label, [e[0] for e in errata_set])
if needed_ids:
self.remote_api.add_packages(self.to_label, needed_ids)
self.reset_new_pkgs()
return needed_names
def src_pkg_exist(self, needed_list):
if not self.from_pkg_hash:
self.reset_from_pkgs()
return self.pkg_exists(needed_list, self.from_pkg_hash)
def dest_pkg_exist(self, needed_list):
return self.pkg_exists(needed_list, self.new_pkg_hash)
@staticmethod
def pkg_exists(needed_list, pkg_list):
"""Given a list of packages in [N, EVR, A] format, do any of them
exist in the pkg_hash with key of N-V-R.A format"""
for i in needed_list:
# pylint: disable-next=consider-using-f-string
key = "%s-%s-.%s" % (i[0], i[1], i[2])
if key in pkg_list:
return pkg_list[key]
return False
def clone(self):
errata_ids = [e["advisory_name"] for e in self.errata_to_clone]
if not errata_ids:
return
# pylint: disable-next=consider-using-f-string
msg = "Cloning Errata into %s (%i):" % (self.to_label, len(errata_ids))
print(msg)
log_clean(0, "")
log_clean(0, msg)
for e in sorted(self.errata_to_clone, key=lambda x: x["advisory_name"]):
# pylint: disable-next=consider-using-f-string
log_clean(0, "%s - %s" % (e["advisory_name"], e["synopsis"]))
pb = ProgressBar(
prompt="",
endTag=" - complete",
finalSize=len(errata_ids),
finalBarLength=40,
stream=sys.stdout,
)
pb.printAll(1)
while errata_ids:
errata_set = errata_ids[: self.bunch_size]
del errata_ids[: self.bunch_size]
self.remote_api.clone_errata(self.to_label, errata_set)
pb.addTo(self.bunch_size)
pb.printIncrement()
# align modular metadata
md_aligned = self.remote_api.align_modular_metadata(
self.from_label, self.to_label
)
if md_aligned == 1:
print("\nModular metadata aligned")
self.reset_new_pkgs()
pb.printComplete()
if not self.no_errata_sync:
log_clean(0, "")
# pylint: disable-next=consider-using-f-string
log_clean(0, "Synchronizing Errata in %s with originals" % self.to_label)
self.remote_api.sync_errata(self.to_label)
def get_errata(self):
"""Returns tuple of all available for cloning and what falls in
the date range or is in the errata list"""
available_errata = self.db_api.applicable_errata(self.from_label, self.to_label)
to_clone = []
for err in available_errata:
if self.errata:
if err["advisory_name"] in self.errata:
to_clone.append(err)
else:
if (
self.to_date
and err[self.use_update_date].date() <= self.to_date.date()
):
if self.security_only:
if err["advisory_type"] == "Security Advisory":
to_clone.append(err)
else:
to_clone.append(err)
return (to_clone, available_errata)
def __remove_packages(self, names_dict, pkg_list, name):
"""Base removal of packages
names_dict - dict containing list of package names, with channel
lables as keys
pkg_list - list of package dicts to consider
name - name of removal 'blacklist' or 'removelist', for display
"""
found_ids = []
found_names = []
if not names_dict:
return
full_pkgs = []
if "ALL" in names_dict:
full_pkgs += names_dict["ALL"]
if self.dest_label() in names_dict:
full_pkgs += names_dict[self.dest_label()]
# removes all empty string pattern from the list
# e.g.: ["", ".*apache.*"] ==> [".*apache.*"], see bsc#1089396
full_pkgs = [x for x in full_pkgs if x != ""]
reg_ex = re.compile("|".join(full_pkgs))
# do the matching only if there is a reg_ex criteria
if reg_ex.pattern:
for pkg in pkg_list:
if reg_ex.match(pkg["name"]):
found_ids.append(pkg["id"])
found_names.append(pkg["nvrea"])
log_clean(0, "")
log_clean(
0,
# pylint: disable-next=consider-using-f-string
"%s: Removing %i packages from %s." % (name, len(found_ids), self.to_label),
)
log_clean(0, "\n".join(found_names))
if found_ids:
print(
# pylint: disable-next=consider-using-f-string
"%s: Removing %i packages from %s"
% (name, len(found_ids), self.to_label)
)
self.remote_api.remove_packages(self.to_label, found_ids)
def remove_removelist(self, pkg_names):
self.__remove_packages(
pkg_names, list(self.reset_new_pkgs().values()), "Removelist"
)
def remove_blacklisted(self, pkg_names):
self.reset_new_pkgs()
self.__remove_packages(pkg_names, self.pkg_diff(), "Blacklist")
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:
# pylint: disable-next=raise-missing-from
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 key in self.cache:
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 channel_details(self, label_hash, keys=True, values=True):
self.auth_check()
to_ret = {}
for src, dst in list(label_hash.items()):
if keys:
to_ret[src] = self.get_details(src)
if values:
to_ret[dst[0]] = self.get_details(dst[0])
return to_ret
def list_packages(self, label):
self.auth_check()
pkg_list = self.client.channel.software.listAllPackages(self.auth_token, label)
# name-ver-rel.arch,
for pkg in pkg_list:
# pylint: disable-next=consider-using-f-string
pkg["nvrea"] = "%s-%s-%s.%s" % (
pkg["name"],
pkg["version"],
pkg["release"],
pkg["arch_label"],
)
return pkg_list
def clone_errata(self, to_label, errata_list):
self.auth_check()
self.client.errata.cloneAsOriginal(self.auth_token, to_label, errata_list)
def sync_errata(self, to_label):
self.auth_check()
self.client.channel.software.syncErrata(self.auth_token, to_label)
def align_modular_metadata(self, from_label, to_label):
return self.client.channel.software.alignMetadata(
self.auth_token, from_label, to_label, "modules"
)
def get_details(self, label):
self.auth_check()
try:
return self.client.channel.software.getDetails(self.auth_token, label)
except xmlrpclib.Fault as e:
# pylint: disable-next=raise-missing-from
raise UserError(e.faultString + ": " + label)
def add_packages(self, label, package_ids):
self.auth_check()
while package_ids:
pkg_set = package_ids[:20]
del package_ids[:20]
self.client.channel.software.addPackages(self.auth_token, label, pkg_set)
def remove_packages(self, label, package_ids):
self.auth_check()
while package_ids:
pkg_set = package_ids[:20]
del package_ids[:20]
self.client.channel.software.removePackages(self.auth_token, label, pkg_set)
def clone_channel(self, original_label, channel, parent):
self.auth_check()
details = {"name": channel[0], "label": channel[0], "summary": channel[0]}
if len(channel) > 1:
details["name"] = channel[1]
if len(channel) > 2:
details["summary"] = channel[2]
if len(channel) > 3:
details["description"] = channel[3]
if parent and parent != "":
details["parent_label"] = parent
# pylint: disable-next=consider-using-f-string
msg = "Cloning %s to %s with original package set." % (
original_label,
details["label"],
)
log_clean(0, "")
log_clean(0, msg)
print(msg)
self.client.channel.software.clone(
self.auth_token, original_label, details, True
)
def list_errata(self, channel_label):
self.auth_check()
errata = self.client.channel.software.listErrata(self.auth_token, channel_label)
return [erratum["advisory_name"] for erratum in errata]
def get_original(self, clone_label):
self.auth_check()
return self.client.channel.software.getDetails(self.auth_token, clone_label)[
"clone_original"
]
def list_providing_errata(self, pid):
self.auth_check()
return self.client.packages.listProvidingErrata(self.auth_token, pid)
def get_erratum_packages(self, advisory_name):
self.auth_check()
return self.client.errata.listPackages(self.auth_token, advisory_name)
class DBApi:
"""Class for connecting to the spacewalk DB"""
def __init__(self):
initCFG("server")
rhnSQL.initDB()
@staticmethod
def applicable_errata(from_label, to_label):
"""list of errata that is applicable to be cloned, used db because we
need to exclude cloned errata too"""
h = rhnSQL.prepare(
"""
select e.id, e.advisory_name, e.advisory_type, e.issue_date,
e.synopsis, e.update_date
from rhnErrata e inner join
rhnChannelErrata ce on e.id = ce.errata_id inner join
rhnChannel c on c.id = ce.channel_id
where C.label = :from_label and
e.id not in
(select e2.id
from rhnErrata e2 inner join
rhnChannelErrata ce2 on ce2.errata_id = e2.id inner join
rhnChannel c2 on c2.id = ce2.channel_id
where c2.label = :to_label
UNION
select cloned.original_id
from rhnErrata e2 inner join
rhnErrataCloned cloned on cloned.id = e2.id inner join
rhnChannelErrata ce2 on ce2.errata_id = e2.id inner join
rhnChannel c2 on c2.id = ce2.channel_id
where c2.label = :to_label)
"""
)
h.execute(from_label=from_label, to_label=to_label)
to_ret = h.fetchall_dict() or []
return to_ret
class UserError(Exception):
def __init__(self, msg):
Exception.__init__(self)
self.msg = msg
def __str__(self):
return self.msg
# pylint: disable-next=missing-class-docstring
class UserRepoError(UserError):
def __init__(self, label, error=None):
msg = (
"Unable to read repository information.\n"
+ "Please verify repodata has been generated in "
# pylint: disable-next=consider-using-f-string
+ "/var/cache/rhn/repodata/%s." % label
)
if error:
# pylint: disable-next=consider-using-f-string
msg += "\nError: %s" % error
UserError.__init__(self, msg)
07070100000008000081B400000000000000000000000168DD3ED300002683000000000000000000000000000000000000001D00000000spacewalk-utils/depsolver.py# pylint: disable=missing-module-docstring
#
# -*- coding: utf-8 -*-
#
# Copyright (c) 2012--2017 Red Hat, Inc.
#
# Lookup package dependencies in a yum repository
#
# This software is licensed to you under the GNU General Public License,
# version 2 (GPLv2). There is NO WARRANTY for this software, express or
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
# along with this software; if not, see
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
#
# Red Hat trademarks are 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 logging
import sys
from optparse import OptionParser # pylint: disable=deprecated-module
import os
import solv
import yaml
try:
from spacewalk.satellite_tools.progress_bar import ProgressBar
except ImportError:
# pylint: disable=F0401
_LIBPATH = "/usr/share/rhn"
if _LIBPATH not in sys.path:
sys.path.append(_LIBPATH)
from satellite_tools.progress_bar import ProgressBar
log = logging.getLogger(__name__)
CACHE_DIR = "/tmp/cache/yum"
PERSIST_DIR = "/var/lib/yum"
# pylint: disable-next=missing-class-docstring
class DepSolver:
def __init__(self, repos, pkgs_in=None, quiet=True):
self._override_sigchecks = False
self.quiet = quiet
self.pkgs = pkgs_in or []
self.repos = repos
self.pool = solv.Pool()
self.setup()
# pylint: disable-next=invalid-name
def setPackages(self, pkgs_in):
self.pkgs = pkgs_in
def setup(self):
"""
Load the repos into repostore to query package dependencies
"""
for repo in self.repos:
solv_repo = self.pool.add_repo(str(repo["id"]))
solv_path = os.path.join(repo["relative_path"], "solv")
if not os.path.isfile(solv_path) or not solv_repo.add_solv(
solv.xfopen(str(solv_path)), 0
):
# pylint: disable-next=broad-exception-raised
raise Exception(
# pylint: disable-next=consider-using-f-string
"Repository solv file cannot be found at: {}".format(solv_path)
)
self.pool.addfileprovides()
self.pool.createwhatprovides()
# pylint: disable-next=invalid-name
def getDependencylist(self):
"""
Get dependency list and suggested packages for package names provided.
The dependency lookup is only one level in this case.
The package name format could be any of the following:
name, name.arch, name-ver-rel.arch, name-ver, name-ver-rel,
epoch:name-ver-rel.arch, name-epoch:ver-rel.arch
"""
pkgselection = self.pool.Selection()
flags = (
solv.Selection.SELECTION_NAME
| solv.Selection.SELECTION_PROVIDES
| solv.Selection.SELECTION_GLOB
)
flags |= (
solv.Selection.SELECTION_CANON
| solv.Selection.SELECTION_DOTARCH
| solv.Selection.SELECTION_ADD
)
for pkg in self.pkgs:
pkgselection.select(pkg, flags)
return self.__locateDeps(pkgselection.solvables())
# pylint: disable-next=invalid-name
def getRecursiveDepList(self):
"""
Get dependency list and suggested packages for package names provided.
The dependency lookup is recursive. All available packages in the repo
are returned matching whatprovides.
The package name format could be any of the following:
name, name.arch, name-ver-rel.arch, name-ver, name-ver-rel,
epoch:name-ver-rel.arch, name-epoch:ver-rel.arch
returns a dictionary of {'n-v-r.a' : [n,v,e,r,a],...}
"""
solved = []
to_solve = self.pkgs
all_results = {}
while to_solve:
log.debug("Solving %s \n\n", to_solve)
results = self.getDependencylist()
all_results.update(results)
found = self.processResults(results)[0]
solved += to_solve
to_solve = []
# pylint: disable-next=invalid-name,unused-variable
for _dep, pkgs in list(found.items()):
for pkg in pkgs:
solved = list(set(solved))
if str(pkg) not in solved:
to_solve.append(str(pkg))
self.pkgs = to_solve
return all_results
# pylint: disable-next=invalid-name
def __locateDeps(self, pkgs):
results = {}
if not self.quiet:
# pylint: disable-next=consider-using-f-string
print(("Solving Dependencies (%i): " % len(pkgs)))
pb = ProgressBar(
prompt="",
endTag=" - complete",
finalSize=len(pkgs),
finalBarLength=40,
stream=sys.stdout,
)
pb.printAll(1)
for pkg in pkgs:
if not self.quiet:
pb.addTo(1)
pb.printIncrement()
results[pkg] = {}
reqs = pkg.lookup_deparray(solv.SOLVABLE_REQUIRES)
pkgresults = results[pkg]
for req in reqs:
pkgresults[req] = self.pool.whatprovides(req)
if not self.quiet:
pb.printComplete()
return results
@staticmethod
# pylint: disable-next=invalid-name
def processResults(results):
reqlist = {}
notfound = {}
for pkg in results:
if not results[pkg]:
continue
for req in results[pkg]:
rlist = results[pkg][req]
if not rlist:
# Unsatisfied dependency
notfound[str(req)] = []
continue
reqlist[str(req)] = rlist
found = {}
for req, rlist in list(reqlist.items()):
found[req] = []
for r in rlist:
dep = [r.name, r.evr, r.arch]
if dep not in found[req]:
found[req].append(dep)
return found, notfound
@staticmethod
def printable_result(results):
print_doc_str = ""
for pkg in results:
if not results[pkg]:
continue
for req in results[pkg]:
rlist = results[pkg][req]
# pylint: disable-next=consider-using-f-string
print_doc_str += "\n dependency: %s \n" % req
if not rlist:
# Unsatisfied dependency
print_doc_str += " Unsatisfied dependency \n"
continue
for po in rlist:
# pylint: disable-next=consider-using-f-string
print_doc_str += " provider: %s\n" % str(po)
return print_doc_str
if __name__ == "__main__":
parser = OptionParser(
usage="Usage: %prog [repoid] [repodata_path] [pkgname1] [pkgname2] ... [pkgnameM]"
)
parser.add_option(
"-i",
"--input-file",
action="store",
help="YAML file to use as input. This would ignore all other input passed in the command line",
)
parser.add_option(
"-y", "--output-yaml", action="count", help="Produce a YAML formatted output"
)
(options, _args) = parser.parse_args()
arg_repo = []
arg_pkgs = []
if options.input_file:
# Example of YAML input file:
#
# repositories:
# sles12-sp3-pool-x86_64: /var/cache/rhn/repodata/sles12-sp3-pool-x86_64/
# sles12-sp3-updates-x86_64: /var/cache/rhn/repodata/sles12-sp3-updates-x86_64/
#
# packages:
# - libapr-util1-1.5.3-2.3.1.x86_64
# - apache2-utils-2.4.23-29.3.2.x86_64
# - python3-base
# - apache2-utils
#
try:
# pylint: disable-next=unspecified-encoding
repo_cfg = yaml.load(open(options.input_file))
for repository in repo_cfg["repositories"]:
arg_repo.append(
{
"id": repository,
"relative_path": repo_cfg["repositories"][repository],
}
)
arg_pkgs = repo_cfg["packages"]
except Exception as exc: # pylint: disable=broad-except
# pylint: disable-next=consider-using-f-string
parser.error("Error reading input file: {}".format(exc))
sys.exit(1)
elif len(_args) >= 3:
arg_repo = [
{"id": _args[0], "relative_path": _args[1]}
] # path to where repodata is located
arg_pkgs = _args[2:]
else:
parser.error("Wrong number of arguments")
sys.exit(1)
dsolve = DepSolver(arg_repo, arg_pkgs, quiet=options.output_yaml)
deplist = dsolve.getDependencylist()
if options.output_yaml:
output = {"packages": [], "dependencies": {}}
# pylint: disable-next=consider-using-dict-items
for package in deplist:
pkg_tag = str(package)
output["packages"].append(pkg_tag)
output["dependencies"][pkg_tag] = {}
for dependency in deplist[package]:
output["dependencies"][pkg_tag][str(dependency)] = [
str(x) for x in deplist[package][dependency]
]
sys.stdout.write(yaml.dump(output))
else:
result_set = dsolve.processResults(deplist)
print(result_set)
print(
# pylint: disable-next=consider-using-f-string
"Printable dependency Results: \n\n %s"
% dsolve.printable_result(deplist)
)
07070100000009000081B400000000000000000000000168DD3ED300000EDF000000000000000000000000000000000000001900000000spacewalk-utils/pylintrc# utils package 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=C0103
;disable=I0011,
; C0103,
; 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,
;
; # Uyuni disabled
; E0203,
; E0611,
; E1101,
; E1102
[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=
0707010000000A000081FD00000000000000000000000168DD3ED300004EA0000000000000000000000000000000000000002800000000spacewalk-utils/spacewalk-clone-by-date#!/usr/bin/python3
# pylint: disable=missing-module-docstring,invalid-name
#
# Clonse channels by a particular date
#
# 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 re
import sys
import datetime
import getpass
import os
from optparse import OptionParser
import json
import socket
try:
# python 2
from StringIO import StringIO
except ImportError:
from io import StringIO
_LIBPATH = "/usr/share/rhn"
if _LIBPATH not in sys.path:
sys.path.append(_LIBPATH)
# pylint: disable-next=wrong-import-position
from utils import cloneByDate
# pylint: disable-next=wrong-import-position
from utils.cloneByDate import UserError
# pylint: disable-next=wrong-import-position
import warnings
SAMPLE_CONFIG = """
{
"username":"admin",
"password":"redhat",
"assumeyes":true,
"to_date": "2011-10-01",
"skip_depsolve":false,
"skip_errata_depsolve":false,
"security_only":false,
"use_update_date":false,
"no_errata_sync":false,
"dry_run":false,
"errata": ["RHSA-2014:0043", "RHBA-2014:0085"],
"blacklist": {
"ALL":["sendmail"],
"my-rhel5-x86_64-clone":["emacs"],
"my-rhel5-i386-clone":["vi", "postfix.*"]
},
"removelist": {
"ALL":["compiz", "compiz-gnome"],
"my-rhel5-x86_64-clone":["boost.*"]
},
"channels":[
{
"rhel-x86_64-server-5": {
"label": "my-rhel5-x86_64-clone",
"existing-parent-do-not-modify": true
},
"rhn-tools-rhel-x86_64-server-5": {
"label": "my-tools-5-x86_64-clone",
"name": "My Clone's Name",
"summary": "This is my channel's summary",
"description": "This is my channel's description"
}
},
{
"rhel-i386-server-5": "my-rhel5-i386-clone"
}
]
}
"""
def merge_config(options):
if options.channels:
options.channels = transform_arg_channels(options.channels)
return options
elif not options.config:
return options
if not os.path.isfile(options.config):
# pylint: disable-next=consider-using-f-string
raise UserError("%s does not exist." % options.config)
try:
# pylint: disable-next=unspecified-encoding
config_file = open(options.config).read()
config = json.load(StringIO(config_file))
except:
# pylint: disable-next=raise-missing-from
raise UserError("Configuration file is invalid, please check syntax.")
# if soemthing is in the config and not passed in as an argument
# add it to options
overwrite = [
"username",
"password",
"blacklist",
"removelist",
"channels",
"server",
"assumeyes",
"to_date",
"skip_depsolve",
"skip_errata_depsolve",
"security_only",
"use_update_date",
"no_errata_sync",
"errata",
"dry_run",
]
for key in overwrite:
if key in config and not getattr(options, key):
setattr(options, key, config[key])
# If from the command line there is only one channel tree. Transform single
# channel tree to a list of channel trees, which is what the rest of the
# code expects
# pylint: disable-next=unidiomatic-typecheck
if type(options.channels) == dict:
options.channels = [options.channels]
for channel_dict in options.channels:
for key in list(channel_dict.keys()):
# handle the just-the-lable case
# pylint: disable-next=unidiomatic-typecheck
if type(channel_dict[key]) == type(""):
channel_dict[key] = [channel_dict[key]]
if options.blacklist:
validate_list_dict("blacklist", options.blacklist)
if options.removelist:
validate_list_dict("removelist", options.removelist)
return options
def validate_list_dict(name, pkg_dict):
"""
Validates a removelist or blacklist to be map with lists as values
"""
# pylint: disable-next=unidiomatic-typecheck
if type(pkg_dict) != type({}):
# pylint: disable-next=consider-using-f-string
raise UserError("%s is not formatted correctly" % name)
for key, value in list(pkg_dict.items()):
# pylint: disable-next=unidiomatic-typecheck
if type(value) != type([]):
raise UserError(
# pylint: disable-next=consider-using-f-string
"Channel %s in %s packages not formatted correctly" % (key, name)
)
# Using --channels as an argument only supports a single channel 'tree'
# So we need to convert a list of lists of channel options into a list of
# hashes. ex:
# [
# ["rhel-i386-servr-5", "my-rhel-clone"],
# ['rhel-child', 'clone-child', 'clone name', 'clone summary', 'clone description']
# ]
# should become
# [{
# "rhel-i386-servr-5" : ["my-rhel-clone"],
# 'rhel-child': ['clone-child', 'clone name', 'clone summary', 'clone description']
# }]
def transform_arg_channels(chan_list):
to_ret = {}
for channel in chan_list:
to_ret[channel[0]] = channel[1:]
return [to_ret]
# This hack is required because callback option types do not allow you
# to have set an explicit value, like '--channels=src_label dest_label'.
# This has always worked before, and in fact the man page says that's what
# you should do, so we can't let it not work. Instead we'll have to transform
# the option to be '--channels src_label dest_label' and then pass that on
# back to optparse, which will process correctly. Life will be much easier
# when we no longer support RHEL 5 and can migrate to argparse.
class HackedOptionParser(OptionParser):
def _process_long_opt(self, rargs, values):
if "=" in rargs[0]:
arg = rargs.pop(0)
(opt, next_arg) = arg.split("=", 1)
rargs.insert(0, next_arg)
rargs.insert(0, opt)
OptionParser._process_long_opt(self, rargs, values)
# pylint: disable-next=unused-argument
def vararg_callback(option, opt_str, value, parser):
assert value is None
value = []
for arg in parser.rargs:
# stop on --foo like options
if arg[:2] == "--" and len(arg) > 2:
break
# stop on -a
if arg[:1] == "-" and len(arg) > 1:
break
value.append(arg)
del parser.rargs[: len(value)]
curr_value = getattr(parser.values, option.dest, None)
if not curr_value:
setattr(parser.values, option.dest, [value])
else:
curr_value.append(value)
def get_localhost_fqdn():
"""
Get FQDN of the current machine.
:return:
"""
fqdn = None
try:
# pylint: disable-next=unused-variable,unused-variable,unused-variable,unused-variable
for family, socktype, proto, canonname, sockaddr in socket.getaddrinfo(
socket.gethostname(), 0, 0, 0, 0, socket.AI_CANONNAME
):
if canonname:
fqdn = canonname
break
# pylint: disable-next=unused-variable
except socket.gaierror as exc:
pass # Silence here
# pylint: disable-next=broad-exception-caught
except Exception as exc:
print("Unhandled exception occurred while getting FQDN:", exc)
return fqdn or socket.getfqdn() # Fall-back to the /etc/hosts's FQDN
def parse_args():
parser = HackedOptionParser()
parser.add_option(
"-a",
"--parents",
dest="parents",
action="callback",
callback=vararg_callback,
help="Already existing channel that "
+ "will be used as parent of child channels cloned this session. "
+ "No changes will be made to this channel unless dependency "
+ "resolution requires it. Source parent is optional, will "
+ "be looked up if not provided (eg. --parents [src_parent] "
+ "dest_parent)",
)
parser.add_option(
"-b",
"--blacklist",
dest="blacklist",
help="Comma separated list of package names (or regular "
+ "expressions) to exclude from cloned errata (Only added "
+ "packages will be considered).",
)
parser.add_option(
"-c", "--config", dest="config", help="Config file specifying options"
)
parser.add_option(
"-d",
"--to_date",
dest="to_date",
help="Clone errata to the specified date (YYYY-MM-DD). "
+ "If omitted will assume no errata.",
)
parser.add_option(
"-e",
"--errata",
dest="errata",
action="store",
help="Only clone errata in this comma separated list (and "
+ "dependencies unless paired with --skip_depsolve) (e.g. "
+ "--errata=RHSA-2014:0043,RHBA-2014:0085).",
)
parser.add_option(
"-g",
"--background",
dest="background",
action="store_true",
help="DEPRECATED: does nothing.",
)
parser.add_option(
"-j",
"--dry-run",
dest="dry_run",
action="store_true",
help="Creates a file for each pair of channels in the working "
+ "directory that comprises the list of erratas that are to be cloned. "
+ "No actual errata cloning takes place. "
+ "Warning: If some of the destination channels do not exist, "
+ "they will be created with the original package set.",
)
parser.add_option(
"-k",
"--skip_depsolve",
dest="skip_depsolve",
action="store_true",
help="Skip all dependency solving (Not recommended).",
)
parser.add_option(
"-l",
"--channels",
dest="channels",
action="callback",
callback=vararg_callback,
help="Original channel and clone "
+ "channel labels space separated, with optional channel name and "
+ "summary following (e.g. --channels=rhel-i386-server-5 "
+ "myCloneLabel [myName [mySummary [myDescription]]]). Can be specified "
+ "multiple times.",
)
parser.add_option(
"-m",
"--sample-config",
dest="sample",
action="store_true",
help="Print a sample full configuration file and exit.",
)
parser.add_option(
"-n",
"--no-errata-sync",
dest="no_errata_sync",
action="store_true",
help="Do not automatically sychronize the "
+ "package list of cloned errata with their originals. This may "
+ "make spacewalk-clone-by-date have unexpected results if the "
+ "original errata have been updated (e.g.: syncing another "
+ "architecture for a channel) since the cloned errata were "
+ "created. If omitted we will synchronize the cloned errata "
+ "with the originals to ensure the expected packages are "
+ "included (default).",
)
parser.add_option(
"-o",
"--security_only",
dest="security_only",
action="store_true",
help="Only clone security errata (and their dependencies).",
)
parser.add_option("-p", "--password", dest="password", help="Password")
parser.add_option(
"-r",
"--removelist",
dest="removelist",
help="Comma separated list of package names (or regular "
+ "expressions) to remove from destination channel (All packages "
+ "are available for removal).",
)
parser.add_option(
"-s",
"--server",
dest="server",
help="Server URL to use for api connections (defaults to %default)",
default="https://" + get_localhost_fqdn() + "/rpc/api",
)
parser.add_option("-u", "--username", dest="username", help="Username")
parser.add_option(
"-v",
"--validate",
dest="validate",
action="store_true",
help="Run repoclosure on the set of specified repositories.",
)
parser.add_option(
"-y",
"--assumeyes",
dest="assumeyes",
action="store_true",
help="Assume yes for any prompts (unattended).",
)
parser.add_option(
"-x",
"--skip-errata-depsolve",
dest="skip_errata_depsolve",
action="store_true",
help="When pulling in an erratum to satisfy "
+ "dependency-resolution, DO NOT add that erratum's packages to the "
+ "list of packages to do dependency-resolution against. This will "
+ "result in fewer RPMs/errata being included for "
+ "dependency-resolution (sometimes MANY fewer) at the possible "
+ "expense of a cloned channel that is not dependency-complete. If "
+ "ommitted, we will add an erratum's RPMs to the list required for "
+ "dependency-resolution and recurse on the list (default).",
)
parser.add_option(
"-z",
"--use-update-date",
dest="use_update_date",
action="store_true",
help="While cloning errata by date, clone "
+ "all errata that have last been updated on or before the date "
+ "provided by to_date. If omitted will use issue date of errata "
+ "(default).",
)
# pylint: disable-next=unused-variable
(options, args) = parser.parse_args()
# pylint: disable-next=singleton-comparison
if options.parents != None:
# vararg_callback was designed for use with --channels, fix
options.parents = options.parents[0]
parent_len = len(options.parents)
if parent_len != 1 and parent_len != 2:
raise UserError("The -a / --parents option requires an argument")
# have to check this option before we merge with the config file to
# ensure that optparse is parsing the args correctly. We have to
# check it again after the config file merge to make sure we have
# channels.
# pylint: disable-next=singleton-comparison
if options.channels != None:
for channel_group in options.channels:
if len(channel_group) < 2 or len(channel_group) > 5:
raise UserError(
"The -l / --channels option requires two to " + "five arguments"
)
if options.sample:
print(SAMPLE_CONFIG)
sys.exit(0)
if options.config and options.channels:
raise UserError("Cannot specify both --channels and --config.")
if options.config and options.parents:
raise UserError("Cannot specify both --parents and --config.")
if options.blacklist:
options.blacklist = {"ALL": options.blacklist.split(",")}
if options.removelist:
options.removelist = {"ALL": options.removelist.split(",")}
if options.errata:
options.errata = options.errata.split(",")
options = merge_config(options)
if options.errata and options.to_date:
raise UserError("Cannot specify both --to_date and --errata.")
if options.errata and options.security_only:
raise UserError("Cannot specify both --security_only and --errata.")
# pylint: disable-next=singleton-comparison
if options.channels == None or len(options.channels) == 0:
raise UserError("No channels specified. See --help for details.")
if not options.username:
raise UserError("Username not specified")
if not options.validate:
if options.to_date:
options.to_date = parse_time(options.to_date.strip())
if not options.password:
options.password = getpass.getpass()
# Remove whitespace for bug 885782. Since bug 830609 we can no longer
# just remove all whitespace from the config file, may have spaces in
# channel name or description.
options.username = options.username.strip()
options.password = options.password.strip()
options.server = options.server.strip()
if options.errata:
errata_list = []
for errata in options.errata:
errata_list.append(errata.strip())
options.errata = errata_list
for option in [
getattr(options, "blacklist", None),
getattr(options, "removelist", None),
]:
if option:
for key in list(option.keys())[:]:
if key != key.strip():
option[key.strip()] = option[key]
del option[key]
key = key.strip()
my_list = []
for element in option[key]:
my_list.append(element.strip())
option[key] = my_list
for channel_tree in options.channels:
for channel in list(channel_tree.keys())[:]:
if channel != channel.strip():
channel_tree[channel.strip()] = channel_tree[channel]
del channel_tree[channel]
channel = channel.strip()
# pylint: disable-next=unidiomatic-typecheck
if type(channel_tree[channel]) == list:
my_list = []
for element in channel_tree[channel]:
my_list.append(element.strip())
channel_tree[channel] = my_list
# pylint: disable-next=unidiomatic-typecheck
elif type(channel_tree[channel]) == dict:
my_dict = {}
for key in list(channel_tree[channel].keys()):
# pylint: disable-next=unidiomatic-typecheck
if type(channel_tree[channel][key]) == str:
my_dict[key.strip()] = channel_tree[channel][key].strip()
else:
my_dict[key.strip()] = channel_tree[channel][key]
channel_tree[channel] = my_dict
return options
def parse_time(time_str):
"""
We need to use datetime, but python 2.4 does not support strptime(),
so we have to parse ourselves
"""
if re.match("[0-9]{4}-[0-9]{2}-[0-9]{2}", time_str):
try:
split = time_str.split("-")
date = datetime.datetime(int(split[0]), int(split[1]), int(split[2]))
except:
# pylint: disable-next=raise-missing-from,consider-using-f-string
raise UserError("Invalid date (%s)" % time_str)
return date
else:
# pylint: disable-next=consider-using-f-string
raise UserError("Invalid date format (%s), expected YYYY-MM-DD" % time_str)
# pylint: disable-next=invalid-name
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)
def main():
try:
args = parse_args()
return cloneByDate.main(args)
except KeyboardInterrupt:
systemExit(0, "\nUser interrupted process.")
except UserError as error:
# pylint: disable-next=consider-using-f-string
systemExit(-1, "\n%s" % error)
return 0
if __name__ == "__main__":
warnings.simplefilter("always", DeprecationWarning)
warnings.warn(
# pylint: disable-next=f-string-without-interpolation
f"spacewalk-clone-by-date is DEPRECATED. Please use Content Lifecycle Management Tool.",
DeprecationWarning,
stacklevel=2,
)
try:
sys.exit(abs(main() or 0))
except KeyboardInterrupt:
systemExit(0, "\nUser interrupted process.")
0707010000000B000081B400000000000000000000000168DD3ED300004501000000000000000000000000000000000000002D00000000spacewalk-utils/spacewalk-clone-by-date.sgml<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V3.1//EN">
<refentry>
<RefMeta>
<RefEntryTitle>spacewalk-clone-by-date</RefEntryTitle><manvolnum>8</manvolnum>
<RefMiscInfo>Version 1.0</RefMiscInfo>
</RefMeta>
<RefNameDiv>
<RefName><command>spacewalk-clone-by-date</command></RefName>
<RefPurpose>
<emphasis>spacewalk-clone-by-date</emphasis> is DEPRECATED. Please use Content Lifecycle Management Tool.
Utility for cloning errata by date (For RHEL5 and above).
</RefPurpose>
</RefNameDiv>
<RefSynopsisDiv>
<Synopsis>
<cmdsynopsis>
<command>spacewalk-clone-by-date</command>
<arg>options <replaceable>...</replaceable></arg>
</cmdsynopsis>
<cmdsynopsis>
<arg>-a <replaceable><optional>SRC_PARENT</optional> DEST_PARENT</replaceable></arg>
<arg>--parents=<replaceable><optional>SRC_PARENT</optional> DEST_PARENT</replaceable></arg>
</cmdsynopsis>
<cmdsynopsis>
<arg>-b <replaceable>PKG1,PKG2,PKG3</replaceable></arg>
<arg>--blacklist=<replaceable>PKG1,PKG2,PKG3</replaceable></arg>
</cmdsynopsis>
<cmdsynopsis>
<arg>-c <replaceable>CONFIGFILE</replaceable></arg>
<arg>--config=<replaceable>CONFIGFILE</replaceable></arg>
</cmdsynopsis>
<cmdsynopsis>
<arg>-d=<replaceable>YYYY-MM-DD</replaceable></arg>
<arg>--to_date=<replaceable>YYYY-MM-DD</replaceable></arg>
</cmdsynopsis>
<cmdsynopsis>
<arg>-e</arg><arg>--errata</arg>
</cmdsynopsis>
<cmdsynopsis>
<arg>-h</arg><arg>--help</arg>
</cmdsynopsis>
<cmdsynopsis>
<arg>-j</arg><arg>--dry-run</arg>
</cmdsynopsis>
<cmdsynopsis>
<arg>-k</arg><arg>--skip_depsolve</arg>
</cmdsynopsis>
<cmdsynopsis>
<arg>-l <replaceable>SRC DEST <optional>DEST_NAME <optional>DEST_SUMMARY <optional>DEST_DESCRIPTION</optional></optional></optional></replaceable></arg>
<arg>--channels=<replaceable>SRC DEST <optional>DEST_NAME <optional>DEST_SUMMARY <optional>DEST_DESCRIPTION</optional></optional></optional></replaceable></arg>
</cmdsynopsis>
<cmdsynopsis>
<arg>-m</arg><arg>--sample-config</arg>
</cmdsynopsis>
<cmdsynopsis>
<arg>-n</arg><arg>--no-errata-sync</arg>
</cmdsynopsis>
<cmdsynopsis>
<arg>-o</arg><arg>--security_only</arg>
</cmdsynopsis>
<cmdsynopsis>
<arg>-p <replaceable>PASSWORD</replaceable></arg>
<arg>--password=<replaceable>PASSWORD</replaceable></arg>
</cmdsynopsis>
<cmdsynopsis>
<arg>-r <replaceable>PKG1,PKG2,PKG3</replaceable></arg>
<arg>--removelist=<replaceable>PKG1,PKG2,PKG3</replaceable></arg>
</cmdsynopsis>
<cmdsynopsis>
<arg>-u <replaceable>USERNAME</replaceable></arg>
<arg>--username=<replaceable>USERNAME</replaceable></arg>
</cmdsynopsis>
<cmdsynopsis>
<arg>-v</arg><arg>--validate</arg>
</cmdsynopsis>
<cmdsynopsis>
<arg>-x</arg><arg>--skip-errata-depsolve</arg>
</cmdsynopsis>
<cmdsynopsis>
<arg>-y</arg><arg>--assumeyes</arg>
</cmdsynopsis>
<cmdsynopsis>
<arg>-z</arg><arg>--use-update-date</arg>
</cmdsynopsis>
</Synopsis>
</RefSynopsisDiv>
<RefSect1><Title>Description</Title>
<para>
<emphasis>spacewalk-clone-by-date</emphasis> is DEPRECATED. Please use Content Lifecycle Management Tool.
</para>
<para>
<emphasis>spacewalk-clone-by-date</emphasis> tool, clones all the errata belonging to a specified channel, as of a specific date.
</para>
<para>
Script to clone all errata belonging to software channels as of a specific date, attempting to ensure any added packages have their dependencies satisfied. Any destination channels that do not exist will be created.
</para>
<para>
By specifying channels on the command line, only a single channel tree (a base channel and its children) can be cloned with a single command. If you would like to specify multiple trees within a single command, simply use a configuration file. See --sample-config for a sample.
</para>
<para>
All options can either be specified in the configuration file or via command line. Any option specified via command line will override a configuration file value with the exception of channels. If a configuration file is specified, --channels is not a valid command line argument.
</para>
<para>
Please note that spacewalk-clone-by-date will pull in any packages or errata needed to resolve dependencies for any errata being cloned. It is therefore possible for the cloned channel(s) to end up with errata and packages which are newer than the specified date. This is expected behavior.
</para>
<para>
Spacewalk-clone-by-date is tool that provides a best-effort attempt at cloning valid and dependency-complete channels. However, there is not enough information available to guarantee that the results will always be completely dependency-complete, especially if used with the --errata, --security_only, --blacklist, or --removelist options. This is a tool to assist Administrators with channel creation, it cannot replace them. Cases where spacewalk-clone-by-date cannot completely resolve all potential dependencies include but are not limited to: if the original channel is not dependency-complete, if the original channel does not have or contains incomplete errata information, or if packages are not strictly dependent on each other but conflict with specific versions.
</para>
<para>
Note: Unlike previous versions spacewalk-clone-by-date now clones entire errata that are determined to be required when doing dependency resolution, not just single packages. This solves a number of dependency-completeness problems but is still not a perfect solution. This may mean that errata end up being cloned that do not meet your specifications (for example, that were added after the --to_date or are not security errata when used with --security_only). This is expected behavior. The only way to avoid this is to run with --skip_depsolve and manually resolve any dependency cloning that may be required.
</para>
<para>
The addition of the --skip-errata-depsolve switch allows the user to control whether adding an erratum due to dependency resolution, will add all of that erratum's packages to the dependency-resolution list. The default is to add all such discovered packages. As for dependency-resolution in general, this may result in more packages and errata being added to the cloned channel than desired. The user can avoid this by specifying --skip-errata-depsolve, manually resolving any dependency issues that may be encountered.
</para>
<para>
Note: spacewalk-clone-by-date does not support RHEL4 and earlier versions. It's a limitation of this tool. Spacewalk-clone-by-date is intended for use with Red Hat channels. There is no guarantee that it will work properly with channels populated with content from third party sources.
</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>-a <replaceable><optional>SRC_PARENT</optional> DEST_PARENT</replaceable>, --parents=<replaceable><optional>SRC_PARENT</optional> DEST_PARENT</replaceable></term>
<listitem>
<para>The parent channels that will be used for dependency resolution and that newly cloned channels will be created as children of. No changes will be made to these channels unless dependency resolution demands it. If only the destination parent channel is specified then the source parent channel will be automatically chosen as the channel the destination parent channel was cloned from. Both of these channels must already exist. The config file equivalent to this option is specifying '"existing-parent-do-not-modify": true' for a parent channel.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>-b <replaceable>PKG1,PKG2,PKG3</replaceable>, --blacklist=<replaceable>PKG1,PKG2,PKG3</replaceable></term>
<listitem>
<para>Comma separated list of Perl-style regular expressions used to match package names to be removed after cloning. Only newly added packages will removed if they are on the blacklist. <emphasis>Dependency resolution is not ensured on resulting repository.</emphasis>
</para>
<para>
Note: This option is global across all destination channels. To specify per channel blacklists, you must use a configuration file. See --sample-config for an example.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>-c <replaceable>FILE</replaceable>, --config=<replaceable>FILE</replaceable></term>
<listitem>
<para>Configuration file holding parameters, see --sample-config for an example.
Any command-line parameters override those in the specified config file.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>-d <replaceable>YYYY-MM-DD</replaceable>, --to_date=<replaceable>YYYY-MM-DD</replaceable></term>
<listitem>
<para>All errata on or before the specified date will be cloned if it does not already exist in the destination channel(s). If this option is omitted no errata will be cloned (unless dependency resolution demands it).
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>-e --errata</term>
<listitem>
<para>Clone only specified errata (and their dependencies). A comma-separated list (e.g. --errata=RHSA-2014:0043,RHBA-2014:0085).</para>
</listitem>
</varlistentry>
<varlistentry>
<term>-j --dry-run</term>
<listitem>
<para>Creates a file for each pair of channels in the working directory that comprises the list of erratas that are to be cloned. No actual errata cloning takes place.</para>
<para>Warning: If some of the destination channels do not exist, they will be created with the original package set.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>-k --skip_depsolve</term>
<listitem>
<para>Do not attempt to ensure added packages have needed dependencies (Not recommended). </para>
</listitem>
</varlistentry>
<varlistentry>
<term>-l <replaceable>SRC_LABEL DEST_LABEL <optional>DEST_NAME <optional>DEST_SUMMARY <optional>DEST_DESCRIPTION</optional></optional></optional></replaceable>, --channels=<replaceable>SRC_LABEL DEST_LABEL <optional>DEST_NAME <optional>DEST_SUMMARY <optional>DEST_DESCRIPTION</optional></optional></optional></replaceable></term>
<listitem>
<para>Space separated list of source channel and destination channel. Can be specified multiple times to provide base channel and child channel pairs of a single channel tree. Can optionally include destination channel name, summary, and description, in that order. To specify more than one channel tree, specify a config file.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>-m --sample-config</term>
<listitem>
<para>Generate a sample configuration file.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>-n --no-errata-sync</term>
<listitem>
<para>Do not automatically synchronize the package list of cloned errata with their originals. This may make spacewalk-clone-by-date have unexpected results if the original errata have been updated (e.g.: syncing another architecture for a channel) since the cloned errata were created. If omitted we will synchronize the cloned errata with the originals to ensure the expected packages are included (default).
</para>
<para>Errata clones do not necessarily get updated by satellite-syncing new architectures of existing channels. Another example would be if the errata contains some packages in one channel (say the base channel) and additional packages in another channel (say a child channel). Or it may be due to simply adding or removing packages from a custom errata that you have already created a clone of. Since cloned errata are not automatically updated when the original errata are, over time they may become out-of-sync and require synchronization in order for associating the cloned errata with a cloned channel to have the normally expected effect.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>-o --security_only</term>
<listitem>
<para>Clone only security errata (and their dependencies).</para>
</listitem>
</varlistentry>
<varlistentry>
<term>-p <replaceable>PASSWORD</replaceable>, --password=<replaceable>PASSWORD</replaceable></term>
<listitem>
<para>password of user that has administrative access. If not provided, password will be prompted for.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>-r <replaceable>PKG1,PKG2,PKG3</replaceable>, --removelist=<replaceable>PKG1,PKG2,PKG3</replaceable></term>
<listitem>
<para>Comma separated list of Perl-style regular expressions used to match package names to be removed after cloning. All packages are considered for removal, even those not added by errata/channel cloning. <emphasis>Dependency resolution is not ensured on resulting repository.</emphasis>
</para>
<para>
Note: This option is global across all destination channels. To specify per channel removelists, you must use a configuration file. See --sample-config for an example.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>-u <replaceable>USERNAME</replaceable>, --username=<replaceable>USERNAME</replaceable></term>
<listitem>
<para>username of user that has administrative access.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>-v --validate</term>
<listitem>
<para>Run repoclosure on all provided channels. This overrides --to_date and will not perform any cloning.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>-x --skip-errata-depsolv</term>
<listitem>
<para>When pulling in an erratum to satisfy dependency-resolution, <emphasis>DO NOT</emphasis> add that erratum's packages to the list of packages to do dependency-resolution against. This will result in fewer packages/errata being included for dependency-resolution (sometimes <emphasis>MANY</emphasis> fewer) at the possible expense of a cloned channel that is not dependency-complete. If omitted, we will add an erratum's packages to the list required for dependency-resolution and recurse on the list (default).
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>-y --assumeyes</term>
<listitem>
<para>Instead of asking for confirmation before cloning a channel or errata, continue uninterrupted.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>-z --use-update-date</term>
<listitem>
<para>While cloning errata by date, clone all errata that have last been updated on or before the date provided by to_date. If omitted will use issue date of errata (default).</para>
</listitem>
</varlistentry>
</variablelist>
</RefSect1>
<RefSect1><Title>Examples</Title>
<example>
<title>Clone a base channel and child channel to 2008-12-20 with a blacklist excluding all versions of squid, and all versions of any package that starts with 'sendmail'.</title>
<para>spacewalk-clone-by-date --channels=rhel-x86_64-server-5 clone-rhel --channels=rhn-tools-rhel-x86_64-server-5 clone-tools 'Clone Tools Name' 'Clone Tools Summary' 'Clone Tools Description' --username admin --password redhat --to_date=2008-12-20 --blacklist='sendmail.*,squid,compat-libstdc\+\+'</para>
</example>
<example>
<title>Clone with options completely from a config file.</title>
<para>spacewalk-clone-by-date --config=/etc/clone.conf</para>
</example>
<example>
<title>Clone while overriding some options from the command line.</title>
<para>spacewalk-clone-by-date --config=/etc/clone.conf --username rocky --password squirrel --to_date=2010-10-09</para>
</example>
</RefSect1>
<RefSect1><Title>Log Output</Title>
<para>
In addition to writing to stdout, spacewalk-clone-by-date writes a detailed description of every run to a log file. This file can be found at <emphasis>/var/log/rhn/errata-clone.log</emphasis>
Log output includes:
</para>
<itemizedlist>
<listitem><para>The command-line arguments or config-file contents used for the run</para></listitem>
<listitem><para>The output of each round of dependency-checking that adds packages/errata</para></listitem>
<listitem><para>The complete list of all errata and packages cloned into each channel</para></listitem>
</itemizedlist>
</RefSect1>
<RefSect1><Title>Authors</Title>
<simplelist>
<member>Justin Sherrill <email>jsherrill@redhat.com</email></member>
<member>Stephen Herr <email>sherr@redhat.com</email></member>
<member>Grant Gainey <email>ggainey@redhat.com</email></member>
</simplelist>
</RefSect1>
</refentry>
0707010000000C000081FD00000000000000000000000168DD3ED300006074000000000000000000000000000000000000002A00000000spacewalk-utils/spacewalk-common-channels#!/usr/bin/python3
# pylint: disable=missing-module-docstring,invalid-name
#
# 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.
#
import sys
import fnmatch
from optparse import OptionParser, Option
import re
from spacewalk.common.rhnConfig import cfg_component
from uyuni.common.cli import getUsernamePassword, xmlrpc_login, xmlrpc_logout
try:
import xmlrpclib
except ImportError:
import xmlrpc.client as xmlrpclib # pylint: disable=F0401
try:
import ConfigParser
except ImportError:
import configparser as ConfigParser
DEFAULT_SERVER = "localhost"
DEFAULT_CONFIG = "/etc/rhn/spacewalk-common-channels.ini"
DEFAULT_REPO_TYPE = "yum"
CHANNEL_ARCH = {
"aarch64": "channel-aarch64",
"i386": "channel-ia32",
"ia64": "channel-ia64",
"sparc": "channel-sparc",
"sparc64": "channel-sparc64",
"alpha": "channel-alpha",
"s390": "channel-s390",
"s390x": "channel-s390x",
"iSeries": "channel-iSeries",
"pSeries": "channel-pSeries",
"x86_64": "channel-x86_64",
"ppc": "channel-ppc",
"ppc64": "channel-ppc64",
"ppc64le": "channel-ppc64le",
"amd64-deb": "channel-amd64-deb",
"arm64-deb": "channel-arm64-deb",
"armhf-deb": "channel-armhf-deb",
"ia32-deb": "channel-ia32-deb",
"ia64-deb": "channel-ia64-deb",
"sparc-deb": "channel-sparc-deb",
"alpha-deb": "channel-alpha-deb",
"s390-deb": "channel-s390-deb",
"powerpc-deb": "channel-powerpc-deb",
"arm-deb": "channel-arm-deb",
"mips-deb": "channel-mips-deb",
}
CHANNEL_NAME_TO_ARCH = {
"AArch64": "aarch64",
"Alpha": "alpha",
"Alpha Debian": "alpha-deb",
"AMD64 Debian": "amd64-deb",
"ARM64 Debian": "arm64-deb",
"ARM HF Debian": "armhf",
"arm Debian": "arm-deb",
"ARM hard. FP": "armhfp",
"ARM soft. FP": "arm",
"IA-32": "i386",
"IA-32 Debian": "ia32-deb",
"IA-64": "ia64",
"IA-64 Debian": "ia64-deb",
"iSeries": "iSeries",
"mips Debian": "mips-deb",
"PowerPC Debian": "powerpc-deb",
"PPC": "ppc",
"PPC64LE": "ppc64le",
"pSeries": "pSeries",
"s390": "s390",
"s390 Debian": "s390-deb",
"s390x": "s390x",
"Sparc": "sparc",
"Sparc Debian": "sparc-deb",
"x86_64": "x86_64",
}
SPLIT_PATTERN = "[ ,]+"
class ExtOptionParser(OptionParser):
"""extend OptionParser to print examples"""
# pylint: disable-next=redefined-outer-name
def __init__(self, examples=None, **kwargs):
self.examples = examples
OptionParser.__init__(self, **kwargs)
def print_help(self):
OptionParser.print_help(self)
print("\n\n" + self.examples)
def connect(user, password, server):
# pylint: disable-next=consider-using-f-string
server_url = "https://%s/rpc/api" % server
if server in ["localhost", "127.0.0.1"]:
# pylint: disable-next=consider-using-f-string
server_url = "http://%s/rpc/api" % server
# pylint: disable-next=possibly-used-before-assignment
if options.verbose and options.verbose > 2:
client_verbose = options.verbose - 2
else:
client_verbose = 0
if options.verbose:
# pylint: disable-next=consider-using-f-string
sys.stdout.write("Connecting to %s\n" % server_url)
# pylint: disable-next=redefined-outer-name
client = xmlrpclib.Server(server_url, verbose=client_verbose)
options.user, password = getUsernamePassword(user, password)
# pylint: disable-next=redefined-outer-name
key = xmlrpc_login(client, options.user, password)
return client, key
# pylint: disable-next=redefined-outer-name,redefined-outer-name,redefined-outer-name,redefined-outer-name
def add_channels(channels, section, arch, client):
# pylint: disable-next=redefined-outer-name
base_channels = [""]
optional = [
"activationkey",
"base_channel_activationkey",
"gpgkey_url",
"gpgkey_id",
"gpgkey_fingerprint",
"repo_url",
"yum_repo_label",
"dist_map_release",
"repo_type",
]
mandatory = ["label", "name", "summary", "checksum", "arch", "section"]
# pylint: disable-next=possibly-used-before-assignment
config.set(section, "arch", arch)
config.set(section, "section", section)
if config.has_option(section, "base_channels"):
base_channels = re.split(SPLIT_PATTERN, config.get(section, "base_channels"), 1)
for base_channel in base_channels:
config.set(section, "base_channel", base_channel)
# pylint: disable-next=redefined-outer-name
channel = {"base_channel": config.get(section, "base_channel")}
if base_channel:
if channel["base_channel"] in channels:
# If channel exists at the INI file, use it.
pass
elif channel_exists(client, channel["base_channel"]):
# If not, if cannel exists on the server, convert it
channel_base_server = channel_get_details(
client, channel["base_channel"]
)
channels[channel["base_channel"]] = {
"label": channel_base_server["label"],
"name": channel_base_server["name"],
"summary": channel_base_server["summary"],
"arch": CHANNEL_NAME_TO_ARCH[channel_base_server["arch_name"]],
"checksum": channel_base_server["checksum_label"],
"gpgkey_url": channel_base_server["gpg_key_url"],
"gpgkey_id": channel_base_server["gpg_key_id"],
"gpgkey_fingerprint": channel_base_server["gpg_key_fp"],
"section": section,
}
else:
# Otheriwse there isn't such base channel so skip also child
continue
# set base channel values so they can be used as macros
for k, v in list(channels[channel["base_channel"]].items()):
config.set(section, "base_channel_" + k, v)
for k in optional:
if config.has_option(section, k):
channel[k] = config.get(section, k)
else:
channel[k] = ""
for k in mandatory:
channel[k] = config.get(section, k)
channels[channel["label"]] = channel
# pylint: disable-next=redefined-outer-name
def channel_exists(client, channel_label):
# check whether channel exists
try:
# pylint: disable-next=redefined-outer-name,possibly-used-before-assignment
base_info = client.channel.software.isExisting(key, channel_label)
return base_info
# We should improve this as a connection failure would be the same
# as not finding the channel
# pylint: disable-next=unused-variable
except xmlrpclib.Fault as e:
return None
# pylint: disable-next=redefined-outer-name
def channel_get_details(client, channel_label):
# get details for a channel
try:
# pylint: disable-next=redefined-outer-name
base_info = client.channel.software.getDetails(key, channel_label)
return base_info
# We should improve this as a connection failure would be the same
# as not finding the channel
# pylint: disable-next=unused-variable
except xmlrpclib.Fault as e:
return None
# pylint: disable-next=redefined-outer-name
def get_existing_repos(client):
result = {}
try:
user_repos = client.channel.software.listUserRepos(key)
for repo in user_repos:
result[repo["sourceUrl"]] = repo["label"]
# pylint: disable-next=unused-variable
except xmlrpclib.Fault as e:
return None
return result
if __name__ == "__main__":
# options parsing
usage = "usage: %prog [options] <channel1 glob> [<channel2 glob> ... ]"
# pylint: disable-next=consider-using-f-string
examples = """Examples:
Create Fedora 12 channel, its child channels and activation key limited to 10 servers:
%(prog)s -u admin -p pass -k 10 'fedora12*'
Create Centos 5 with child channels only on x86_64:
%(prog)s -u admin -p pass -a x86_64 'centos5*'
Create only Centos 4 base channels for intel archs:
%(prog)s -u admin -p pass -a i386,x86_64 'centos4'
Create Spacewalk client child channel for every (suitable) defined base channel:
%(prog)s -u admin -p pass 'spacewalk-client*'
Create everything as well as unlimited activation key for every channel:
%(prog)s -u admin -p pass -k unlimited '*'
\n""" % {
"prog": sys.argv[0]
}
option_list = [
Option("-c", "--config", help="configuration file", default=DEFAULT_CONFIG),
Option("-u", "--user", help="username"),
Option("-p", "--password", help="password"),
Option("-s", "--server", help="your spacewalk server", default=DEFAULT_SERVER),
Option(
"-k",
"--keys",
help="activation key usage limit -"
+ " 'unlimited' or number\n"
+ "(default: options is not set and activation keys"
+ " are not created at all)",
dest="key_limit",
),
Option(
"-n",
"--dry-run",
help="perform a trial run with no changes made",
action="store_true",
),
Option("-a", "--archs", help="list of architectures"),
Option("-v", "--verbose", help="verbose", action="count"),
Option(
"-l", "--list", help="print list of available channels", action="store_true"
),
Option(
"-d",
"--default-channels",
help="make base channels default channels for given OS version",
action="store_true",
),
]
# Read the configuration to figure out if channel should be synced automatically on creation
sync_channels = True
with cfg_component("java") as CFG:
try:
sync_channels = CFG.unify_custom_channel_management.lower() in [
"1",
"y",
"true",
"yes",
"on",
]
except (AttributeError, ValueError):
pass
parser = ExtOptionParser(usage=usage, option_list=option_list, examples=examples)
(options, args) = parser.parse_args()
config = ConfigParser.ConfigParser()
config.read(options.config)
if options.list:
print("Available channels:")
channel_list = config.sections()
if channel_list:
for channel in sorted(channel_list):
channel_archs = config.get(channel, "archs")
# pylint: disable-next=consider-using-f-string
print(" %-20s %s" % (channel + ":", channel_archs))
else:
print(" [no channel available]")
sys.exit(0)
if not args:
print(parser.print_help())
parser.exit()
try:
client, key = connect(options.user, options.password, options.server)
user_info = client.user.getDetails(key, options.user)
org_id = user_info["org_id"]
except xmlrpclib.Fault as e:
if e.faultCode == 2950:
sys.stderr.write("Either the password or username is incorrect.\n")
sys.exit(2)
else:
raise
channels = {}
sections = []
# sort base channels first and child last
for section in config.sections():
if config.has_option(section, "base_channels"): # child
sections.append(section)
else: # base
sections.insert(0, section)
for section in sections:
archs = re.split(SPLIT_PATTERN, config.get(section, "archs"))
if options.archs:
# filter out archs not set on commandline
archs = [a for a in archs if a in options.archs]
for arch in archs:
add_channels(channels, section, arch, client)
# list of base_channels to deal with
base_channels = {}
# list of child_channels for given base_channel
child_channels = {}
# filter out non-matching channels
for pattern in args:
matching_channels = [
n
for n in list(channels.keys())
if fnmatch.fnmatch(channels[n]["section"], pattern)
]
for name in matching_channels:
attr = channels[name]
if "base_channel" in attr and attr["base_channel"]:
if attr["base_channel"] not in base_channels:
base_channels[attr["base_channel"]] = False
if attr["base_channel"] in child_channels:
child_channels[attr["base_channel"]].append(name)
else:
child_channels[attr["base_channel"]] = [name]
else:
# this channel is base channel
base_channels[name] = True
if name not in child_channels:
child_channels[name] = []
if not matching_channels:
sys.stderr.write("No channels matching your selection.\n")
sys.exit(2)
existing_repo_urls = get_existing_repos(client)
if existing_repo_urls is None:
sys.stderr.write("Unable to get existing repositories from server.\n")
sys.exit(2)
for base_channel_label, create_channel in sorted(base_channels.items()):
if create_channel:
base_info = channels[base_channel_label]
repo_type = (
base_info.get("repo_type", DEFAULT_REPO_TYPE) or DEFAULT_REPO_TYPE
)
if options.verbose:
sys.stdout.write(
# pylint: disable-next=consider-using-f-string
"Base channel '%s' - creating...\n" % base_info["name"]
)
if options.verbose and options.verbose > 1:
sys.stdout.write(
# pylint: disable-next=consider-using-f-string
"* label=%s, summary=%s, arch=%s, repo_type=%s, checksum=%s\n"
% (
base_info["label"],
base_info["summary"],
base_info["arch"],
repo_type,
base_info["checksum"],
)
)
if not options.dry_run:
try:
# create base channel
client.channel.software.create(
key,
base_info["label"],
base_info["name"],
base_info["summary"],
CHANNEL_ARCH[base_info["arch"]],
"",
base_info["checksum"],
{
"url": base_info["gpgkey_url"],
"id": base_info["gpgkey_id"],
"fingerprint": base_info["gpgkey_fingerprint"],
},
)
if base_info["repo_url"] in existing_repo_urls:
# use existing repo
client.channel.software.associateRepo(
key,
base_info["label"],
existing_repo_urls[base_info["repo_url"]],
)
else:
client.channel.software.createRepo(
key,
base_info["yum_repo_label"],
repo_type,
base_info["repo_url"],
)
client.channel.software.associateRepo(
key, base_info["label"], base_info["yum_repo_label"]
)
if sync_channels:
client.channel.software.syncRepo(key, base_info["label"])
except xmlrpclib.Fault as e:
if e.faultCode == 1200: # ignore if channel exists
# pylint: disable-next=consider-using-f-string
sys.stdout.write("INFO: %s exists\n" % base_info["label"])
else:
sys.stderr.write(
# pylint: disable-next=consider-using-f-string
"ERROR: %s: %s\n" % (base_info["label"], e.faultString)
)
sys.exit(2)
if options.key_limit is not None:
if options.verbose:
sys.stdout.write(
# pylint: disable-next=consider-using-f-string
"* Activation key '%s' - creating...\n" % (base_info["label"])
)
if not options.dry_run:
# create activation key
if options.key_limit == "unlimited":
ak_args = (
key,
base_info["activationkey"],
base_info["name"],
base_info["label"],
[],
False,
)
else:
ak_args = (
key,
base_info["activationkey"],
base_info["name"],
base_info["label"],
int(options.key_limit),
[],
False,
)
try:
client.activationkey.create(*ak_args)
except xmlrpclib.Fault as e:
if e.faultCode != 1091: # ignore if ak exists
sys.stderr.write(
# pylint: disable-next=consider-using-f-string
"ERROR: %s: %s\n" % (base_info["label"], e.faultString)
)
else:
# check whether channel exists
if channel_exists(client, base_channel_label):
base_info = channel_get_details(client, base_channel_label)
# pylint: disable-next=consider-using-f-string
sys.stdout.write("Base channel '%s' - exists\n" % base_info["name"])
else:
sys.stderr.write(
# pylint: disable-next=consider-using-f-string
"ERROR: %s could not be found at the server\n" % base_channel_label
)
if options.default_channels:
try:
client.distchannel.setMapForOrg(
key,
base_info["name"],
base_info["dist_map_release"],
base_info["arch"],
base_info["label"],
)
except xmlrpclib.Fault as e:
sys.stderr.write(
# pylint: disable-next=consider-using-f-string
"ERROR: %s: %s\n" % (base_info["label"], e.faultString)
)
for child_channel_label in sorted(child_channels[base_channel_label]):
child_info = channels[child_channel_label]
repo_type = (
child_info.get("repo_type", DEFAULT_REPO_TYPE) or DEFAULT_REPO_TYPE
)
if options.verbose:
sys.stdout.write(
# pylint: disable-next=consider-using-f-string
"* Child channel '%s' - creating...\n" % child_info["name"]
)
if options.verbose and options.verbose > 1:
sys.stdout.write(
# pylint: disable-next=consider-using-f-string
"** label=%s, summary=%s, arch=%s, parent=%s, repo_type=%s, checksum=%s\n"
% (
child_info["label"],
child_info["summary"],
child_info["arch"],
base_channel_label,
repo_type,
child_info["checksum"],
)
)
if not options.dry_run:
try:
# create child channels
client.channel.software.create(
key,
child_info["label"],
child_info["name"],
child_info["summary"],
CHANNEL_ARCH[child_info["arch"]],
base_channel_label,
child_info["checksum"],
{
"url": child_info["gpgkey_url"],
"id": child_info["gpgkey_id"],
"fingerprint": child_info["gpgkey_fingerprint"],
},
)
if child_info["repo_url"] in existing_repo_urls:
# use existing repo
client.channel.software.associateRepo(
key,
child_info["label"],
existing_repo_urls[child_info["repo_url"]],
)
else:
client.channel.software.createRepo(
key,
child_info["yum_repo_label"],
repo_type,
child_info["repo_url"],
)
client.channel.software.associateRepo(
key, child_info["label"], child_info["yum_repo_label"]
)
if sync_channels:
client.channel.software.syncRepo(key, child_info["label"])
except xmlrpclib.Fault as e:
if e.faultCode == 1200: # ignore if channel exists
sys.stderr.write(
# pylint: disable-next=consider-using-f-string
"WARNING: %s: %s\n" % (child_info["label"], e.faultString)
)
else:
sys.stderr.write(
# pylint: disable-next=consider-using-f-string
"ERROR: %s: %s\n" % (child_info["label"], e.faultString)
)
sys.exit(2)
if options.key_limit is not None:
if (
"base_channel_activationkey" in child_info
and child_info["base_channel_activationkey"]
):
# pylint: disable-next=consider-using-f-string
activationkey = "%s-%s" % (
org_id,
child_info["base_channel_activationkey"],
)
if options.verbose:
sys.stdout.write(
# pylint: disable-next=consider-using-f-string
"** Activation key '%s' - adding child channel...\n"
% (activationkey)
)
if not options.dry_run:
try:
client.activationkey.addChildChannels(
key, activationkey, [child_info["label"]]
)
except xmlrpclib.Fault as e:
sys.stderr.write(
# pylint: disable-next=consider-using-f-string
"ERROR: %s: %s\n" % (child_info["label"], e.faultString)
)
if options.verbose:
# an empty line after channel group
sys.stdout.write("\n")
existing_repo_urls = get_existing_repos(client)
if client is not None:
# logout
xmlrpc_logout(client, key)
0707010000000D000081B400000000000000000000000168DD3ED300024C4E000000000000000000000000000000000000002E00000000spacewalk-utils/spacewalk-common-channels.ini#
# These are definitions of common channels and their names in Spacewalk.
#
# Every section defines a set channels (base or child) for a given list
# of architectures.
#
# Mandatory options for a section (have to be defined or inherited from [DEFAULT]):
# label
# name
# summary
# archs
# checksum
# Optional options for a section:
# activationkey
# base_channels (child channel has to have it)
#
# Base channels have to be defined before child channels.
#
[DEFAULT]
label = %(section)s-%(arch)s
checksum = sha1
summary = %(name)s
activationkey = %(label)s
gpgkey_url = %(base_channel_gpgkey_url)s
gpgkey_id = %(base_channel_gpgkey_id)s
gpgkey_fingerprint = %(base_channel_gpgkey_fingerprint)s
yum_repo_label = External - %(name)s
## now define some "macros"
_x86_archs = i386, x86_64
# Uyuni
_uyuni_gpgkey_url = file:///etc/pki/rpm-gpg/uyuni-tools-gpg-pubkey-0d20833e.key
_uyuni_gpgkey_id = 0D20833E
_uyuni_gpgkey_fingerprint = 62F0 28DE 22F8 BF49 B88B C9E5 972E 5D6C 0D20 833E
[fedora29]
archs = %(_x86_archs)s
checksum = sha256
name = Fedora 29 (%(arch)s)
gpgkey_url = https://getfedora.org/static/429476B4.txt
gpgkey_id = 429476B4
gpgkey_fingerprint = 5A03 B4DD 8254 ECA0 2FDA 1637 A20A A56B 4294 76B4
repo_url = https://mirrors.fedoraproject.org/metalink?repo=fedora-29&arch=%(arch)s
dist_map_release = 29
[fedora29-modular]
label = %(base_channel)s-modular
name = Fedora 29 Modular (%(arch)s)
archs = %(_x86_archs)s
checksum = sha256
base_channels = fedora29-%(arch)s
repo_url = https://mirrors.fedoraproject.org/metalink?repo=fedora-modular-29&arch=%(arch)s
[fedora29-updates]
label = %(base_channel)s-updates
name = Fedora 29 Updates (%(arch)s)
archs = %(_x86_archs)s
checksum = sha256
base_channels = fedora29-%(arch)s
repo_url = https://mirrors.fedoraproject.org/metalink?repo=updates-released-f29&arch=%(arch)s
[fedora29-updates-modular]
label = %(base_channel)s-updates-modular
name = Fedora 29 Updates Modular (%(arch)s)
archs = %(_x86_archs)s
checksum = sha256
base_channels = fedora29-%(arch)s
repo_url = https://mirrors.fedoraproject.org/metalink?repo=updates-released-modular-f29&arch=%(arch)s
[fedora29-debug]
label = %(base_channel)s-debug
name = Fedora 29 Debug (%(arch)s)
archs = %(_x86_archs)s
checksum = sha256
base_channels = fedora29-%(arch)s
repo_url = https://mirrors.fedoraproject.org/metalink?repo=fedora-debug-29&arch=%(arch)s
[fedora29-updates-debug]
label = %(base_channel)s-updates-debug
name = Fedora 29 Updates Debug (%(arch)s)
archs = %(_x86_archs)s
checksum = sha256
base_channels = fedora29-%(arch)s
repo_url = https://mirrors.fedoraproject.org/metalink?repo=updates-released-debug-f29&arch=%(arch)s
[fedora30]
archs = %(_x86_archs)s
checksum = sha256
name = Fedora 30 (%(arch)s)
gpgkey_url = https://getfedora.org/static/fedora.gpg
gpgkey_id = CFC659B9
gpgkey_fingerprint = F1D8 EC98 F241 AAF2 0DF6 9420 EF3C 111F CFC6 59B9
repo_url = https://mirrors.fedoraproject.org/metalink?repo=fedora-30&arch=%(arch)s
dist_map_release = 30
[fedora30-modular]
label = %(base_channel)s-modular
name = Fedora 30 Modular (%(arch)s)
archs = %(_x86_archs)s
checksum = sha256
base_channels = fedora30-%(arch)s
repo_url = https://mirrors.fedoraproject.org/metalink?repo=fedora-modular-30&arch=%(arch)s
[fedora30-updates]
label = %(base_channel)s-updates
name = Fedora 30 Updates (%(arch)s)
archs = %(_x86_archs)s
checksum = sha256
base_channels = fedora30-%(arch)s
repo_url = https://mirrors.fedoraproject.org/metalink?repo=updates-released-f30&arch=%(arch)s
[fedora30-updates-modular]
label = %(base_channel)s-updates-modular
name = Fedora 30 Updates Modular (%(arch)s)
archs = %(_x86_archs)s
checksum = sha256
base_channels = fedora30-%(arch)s
repo_url = https://mirrors.fedoraproject.org/metalink?repo=updates-released-modular-f30&arch=%(arch)s
[fedora30-debug]
label = %(base_channel)s-debug
name = Fedora 30 Debug (%(arch)s)
archs = %(_x86_archs)s
checksum = sha256
base_channels = fedora30-%(arch)s
repo_url = https://mirrors.fedoraproject.org/metalink?repo=fedora-debug-30&arch=%(arch)s
[fedora30-updates-debug]
label = %(base_channel)s-updates-debug
name = Fedora 30 Updates Debug (%(arch)s)
archs = %(_x86_archs)s
checksum = sha256
base_channels = fedora30-%(arch)s
repo_url = https://mirrors.fedoraproject.org/metalink?repo=updates-released-debug-f30&arch=%(arch)s
[centos8]
archs = x86_64, ppc64le, aarch64
name = CentOS 8 (%(arch)s)
gpgkey_url = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
gpgkey_id = 8483C65D
gpgkey_fingerprint = 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
repo_url = http://mirrorlist.centos.org/?release=8&arch=%(arch)s&repo=BaseOS&infra=stock
dist_map_release = 8
[centos8-appstream]
label = %(base_channel)s-appstream
archs = x86_64, ppc64le, aarch64
name = CentOS 8 AppStream (%(arch)s)
base_channels = centos8-%(arch)s
repo_url = http://mirrorlist.centos.org/?release=8&arch=%(arch)s&repo=AppStream&infra=stock
[centos8-centosplus]
label = %(base_channel)s-centosplus
archs = x86_64, ppc64le, aarch64
name = CentOS 8 Plus (%(arch)s)
base_channels = centos8-%(arch)s
repo_url = http://mirrorlist.centos.org/?release=8&arch=%(arch)s&repo=centosplus&infra=stock
[centos8-cr]
label = %(base_channel)s-cr
archs = x86_64, ppc64le, aarch64
name = CentOS 8 CR (%(arch)s)
base_channels = centos8-%(arch)s
repo_url = http://mirrorlist.centos.org/?release=8&arch=%(arch)s&repo=cr&infra=stock
[centos8-extras]
label = %(base_channel)s-extras
archs = x86_64, ppc64le, aarch64
name = CentOS 8 Extras (%(arch)s)
base_channels = centos8-%(arch)s
repo_url = http://mirrorlist.centos.org/?release=8&arch=%(arch)s&repo=extras&infra=stock
[centos8-fasttrack]
label = %(base_channel)s-fasttrack
archs = x86_64, ppc64le, aarch64
name = CentOS 8 FastTrack (%(arch)s)
base_channels = centos8-%(arch)s
repo_url = http://mirrorlist.centos.org/?release=8&arch=%(arch)s&repo=fasttrack&infra=stock
[centos8-powertools]
label = %(base_channel)s-powertools
archs = x86_64, ppc64le, aarch64
name = CentOS 8 PowerTools (%(arch)s)
base_channels = centos8-%(arch)s
repo_url = http://mirrorlist.centos.org/?release=8&arch=%(arch)s&repo=PowerTools&infra=stock
[centos8-uyuni-client]
name = Uyuni Client Tools for %(base_channel_name)s
archs = %(_x86_archs)s, ppc64le, aarch64
base_channels = centos8-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/EL8-Uyuni-Client-Tools/EL_8/
[centos8-uyuni-client-devel]
name = Uyuni Client Tools for %(base_channel_name)s (Development)
archs = %(_x86_archs)s, ppc64le, aarch64
base_channels = centos8-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/EL8-Uyuni-Client-Tools/EL_8/
[epel8]
label = epel8-%(base_channel)s
name = EPEL 8 for %(base_channel_name)s
archs = x86_64, ppc64le, aarch64
base_channels = centos8-%(arch)s
gpgkey_url = http://download.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-8
gpgkey_id = 2F86D6A1
gpgkey_fingerprint = 94E2 79EB 8D8F 25B2 1810 ADF1 21EA 45AB 2F86 D6A1
repo_url = http://mirrors.fedoraproject.org/mirrorlist?repo=epel-8&arch=%(arch)s
[sdl8]
archs = x86_64
name = Springdale Linux 8 BaseOS (%(arch)s)
gpgkey_url = http://springdale.princeton.edu/data/springdale/7/%(arch)s/os/RPM-GPG-KEY-springdale
gpgkey_id = 41A40948
gpgkey_fingerprint = 2266 6129 E0CD 0062 8D44 C6CF 16CF C333 41A4 0948
repo_url = http://springdale.princeton.edu/data/springdale/8/%(arch)s/os/BaseOS/mirrorlist
dist_map_release = 8
[sdl8-updates]
label = %(base_channel)s-updates
archs = x86_64
name = Springdale Linux 8 BaseOS Updates (%(arch)s)
base_channels = sdl8-%(arch)s
repo_url = http://springdale.princeton.edu/data/springdale/8/%(arch)s/os/Updates_BaseOS/mirrorlist
[sdl8-appstream]
label = %(base_channel)s-appstream
archs = x86_64
name = Springdale Linux 8 AppStream (%(arch)s)
base_channels = sdl8-%(arch)s
repo_url = http://springdale.princeton.edu/data/springdale/8/%(arch)s/os/AppStream/mirrorlist
[sdl8-appstream-updates]
label = %(base_channel)s-appstream-updates
archs = x86_64
name = Springdale Linux 8 AppStream Updates (%(arch)s)
base_channels = sdl8-%(arch)s
repo_url = http://springdale.princeton.edu/data/springdale/8/%(arch)s/os/Updates_AppStream/mirrorlist
[sdl8-unsupported]
label = %(base_channel)s-unsupported
archs = x86_64
name = Springdale Linux 8 Unsupported (%(arch)s)
base_channels = sdl8-%(arch)s
repo_url = http://springdale.princeton.edu/data/puias/unsupported/8/%(arch)s/mirrorlist
[sdl8-computational]
label = %(base_channel)s-computational
archs = x86_64
name = Springdale Linux 8 Computational (%(arch)s)
base_channels = sdl8-%(arch)s
repo_url = http://springdale.princeton.edu/data/puias/computational/8/%(arch)s/mirrorlist
[sdl8-buildsys]
label = %(base_channel)s-buildsys
archs = x86_64
name = Springdale Linux 8 Build System (%(arch)s)
base_channels = sdl8-%(arch)s
repo_url = http://springdale.princeton.edu/data/puias/buildsys/8/os/%(arch)s/
[sdl8-uyuni-client]
name = Uyuni Client Tools for %(base_channel_name)s
archs = %(_x86_archs)s
base_channels = sdl8-%(arch)s
gpgkey_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/EL8-Uyuni-Client-Tools/EL_8/repodata/repomd.xml.key
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/EL8-Uyuni-Client-Tools/EL_8/
[sdl8-uyuni-client-devel]
name = Uyuni Client Tools for %(base_channel_name)s (Development)
archs = %(_x86_archs)s
base_channels = sdl8-%(arch)s
gpgkey_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/EL8-Uyuni-Client-Tools/EL_8/repodata/repomd.xml.key
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/EL8-Uyuni-Client-Tools/EL_8/
[centos7]
archs = x86_64, ppc64le, aarch64
name = CentOS 7 (%(arch)s)
gpgkey_url = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
gpgkey_id = F4A80EB5
gpgkey_fingerprint = 6341 AB27 53D7 8A78 A7C2 7BB1 24C6 A8A7 F4A8 0EB5
repo_url = http://mirrorlist.centos.org/?release=7&arch=%(arch)s&repo=os
dist_map_release = 7
[centos7-atomic]
label = %(base_channel)s-atomic
archs = x86_64
name = CentOS 7 Atomic (%(arch)s)
base_channels = centos7-%(arch)s
repo_url = http://mirror.centos.org/centos-7/7/atomic/%(arch)s
[centos7-centosplus]
label = %(base_channel)s-centosplus
archs = x86_64, ppc64le, aarch64
name = CentOS 7 Plus (%(arch)s)
base_channels = centos7-%(arch)s
repo_url = http://mirrorlist.centos.org/?release=7&arch=%(arch)s&repo=centosplus
[centos7-cloud]
label = %(base_channel)s-cloud
archs = x86_64
name = CentOS 7 Cloud (%(arch)s)
base_channels = centos7-%(arch)s
repo_url = http://mirror.centos.org/centos-7/7/cloud/%(arch)s
[centos7-cr]
label = %(base_channel)s-cr
archs = x86_64, ppc64le, aarch64
name = CentOS 7 CR (%(arch)s)
base_channels = centos7-%(arch)s
repo_url = http://mirrorlist.centos.org/?release=7&arch=%(arch)s&repo=cr
[centos7-extras]
label = %(base_channel)s-extras
archs = x86_64, ppc64le, aarch64
name = CentOS 7 Extras (%(arch)s)
base_channels = centos7-%(arch)s
repo_url = http://mirrorlist.centos.org/?release=7&arch=%(arch)s&repo=extras
[centos7-fasttrack]
label = %(base_channel)s-fasttrack
archs = x86_64, ppc64le, aarch64
name = CentOS 7 FastTrack (%(arch)s)
base_channels = centos7-%(arch)s
repo_url = http://mirrorlist.centos.org/?release=7&arch=%(arch)s&repo=fasttrack
[centos7-opstools]
label = %(base_channel)s-opstools
archs = x86_64
name = CentOS 7 OpsTools (%(arch)s)
base_channels = centos7-%(arch)s
repo_url = http://mirror.centos.org/centos-7/7/opstools/%(arch)s
[centos7-paas]
label = %(base_channel)s-paas
archs = x86_64
name = CentOS 7 PaaS (%(arch)s)
base_channels = centos7-%(arch)s
repo_url = http://mirror.centos.org/centos-7/7/paas/%(arch)s
[centos7-rt]
label = %(base_channel)s-rt
archs = x86_64
name = CentOS 7 RT (%(arch)s)
base_channels = centos7-%(arch)s
repo_url = http://mirror.centos.org/centos-7/7/rt/%(arch)s
[centos7-sclo]
label = %(base_channel)s-sclo
archs = x86_64
name = CentOS 7 Sclo (%(arch)s)
base_channels = centos7-%(arch)s
repo_url = http://mirror.centos.org/centos-7/7/sclo/%(arch)s
[centos7-storage]
label = %(base_channel)s-storage
archs = x86_64
name = CentOS 7 Storage (%(arch)s)
base_channels = centos7-%(arch)s
repo_url = http://mirror.centos.org/centos-7/7/storage/%(arch)s
[centos7-updates]
label = %(base_channel)s-updates
archs = x86_64, ppc64le, aarch64
name = CentOS 7 Updates (%(arch)s)
base_channels = centos7-%(arch)s
repo_url = http://mirrorlist.centos.org/?release=7&arch=%(arch)s&repo=updates
[centos7-virt]
label = %(base_channel)s-virt
archs = x86_64
name = CentOS 7 Virt (%(arch)s)
base_channels = centos7-%(arch)s
repo_url = http://mirror.centos.org/centos-7/7/virt/%(arch)s
[centos7-uyuni-client]
name = Uyuni Client Tools for %(base_channel_name)s
archs = %(_x86_archs)s, ppc64le, aarch64
base_channels = centos7-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/CentOS7-Uyuni-Client-Tools/CentOS_7/
[centos7-uyuni-client-devel]
name = Uyuni Client Tools for %(base_channel_name)s (Development)
archs = %(_x86_archs)s, ppc64le, aarch64
base_channels = centos7-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/CentOS7-Uyuni-Client-Tools/CentOS_7/
[epel7]
label = epel7-%(base_channel)s
name = EPEL 7 for %(base_channel_name)s
archs = x86_64, ppc64, ppc64le, aarch64
base_channels = centos7-%(arch)s scientific7-%(arch)s
gpgkey_url = http://download.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7
gpgkey_id = 352C64E5
gpgkey_fingerprint = 91E9 7D7C 4A5E 96F1 7F3E 888F 6A2F AEA2 352C 64E5
repo_url = http://mirrors.fedoraproject.org/mirrorlist?repo=epel-7&arch=%(arch)s
[sdl7]
archs = %(_x86_archs)s
name = Springdale Linux 7 (%(arch)s)
gpgkey_url = http://springdale.princeton.edu/data/springdale/7/%(arch)s/os/RPM-GPG-KEY-springdale
gpgkey_id = 41A40948
gpgkey_fingerprint = 2266 6129 E0CD 0062 8D44 C6CF 16CF C333 41A4 0948
repo_url = http://springdale.princeton.edu/data/springdale/7/%(arch)s/os/mirrorlist
dist_map_release = 7
[sdl7-updates]
label = %(base_channel)s-updates
archs = %(_x86_archs)s
name = Springdale Linux 7 Updates (%(arch)s)
base_channels = sdl7-%(arch)s
repo_url = http://springdale.princeton.edu/data/springdale/updates/7/en/os/%(arch)s/mirrorlist
[sdl7-addons]
label = %(base_channel)s-addons
archs = %(_x86_archs)s
name = Springdale Linux 7 Addons (%(arch)s)
base_channels = sdl7-%(arch)s
repo_url = http://springdale.princeton.edu/data/springdale/7/%(arch)s/os/Addons/mirrorlist
[sdl7-addons-updates]
label = %(base_channel)s-addons-updates
archs = %(_x86_archs)s
name = Springdale Linux 7 Addons Updates (%(arch)s)
base_channels = sdl7-addons-%(arch)s
repo_url = http://springdale.princeton.edu/data/springdale/updates/7/en/Addons/%(arch)s/mirrorlist
[sdl7-unsupported]
label = %(base_channel)s-unsupported
archs = %(_x86_archs)s
name = Springdale Linux 7 Unsupported (%(arch)s)
base_channels = sdl7-%(arch)s
repo_url = http://springdale.princeton.edu/data/springdale/unsupported/7/%(arch)s/mirrorlist
[sdl7-computational]
label = %(base_channel)s-computational
archs = %(_x86_archs)s
name = Springdale Linux 7 Computational (%(arch)s)
base_channels = sdl7-%(arch)s
repo_url = http://springdale.princeton.edu/data/springdale/computational/7/%(arch)s/mirrorlist
[sdl7-storage]
label = %(base_channel)s-storage
archs = %(_x86_archs)s
name = Springdale Linux 7 Storage (%(arch)s)
base_channels = sdl7-%(arch)s
repo_url = http://springdale.princeton.edu/data/springdale/storage/7/%(arch)s/mirrorlist
[sdl7-scl]
label = %(base_channel)s-scl
archs = %(_x86_archs)s
name = Springdale Linux 7 Software Collections (%(arch)s)
base_channels = sdl7-%(arch)s
repo_url = http://springdale.princeton.edu/data/springdale/SCL/7/%(arch)s/
[sdl7-buildsys]
label = %(base_channel)s-buildsys
archs = %(_x86_archs)s
name = Springdale Linux 7 Build System (%(arch)s)
base_channels = sdl7-%(arch)s
repo_url = http://springdale.princeton.edu/data/springdale/buildsys/7/os/%(arch)s/mirrorlist
[sdl7-uyuni-client]
name = Uyuni Client Tools for %(base_channel_name)s
archs = %(_x86_archs)s
base_channels = sdl7-%(arch)s
gpgkey_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/CentOS7-Uyuni-Client-Tools/CentOS_7/repodata/repomd.xml.key
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/CentOS7-Uyuni-Client-Tools/CentOS_7/
[sdl7-uyuni-client-devel]
name = Uyuni Client Tools for %(base_channel_name)s (Development)
archs = %(_x86_archs)s
base_channels = sdl7-%(arch)s
gpgkey_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/CentOS7-Uyuni-Client-Tools/CentOS_7/repodata/repomd.xml.key
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/CentOS7-Uyuni-Client-Tools/CentOS_7/
#---
[opensuse_leap15_6]
checksum = sha256
archs = x86_64, aarch64
name = openSUSE Leap 15.6 (%(arch)s)
gpgkey_url = file:///usr/lib/rpm/gnupg/keys/gpg-pubkey-29b700a4-62b07e22.asc
gpgkey_id = 29B700A4
gpgkey_fingerprint = AD48 5664 E901 B867 051A B15F 35A2 F86E 29B7 00A4
repo_url = http://download.opensuse.org/distribution/leap/15.6/repo/oss/
dist_map_release = 15.6
[opensuse_leap15_6-non-oss]
label = %(base_channel)s-non-oss
name = openSUSE 15.6 non oss (%(arch)s)
archs = x86_64, aarch64
checksum = sha256
base_channels = opensuse_leap15_6-%(arch)s
repo_url = http://download.opensuse.org/distribution/leap/15.6/repo/non-oss/
[opensuse_leap15_6-updates]
label = %(base_channel)s-updates
name = openSUSE Leap 15.6 Updates (%(arch)s)
archs = x86_64, aarch64
checksum = sha256
base_channels = opensuse_leap15_6-%(arch)s
repo_url = http://download.opensuse.org/update/leap/15.6/oss/
[opensuse_leap15_6-non-oss-updates]
label = %(base_channel)s-non-oss-updates
name = openSUSE Leap 15.6 non oss Updates (%(arch)s)
archs = x86_64, aarch64
checksum = sha256
base_channels = opensuse_leap15_6-%(arch)s
repo_url = http://download.opensuse.org/update/leap/15.6/non-oss/
[opensuse_leap15_6-sle-updates]
label = %(base_channel)s-sle-updates
name = Update repository with updates from SUSE Linux Enterprise 15 for openSUSE Leap 15.6 (%(arch)s)
archs = x86_64, aarch64
checksum = sha256
base_channels = opensuse_leap15_6-%(arch)s
repo_url = http://download.opensuse.org/update/leap/15.6/sle/
[opensuse_leap15_6-backports-updates]
label = %(base_channel)s-backports-updates
name = Update repository of openSUSE Leap 15.6 Backports (%(arch)s)
archs = x86_64, aarch64
checksum = sha256
base_channels = opensuse_leap15_6-%(arch)s
repo_url = http://download.opensuse.org/update/leap/15.6/backports/
# This is expected. openSUSE Leap 15.0 client tools are valid for all openSUSE Leap 15.X releases
[opensuse_leap15_6-uyuni-client]
name = Uyuni Client Tools for %(base_channel_name)s
archs = x86_64, aarch64
base_channels = opensuse_leap15_6-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/openSUSE_Leap_15-Uyuni-Client-Tools/openSUSE_Leap_15.0/
# This is expected. openSUSE Leap 15.0 client tools are valid for all openSUSE Leap 15.X releases
[opensuse_leap15_6-uyuni-client-devel]
name = Uyuni Client Tools for %(base_channel_name)s (Development)
archs = x86_64, aarch64
base_channels = opensuse_leap15_6-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/openSUSE_Leap_15-Uyuni-Client-Tools/openSUSE_Leap_15.0/
[opensuse_micro5_5]
checksum = sha256
archs = x86_64, aarch64
name = openSUSE Leap Micro 5.5 (%(arch)s)
gpgkey_url = https://download.opensuse.org/distribution/leap-micro/5.5/product/repo/Leap-Micro-5.5-x86_64-Media1/gpg-pubkey-3dbdc284-53674dd4.asc
gpgkey_id = 3DBDC284
gpgkey_fingerprint = 22C0 7BA5 3417 8CD0 2EFE 22AA B88B 2FD4 3DBD C284
repo_url = https://download.opensuse.org/distribution/leap-micro/5.5/product/repo/Leap-Micro-5.5-%(arch)s-Media1/
dist_map_release = 5.5
[opensuse_micro5_5-sle-updates]
label = %(base_channel)s-sle-updates
name = SLE Micro 5.5 Update Repository (%(arch)s)
archs = x86_64, aarch64
checksum = sha256
base_channels = opensuse_micro5_5-%(arch)s
repo_url = https://download.opensuse.org/update/leap-micro/5.5/sle/
# This is expected. openSUSE Leap 15.0 client tools are valid for all openSUSE Leap Micro 5.X releases
[opensuse_micro5_5-uyuni-client]
name = Uyuni Client Tools for %(base_channel_name)s
archs = x86_64, aarch64
base_channels = opensuse_micro5_5-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/openSUSE_Leap_15-Uyuni-Client-Tools/openSUSE_Leap_15.0/
# This is expected. openSUSE Leap 15.0 client tools are valid for all openSUSE Leap Micro 5.X release
[opensuse_micro5_5-uyuni-client-devel]
name = Uyuni Client Tools for %(base_channel_name)s (Development)
archs = x86_64, aarch64
base_channels = opensuse_micro5_5-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/openSUSE_Leap_15-Uyuni-Client-Tools/openSUSE_Leap_15.0/
[opensuse_micro6_0]
checksum = sha512
archs = x86_64, aarch64
name = openSUSE Leap Micro 6.0 (%(arch)s)
gpgkey_url = https://download.opensuse.org/distribution/leap-micro/6.0/product/repo/Leap-Micro-6.0-%(arch)s/repodata/repomd.xml.key
gpgkey_id = 29B700A4
gpgkey_fingerprint = AD48 5664 E901 B867 051A B15F 35A2 F86E 29B7 00A4
repo_url = https://download.opensuse.org/distribution/leap-micro/6.0/product/repo/Leap-Micro-6.0-%(arch)s/
dist_map_release = 6.0
[opensuse_micro6_0-uyuni-client]
name = Uyuni Client Tools for %(base_channel_name)s
archs = x86_64, aarch64
base_channels = opensuse_micro6_0-%(arch)s
checksum = sha512
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/SLMicro6-Uyuni-Client-Tools/SL-Micro6/
[opensuse_micro6_0-devel-uyuni-client]
name = Uyuni Client Tools for %(base_channel_name)s (Development)
archs = x86_64, aarch64
base_channels = opensuse_micro6_0-%(arch)s
checksum = sha512
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/SLMicro6-Uyuni-Client-Tools/SL-Micro6/
[opensuse_micro6_1]
checksum = sha512
archs = x86_64, aarch64
name = openSUSE Leap Micro 6.1 (%(arch)s)
gpgkey_url = https://download.opensuse.org/distribution/leap-micro/6.1/product/repo/openSUSE-Leap-Micro-6.1-%(arch)s/repodata/repomd.xml.key
gpgkey_id = 29B700A4
gpgkey_fingerprint = AD48 5664 E901 B867 051A B15F 35A2 F86E 29B7 00A4
repo_url = https://download.opensuse.org/distribution/leap-micro/6.1/product/repo/openSUSE-Leap-Micro-6.1-%(arch)s/
dist_map_release = 6.1
[opensuse_micro6_1-uyuni-client]
name = Uyuni Client Tools for %(base_channel_name)s
archs = x86_64, aarch64
base_channels = opensuse_micro6_1-%(arch)s
checksum = sha512
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/SLMicro6-Uyuni-Client-Tools/SL-Micro6/
[opensuse_micro6_1-devel-uyuni-client]
name = Uyuni Client Tools for %(base_channel_name)s (Development)
archs = x86_64, aarch64
base_channels = opensuse_micro6_1-%(arch)s
checksum = sha512
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/SLMicro6-Uyuni-Client-Tools/SL-Micro6/
[opensuse_micro6_2]
checksum = sha512
archs = x86_64, aarch64
name = openSUSE Leap Micro 6.2 (%(arch)s)
gpgkey_url = https://download.opensuse.org/distribution/leap-micro/6.2/product/repo/openSUSE-Leap-Micro-6.2-%(arch)s/repodata/repomd.xml.key
gpgkey_id = 29B700A4
gpgkey_fingerprint = AD48 5664 E901 B867 051A B15F 35A2 F86E 29B7 00A4
repo_url = https://download.opensuse.org/distribution/leap-micro/6.2/product/repo/openSUSE-Leap-Micro-6.2-%(arch)s/
dist_map_release = 6.2
[opensuse_micro6_2-uyuni-client]
name = Uyuni Client Tools for %(base_channel_name)s
archs = x86_64, aarch64
base_channels = opensuse_micro6_2-%(arch)s
checksum = sha512
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/SLMicro6-Uyuni-Client-Tools/SL-Micro6/
[opensuse_micro6_2-devel-uyuni-client]
name = Uyuni Client Tools for %(base_channel_name)s (Development)
archs = x86_64, aarch64
base_channels = opensuse_micro6_2-%(arch)s
checksum = sha512
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/SLMicro6-Uyuni-Client-Tools/SL-Micro6/
[opensuse_tumbleweed]
checksum = sha512
archs = x86_64, s390x, aarch64, ppc64le
name = openSUSE Tumbleweed (%(arch)s)
gpgkey_url = file:///usr/lib/rpm/gnupg/keys/gpg-pubkey-29b700a4-62b07e22.asc
gpgkey_id = 29B700A4
gpgkey_fingerprint = AD48 5664 E901 B867 051A B15F 35A2 F86E 29B7 00A4
repo_url = http://download.opensuse.org/tumbleweed/repo/oss/
dist_map_release = Tumbleweed
[opensuse_tumbleweed-non-oss]
label = %(base_channel)s-non-oss
name = openSUSE Tumbleweed non oss (%(arch)s)
archs = x86_64, s390x, aarch64, ppc64le
checksum = sha512
base_channels = opensuse_tumbleweed-%(arch)s
repo_url = http://download.opensuse.org/tumbleweed/repo/non-oss/
[opensuse_tumbleweed-updates]
label = %(base_channel)s-updates
name = openSUSE Tumbleweed Updates (%(arch)s)
archs = x86_64, s390x, aarch64, ppc64le
checksum = sha512
base_channels = opensuse_tumbleweed-%(arch)s
repo_url = https://download.opensuse.org/update/tumbleweed/
[opensuse_tumbleweed-openh264]
label = %(base_channel)s-openh264
name = openSUSE Tumbleweed Open H.264 Codec (%(arch)s)
archs = x86_64, s390x, aarch64, ppc64le
checksum = sha512
base_channels = opensuse_tumbleweed-%(arch)s
repo_url = http://codecs.opensuse.org/openh264/openSUSE_Tumbleweed
[opensuse_tumbleweed-uyuni-client]
name = Uyuni Client Tools for %(base_channel_name)s
archs = x86_64, s390x, aarch64, ppc64le
base_channels = opensuse_tumbleweed-%(arch)s
checksum = sha512
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
# Change URL to Stable: as soon as the first version is released
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/Tumbleweed-Uyuni-Client-Tools/openSUSE_Tumbleweed/
[opensuse_tumbleweed-uyuni-client-devel]
name = Uyuni Client Tools for %(base_channel_name)s (Development)
archs = x86_64, s390x, aarch64, ppc64le
base_channels = opensuse_tumbleweed-%(arch)s
checksum = sha512
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/Tumbleweed-Uyuni-Client-Tools/openSUSE_Tumbleweed/
[opensuse_microos]
checksum = sha512
archs = x86_64, aarch64, ppc64le
name = openSUSE MicroOS (%(arch)s)
gpgkey_url = file:///usr/lib/rpm/gnupg/keys/gpg-pubkey-29b700a4-62b07e22.asc
gpgkey_id = 29B700A4
gpgkey_fingerprint = AD48 5664 E901 B867 051A B15F 35A2 F86E 29B7 00A4
repo_url = http://download.opensuse.org/tumbleweed/repo/oss/
[opensuse_microos-non-oss]
label = %(base_channel)s-non-oss
name = openSUSE MicroOS no oss (%(arch)s)
archs = x86_64, aarch64, ppc64le
checksum = sha512
base_channels = opensuse_microos-%(arch)s
repo_url = http://download.opensuse.org/tumbleweed/repo/non-oss/
[opensuse_microos-update]
label = %(base_channel)s-update
name = openSUSE MicroOS Update (%(arch)s)
archs = x86_64, aarch64, ppc64le
checksum = sha512
base_channels = opensuse_microos-%(arch)s
repo_url = http://download.opensuse.org/update/tumbleweed/
[opensuse_microos-openh264]
label = %(base_channel)s-updates
name = openSUSE MicroOS Open H.264 Codec (%(arch)s)
archs = x86_64, aarch64, ppc64le
checksum = sha512
base_channels = opensuse_microos-%(arch)s
repo_url = http://codecs.opensuse.org/openh264/openSUSE_Tumbleweed
[opensuse_microos-uyuni-client]
name = Uyuni Client Tools for %(base_channel_name)s
archs = x86_64, aarch64, ppc64le
base_channels = opensuse_microos-%(arch)s
checksum = sha512
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
# Change URL to Stable: as soon as the first version is released
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/Tumbleweed-Uyuni-Client-Tools/openSUSE_Tumbleweed/
[opensuse_microos-uyuni-client-devel]
name = Uyuni Client Tools for %(base_channel_name)s (Development)
archs = x86_64, aarch64, ppc64le
base_channels = opensuse_microos-%(arch)s
checksum = sha512
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/Tumbleweed-Uyuni-Client-Tools/openSUSE_Tumbleweed/
[sles12-sp5-uyuni-client]
name = Uyuni Client Tools for SLES12 SP5 %(arch)s
archs = x86_64, s390x, aarch64, ppc64le
base_channels = sles12-sp5-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/SLE12-Uyuni-Client-Tools/SLE_12/
[sles12-sp5-uyuni-client-devel]
name = Uyuni Client Tools for SLES12 SP5 %(arch)s (Development)
archs = x86_64, s390x, aarch64, ppc64le
base_channels = sles12-sp5-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/SLE12-Uyuni-Client-Tools/SLE_12/
[sles12-sap-sp5-uyuni-client]
name = Uyuni Client Tools for SLES12 SP5 SAP %(arch)s
archs = x86_64, s390x, aarch64, ppc64le
base_channels = sle12-sp5-sap-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/SLE12-Uyuni-Client-Tools/SLE_12/
[sles12-sap-sp5-uyuni-client-devel]
name = Uyuni Client Tools for SLES12 SP5 SAP %(arch)s (Development)
archs = x86_64, s390x, aarch64, ppc64le
base_channels = sle12-sp5-sap-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/SLE12-Uyuni-Client-Tools/SLE_12/
[sles15-sp3-uyuni-client]
name = Uyuni Client Tools for SLES15 SP3 %(arch)s
archs = x86_64, s390x, aarch64, ppc64le
base_channels = sle-product-sles15-sp3-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/SLE15-Uyuni-Client-Tools/SLE_15/
[sles15-sp3-devel-uyuni-client]
name = Uyuni Client Tools for SLES15 SP3 %(arch)s (Development)
archs = x86_64, s390x, aarch64, ppc64le
base_channels = sle-product-sles15-sp3-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/SLE15-Uyuni-Client-Tools/SLE_15/
[sles15-sap-sp3-uyuni-client]
name = Uyuni Client Tools for SLES15 SP3 SAP %(arch)s
archs = x86_64, s390x, aarch64, ppc64le
base_channels = sle-product-sles_sap15-sp3-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/SLE15-Uyuni-Client-Tools/SLE_15/
[sles15-sap-sp3-devel-uyuni-client]
name = Uyuni Client Tools for SLES15 SP3 SAP %(arch)s (Development)
archs = x86_64, s390x, aarch64, ppc64le
base_channels = sle-product-sles_sap15-sp3-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/SLE15-Uyuni-Client-Tools/SLE_15/
[sles15-sp4-uyuni-client]
name = Uyuni Client Tools for SLES15 SP4 %(arch)s
archs = x86_64, s390x, aarch64, ppc64le
base_channels = sle-product-sles15-sp4-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/SLE15-Uyuni-Client-Tools/SLE_15/
[sles15-sp4-devel-uyuni-client]
name = Uyuni Client Tools for SLES15 SP4 %(arch)s (Development)
archs = x86_64, s390x, aarch64, ppc64le
base_channels = sle-product-sles15-sp4-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/SLE15-Uyuni-Client-Tools/SLE_15/
[sles15-sap-sp4-uyuni-client]
name = Uyuni Client Tools for SLES15 SP4 SAP %(arch)s
archs = x86_64, s390x, aarch64, ppc64le
base_channels = sle-product-sles_sap15-sp4-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/SLE15-Uyuni-Client-Tools/SLE_15/
[sles15-sap-sp4-devel-uyuni-client]
name = Uyuni Client Tools for SLES15 SP4 SAP %(arch)s (Development)
archs = x86_64, s390x, aarch64, ppc64le
base_channels = sle-product-sles_sap15-sp4-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/SLE15-Uyuni-Client-Tools/SLE_15/
[sles15-sp5-uyuni-client]
name = Uyuni Client Tools for SLES15 SP5 %(arch)s
archs = x86_64, s390x, aarch64, ppc64le
base_channels = sle-product-sles15-sp5-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/SLE15-Uyuni-Client-Tools/SLE_15/
[sles15-sp5-devel-uyuni-client]
name = Uyuni Client Tools for SLES15 SP5 %(arch)s (Development)
archs = x86_64, s390x, aarch64, ppc64le
base_channels = sle-product-sles15-sp5-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/SLE15-Uyuni-Client-Tools/SLE_15/
[sles15-sap-sp5-uyuni-client]
name = Uyuni Client Tools for SLES15 SP5 SAP %(arch)s
archs = x86_64, s390x, aarch64, ppc64le
base_channels = sle-product-sles_sap15-sp5-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/SLE15-Uyuni-Client-Tools/SLE_15/
[sles15-sap-sp5-devel-uyuni-client]
name = Uyuni Client Tools for SLES15 SP5 SAP %(arch)s (Development)
archs = x86_64, s390x, aarch64, ppc64le
base_channels = sle-product-sles_sap15-sp5-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/SLE15-Uyuni-Client-Tools/SLE_15/
[sles15-sp6-uyuni-client]
name = Uyuni Client Tools for SLES15 SP6 %(arch)s
archs = x86_64, s390x, aarch64, ppc64le
base_channels = sle-product-sles15-sp6-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/SLE15-Uyuni-Client-Tools/SLE_15/
[sles15-sp6-devel-uyuni-client]
name = Uyuni Client Tools for SLES15 SP6 %(arch)s (Development)
archs = x86_64, s390x, aarch64, ppc64le
base_channels = sle-product-sles15-sp6-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/SLE15-Uyuni-Client-Tools/SLE_15/
[sles15-sap-sp6-uyuni-client]
name = Uyuni Client Tools for SLES15 SP6 SAP %(arch)s
archs = x86_64, s390x, aarch64, ppc64le
base_channels = sle-product-sles_sap15-sp6-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/SLE15-Uyuni-Client-Tools/SLE_15/
[sles15-sap-sp6-devel-uyuni-client]
name = Uyuni Client Tools for SLES15 SP6 SAP %(arch)s (Development)
archs = x86_64, s390x, aarch64, ppc64le
base_channels = sle-product-sles_sap15-sp6-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/SLE15-Uyuni-Client-Tools/SLE_15/
[sles15-sp7-uyuni-client]
name = Uyuni Client Tools for SLES15 SP7 %(arch)s
archs = x86_64, s390x, aarch64, ppc64le
base_channels = sle-product-sles15-sp7-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/SLE15-Uyuni-Client-Tools/SLE_15/
[sles15-sp7-devel-uyuni-client]
name = Uyuni Client Tools for SLES15 SP7 %(arch)s (Development)
archs = x86_64, s390x, aarch64, ppc64le
base_channels = sle-product-sles15-sp7-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/SLE15-Uyuni-Client-Tools/SLE_15/
[sles15-sap-sp7-uyuni-client]
name = Uyuni Client Tools for SLES15 SP7 SAP %(arch)s
archs = x86_64, s390x, aarch64, ppc64le
base_channels = sle-product-sles_sap15-sp7-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/SLE15-Uyuni-Client-Tools/SLE_15/
[sles15-sap-sp7-devel-uyuni-client]
name = Uyuni Client Tools for SLES15 SP7 SAP %(arch)s (Development)
archs = x86_64, s390x, aarch64, ppc64le
base_channels = sle-product-sles_sap15-sp7-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/SLE15-Uyuni-Client-Tools/SLE_15/
[suse-microos-5.2-uyuni-client]
name = Uyuni Client Tools for SUSE MicroOS 5.2 %(arch)s
archs = x86_64, s390x, aarch64
base_channels = suse-microos-5.2-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/SLE15-Uyuni-Client-Tools/SLE_15/
[suse-microos-5.2-devel-uyuni-client]
name = Uyuni Client Tools for SUSE MicroOS 5.2 %(arch)s (Development)
archs = x86_64, s390x, aarch64
base_channels = suse-microos-5.2-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/SLE15-Uyuni-Client-Tools/SLE_15/
[sle-micro-5.3-uyuni-client]
name = Uyuni Client Tools for SLE Micro 5.3 %(arch)s
archs = x86_64, s390x, aarch64
base_channels = sle-micro-5.3-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/SLE15-Uyuni-Client-Tools/SLE_15/
[sle-micro-5.3-devel-uyuni-client]
name = Uyuni Client Tools for SLE Micro 5.3 %(arch)s (Development)
archs = x86_64, s390x, aarch64
base_channels = sle-micro-5.3-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/SLE15-Uyuni-Client-Tools/SLE_15/
[sle-micro-5.4-uyuni-client]
name = Uyuni Client Tools for SLE Micro 5.4 %(arch)s
archs = x86_64, s390x, aarch64
base_channels = sle-micro-5.4-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/SLE15-Uyuni-Client-Tools/SLE_15/
[sle-micro-5.4-devel-uyuni-client]
name = Uyuni Client Tools for SLE Micro 5.4 %(arch)s (Development)
archs = x86_64, s390x, aarch64
base_channels = sle-micro-5.4-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/SLE15-Uyuni-Client-Tools/SLE_15/
[sle-micro-5.5-uyuni-client]
name = Uyuni Client Tools for SLE Micro 5.5 %(arch)s
archs = x86_64, s390x, aarch64
base_channels = sle-micro-5.5-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/SLE15-Uyuni-Client-Tools/SLE_15/
[sle-micro-5.5-devel-uyuni-client]
name = Uyuni Client Tools for SLE Micro 5.5 %(arch)s (Development)
archs = x86_64, s390x, aarch64
base_channels = sle-micro-5.5-pool-%(arch)s
checksum = sha256
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/SLE15-Uyuni-Client-Tools/SLE_15/
[sl-micro-6.0-uyuni-client]
name = Uyuni Client Tools for SL Micro 6.0 %(arch)s
archs = x86_64, s390x, aarch64
base_channels = sl-micro-6.0-pool-%(arch)s
checksum = sha512
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/SLMicro6-Uyuni-Client-Tools/SL-Micro6/
[sl-micro-6.0-devel-uyuni-client]
name = Uyuni Client Tools for SL Micro 6.0 %(arch)s (Development)
archs = x86_64, s390x, aarch64
base_channels = sl-micro-6.0-pool-%(arch)s
checksum = sha512
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/SLMicro6-Uyuni-Client-Tools/SL-Micro6/
[sl-micro-6.1-uyuni-client]
name = Uyuni Client Tools for SL Micro 6.1 %(arch)s
archs = x86_64, s390x, aarch64
base_channels = sl-micro-6.1-pool-%(arch)s
checksum = sha512
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/SLMicro6-Uyuni-Client-Tools/SL-Micro6/
[sl-micro-6.1-devel-uyuni-client]
name = Uyuni Client Tools for SL Micro 6.1 %(arch)s (Development)
archs = x86_64, s390x, aarch64
base_channels = sl-micro-6.1-pool-%(arch)s
checksum = sha512
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/SLMicro6-Uyuni-Client-Tools/SL-Micro6/
[sl-micro-6.2-uyuni-client]
name = Uyuni Client Tools for SL Micro 6.2 %(arch)s
archs = x86_64, s390x, aarch64
base_channels = sl-micro-6.2-pool-%(arch)s
checksum = sha512
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/SLMicro6-Uyuni-Client-Tools/SL-Micro6/
[sl-micro-6.2-devel-uyuni-client]
name = Uyuni Client Tools for SL Micro 6.2 %(arch)s (Development)
archs = x86_64, s390x, aarch64
base_channels = sl-micro-6.2-pool-%(arch)s
checksum = sha512
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/SLMicro6-Uyuni-Client-Tools/SL-Micro6/
[rhel7-pool-uyuni]
archs = x86_64, aarch64
name = RedHat Enterprise Linux 7 (%(arch)s)
checksum = sha256
repo_type = yum
gpgkey_url =
gpgkey_id =
gpgkey_fingerprint =
repo_url = http://localhost/pub/repositories/empty/?uniquekey=7
[rhel7-uyuni-client]
name = Uyuni Client Tools for %(base_channel_name)s
archs = %(_x86_archs)s, aarch64
base_channels = rhel7-pool-uyuni-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/CentOS7-Uyuni-Client-Tools/CentOS_7/
[rhel7-uyuni-client-devel]
name = Uyuni Client Tools for %(base_channel_name)s (Development)
archs = %(_x86_archs)s, aarch64
base_channels = rhel7-pool-uyuni-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/CentOS7-Uyuni-Client-Tools/CentOS_7/
[rhel8-pool-uyuni]
archs = x86_64, aarch64
name = RedHat Enterprise Linux 8 (%(arch)s)
checksum = sha256
repo_type = yum
gpgkey_url =
gpgkey_id =
gpgkey_fingerprint =
repo_url = http://localhost/pub/repositories/empty/?uniquekey=8
[rhel8-uyuni-client]
name = Uyuni Client Tools for %(base_channel_name)s
archs = %(_x86_archs)s, aarch64
checksum = sha256
base_channels = rhel8-pool-uyuni-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/EL8-Uyuni-Client-Tools/EL_8/
[rhel8-uyuni-client-devel]
name = Uyuni Client Tools for %(base_channel_name)s (Development)
archs = %(_x86_archs)s, aarch64
checksum = sha256
base_channels = rhel8-pool-uyuni-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/EL8-Uyuni-Client-Tools/EL_8/
[rhel9-pool-uyuni]
archs = x86_64, aarch64, ppc64le, s390x
name = RedHat Enterprise Linux 9 (%(arch)s)
checksum = sha256
repo_type = yum
gpgkey_url =
gpgkey_id =
gpgkey_fingerprint =
repo_url = http://localhost/pub/repositories/empty/?uniquekey=9
[rhel9-uyuni-client]
name = Uyuni Client Tools for %(base_channel_name)s
archs = %(_x86_archs)s, aarch64, ppc64le, s390x
checksum = sha256
base_channels = rhel9-pool-uyuni-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/EL9-Uyuni-Client-Tools/EL_9/
[rhel9-uyuni-client-devel]
name = Uyuni Client Tools for %(base_channel_name)s (Development)
archs = %(_x86_archs)s, aarch64, ppc64le, s390x
checksum = sha256
base_channels = rhel9-pool-uyuni-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/EL9-Uyuni-Client-Tools/EL_9/
[oraclelinux9]
archs = x86_64, aarch64
name = Oracle Linux 9 (%(arch)s)
checksum = sha256
gpgkey_url = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgkey_id = 8D8B756F
gpgkey_fingerprint = 3E6D 826D 3FBA B389 C2F3 8E34 BC4D 06A0 8D8B 756F
repo_url = https://yum.oracle.com/repo/OracleLinux/OL9/baseos/latest/%(arch)s/
dist_map_release = 9
[oraclelinux9-appstream]
archs = x86_64, aarch64
name = Oracle Linux 9 AppStream (%(arch)s)
base_channels = oraclelinux9-%(arch)s
checksum = sha256
repo_url = https://yum.oracle.com/repo/OracleLinux/OL9/appstream/%(arch)s/
dist_map_release = 9
[oraclelinux9-addons]
label = %(base_channel)s-addons
archs = x86_64, aarch64
checksum = sha256
name = Addons for Oracle Linux 9 (%(arch)s)
base_channels = oraclelinux9-%(arch)s
repo_url = https://yum.oracle.com/repo/OracleLinux/OL9/addons/%(arch)s/
[oraclelinux9-codereadybuilder]
label = %(base_channel)s-codereadybuilder
archs = x86_64, aarch64
checksum = sha256
name = Latest CodeReady Builder packages for Oracle Linux 9 (%(arch)s)
base_channels = oraclelinux9-%(arch)s
repo_url = https://yum.oracle.com/repo/OracleLinux/OL9/codeready/builder/%(arch)s/
[oraclelinux9-developer-uek-r7]
label = %(base_channel)s-uek-r7
archs = x86_64, aarch64
checksum = sha256
name = Latest Unbreakable Enterprise Kernel Release 7 for Oracle Linux 9 (%(arch)s)
base_channels = oraclelinux9-%(arch)s
repo_url = https://yum.oracle.com/repo/OracleLinux/OL9/developer/UEKR7/%(arch)s/
[oraclelinux9-rdma]
label = %(base_channel)s-rdma
archs = x86_64
checksum = sha256
name = Latest RDMA packages for Unbreakable Enterprise Kernel on Oracle Linux 9
base_channels = oraclelinux9-%(arch)s
repo_url = https://yum.oracle.com/repo/OracleLinux/OL9/RDMA/%(arch)s/
[oraclelinux9-uyuni-client]
name = Uyuni Client Tools for %(base_channel_name)s
archs = %(_x86_archs)s, aarch64
checksum = sha256
base_channels = oraclelinux9-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/EL9-Uyuni-Client-Tools/EL_9/
[oraclelinux9-uyuni-client-devel]
name = Uyuni Client Tools for %(base_channel_name)s (Development)
archs = %(_x86_archs)s, aarch64
checksum = sha256
base_channels = oraclelinux9-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/EL9-Uyuni-Client-Tools/EL_9/
[oraclelinux8]
archs = x86_64, aarch64
name = Oracle Linux 8 (%(arch)s)
checksum = sha256
gpgkey_url = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgkey_id = AD986DA3
gpgkey_fingerprint = 76FD 3DB1 3AB6 7410 B89D B10E 8256 2EA9 AD98 6DA3
repo_url = https://yum.oracle.com/repo/OracleLinux/OL8/baseos/latest/%(arch)s/
dist_map_release = 8
[oraclelinux8-appstream]
archs = x86_64, aarch64
name = Oracle Linux 8 AppStream (%(arch)s)
base_channels = oraclelinux8-%(arch)s
checksum = sha256
repo_url = https://yum.oracle.com/repo/OracleLinux/OL8/appstream/%(arch)s/
dist_map_release = 8
[oraclelinux8-addons]
label = %(base_channel)s-addons
archs = x86_64, aarch64
checksum = sha256
name = Addons for Oracle Linux 8 (%(arch)s)
base_channels = oraclelinux8-%(arch)s
repo_url = https://yum.oracle.com/repo/OracleLinux/OL8/addons/%(arch)s/
[oraclelinux8-codereadybuilder]
label = %(base_channel)s-codereadybuilder
archs = x86_64, aarch64
checksum = sha256
name = Latest CodeReady Builder packages for Oracle Linux 8 (%(arch)s)
base_channels = oraclelinux8-%(arch)s
repo_url = https://yum.oracle.com/repo/OracleLinux/OL8/codeready/builder/%(arch)s/
[oraclelinux8-developer-uek-r6]
label = %(base_channel)s-uek-r6
archs = x86_64, aarch64
checksum = sha256
name = Latest Unbreakable Enterprise Kernel Release 6 for Oracle Linux 8 (%(arch)s)
base_channels = oraclelinux8-%(arch)s
repo_url = https://yum.oracle.com/repo/OracleLinux/OL8/developer/UEKR6/%(arch)s/
[oraclelinux8-developer]
label = %(base_channel)s-developer
archs = x86_64, aarch64
checksum = sha256
name = Packages for test and development - Oracle Linux 8 (%(arch)s)
base_channels = oraclelinux8-%(arch)s
repo_url = https://yum.oracle.com/repo/OracleLinux/OL8/developer/%(arch)s/
[oraclelinux8-uek-r6-rdma]
label = %(base_channel)s-uek-r6-rdma
archs = x86_64
checksum = sha256
name = Latest RDMA packages for UEK Release 6 packages on Oracle Linux 8
base_channels = oraclelinux8-%(arch)s
repo_url = https://yum.oracle.com/repo/OracleLinux/OL8/UEKR6/RDMA/%(arch)s/
[oraclelinux8-uyuni-client]
name = Uyuni Client Tools for %(base_channel_name)s
archs = %(_x86_archs)s, aarch64
checksum = sha256
base_channels = oraclelinux8-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/EL8-Uyuni-Client-Tools/EL_8/
[oraclelinux8-uyuni-client-devel]
name = Uyuni Client Tools for %(base_channel_name)s (Development)
archs = %(_x86_archs)s, aarch64
checksum = sha256
base_channels = oraclelinux8-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/EL8-Uyuni-Client-Tools/EL_8/
[oraclelinux7]
archs = x86_64, aarch64
name = Oracle Linux 7 (%(arch)s)
gpgkey_url = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgkey_id = EC551F03
gpgkey_fingerprint = 4214 4123 FECF C55B 9086 313D 72F9 7B74 EC55 1F03
repo_url = https://yum.oracle.com/repo/OracleLinux/OL7/latest/%(arch)s/
dist_map_release = 7
[oraclelinux7-optional]
label = %(base_channel)s-optional
archs = x86_64, aarch64
name = Optional Packages for Oracle Linux 7 (%(arch)s)
base_channels = oraclelinux7-%(arch)s
repo_url = https://yum.oracle.com/repo/OracleLinux/OL7/optional/latest/%(arch)s/
[oraclelinux7-addons]
label = %(base_channel)s-addons
archs = x86_64
name = Addons for Oracle Linux 7 (%(arch)s)
base_channels = oraclelinux7-%(arch)s
repo_url = https://yum.oracle.com/repo/OracleLinux/OL7/addons/%(arch)s/
[oraclelinux7-uek-r6]
label = %(base_channel)s-uek-r6
archs = x86_64
name = Latest Unbreakable Enterprise Kernel Release 6 for Oracle Linux 7 (%(arch)s)
base_channels = oraclelinux7-%(arch)s
repo_url = https://yum.oracle.com/repo/OracleLinux/OL7/UEKR6/%(arch)s/
[oraclelinux7-uek-r5]
label = %(base_channel)s-uek-r5
archs = x86_64
name = Latest Unbreakable Enterprise Kernel Release 5 for Oracle Linux 7 (%(arch)s)
base_channels = oraclelinux7-%(arch)s
repo_url = https://yum.oracle.com/repo/OracleLinux/OL7/UEKR5/%(arch)s/
[oraclelinux7-uek-r4]
label = %(base_channel)s-uek-r4
archs = x86_64
name = Latest Unbreakable Enterprise Kernel Release 4 for Oracle Linux 7 (%(arch)s)
base_channels = oraclelinux7-%(arch)s
repo_url = https://yum.oracle.com/repo/OracleLinux/OL7/UEKR4/%(arch)s/
[oraclelinux7-uek-r3]
label = %(base_channel)s-uek-r3
archs = x86_64
name = Latest Unbreakable Enterprise Kernel Release 3 for Oracle Linux 7 (%(arch)s)
base_channels = oraclelinux7-%(arch)s
repo_url = https://yum.oracle.com/repo/OracleLinux/OL7/UEKR3/%(arch)s/
[oraclelinux7-uek-r6-rdma]
label = %(base_channel)s-uek-r6-rdma
archs = x86_64
name = Latest RDMA packages for UEK Release 6 packages on Oracle Linux 7
base_channels = oraclelinux7-%(arch)s
repo_url = https://yum.oracle.com/repo/OracleLinux/OL7/UEKR6/RDMA/%(arch)s/
[oraclelinux7-uek-r5-rdma]
label = %(base_channel)s-uek-r5-rdma
archs = x86_64
name = Latest RDMA packages for UEK Release 5 packages on Oracle Linux 7
base_channels = oraclelinux7-%(arch)s
repo_url = https://yum.oracle.com/repo/OracleLinux/OL7/UEKR5/RDMA/%(arch)s/
[oraclelinux7-mysql55]
label = %(base_channel)s-mysql55
archs = x86_64
name = MySQL 5.5 for Oracle Linux 7 (%(arch)s)
base_channels = oraclelinux7-%(arch)s
repo_url = https://yum.oracle.com/repo/OracleLinux/OL7/MySQL55/%(arch)s/
[oraclelinux7-mysql56]
label = %(base_channel)s-mysql56
archs = x86_64
name = MySQL 5.6 for Oracle Linux 7 (%(arch)s)
base_channels = oraclelinux7-%(arch)s
repo_url = https://yum.oracle.com/repo/OracleLinux/OL7/MySQL56/%(arch)s/
[oraclelinux7-mysql57]
label = %(base_channel)s-mysql57
archs = x86_64
name = MySQL 5.7 for Oracle Linux 7 (%(arch)s)
base_channels = oraclelinux7-%(arch)s
repo_url = https://yum.oracle.com/repo/OracleLinux/OL7/MySQL57_community/%(arch)s/
[oraclelinux7-openstack20]
label = %(base_channel)s-openstack20
archs = x86_64
name = OpenStack 2.0 packages for Oracle Linux 7 (%(arch)s)
base_channels = oraclelinux7-%(arch)s
repo_url = https://yum.oracle.com/repo/OracleLinux/OL7/openstack20/%(arch)s/
[oraclelinux7-openstack21]
label = %(base_channel)s-openstack21
archs = x86_64
name = OpenStack 2.1 packages for Oracle Linux 7 (%(arch)s)
base_channels = oraclelinux7-%(arch)s
repo_url = https://yum.oracle.com/repo/OracleLinux/OL7/openstack21/%(arch)s/
[oraclelinux7-openstack30]
label = %(base_channel)s-openstack30
archs = x86_64
name = OpenStack 3.0 packages for Oracle Linux 7 (%(arch)s)
base_channels = oraclelinux7-%(arch)s
repo_url = https://yum.oracle.com/repo/OracleLinux/OL7/openstack30/%(arch)s/
[oraclelinux7-openstack30-extras]
label = %(base_channel)s-openstack30-extras
archs = x86_64
name = OpenStack 3.0 Extra packages for Oracle Linux 7 (%(arch)s)
base_channels = oraclelinux7-%(arch)s
repo_url = https://yum.oracle.com/repo/OracleLinux/OL7/openstack_extras/%(arch)s/
[oraclelinux7-scl]
label = %(base_channel)s-scl
archs = x86_64, aarch64
name = Software Collection Library packages for Oracle Linux 7 (%(arch)s)
base_channels = oraclelinux7-%(arch)s
repo_url = https://yum.oracle.com/repo/OracleLinux/OL7/SoftwareCollections/%(arch)s/
[oraclelinux7-ceph]
label = %(base_channel)s-ceph
archs = x86_64
name = Ceph Storage for Oracle Linux Release 2.0 for Oracle Linux 7 (%(arch)s)
base_channels = oraclelinux7-%(arch)s
repo_url = https://yum.oracle.com/repo/OracleLinux/OL7/ceph/%(arch)s/
[oraclelinux7-uyuni-client]
name = Uyuni Client Tools for %(base_channel_name)s
archs = %(_x86_archs)s, aarch64
base_channels = oraclelinux7-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/CentOS7-Uyuni-Client-Tools/CentOS_7/
[oraclelinux7-uyuni-client-devel]
name = Uyuni Client Tools for %(base_channel_name)s (Development)
archs = %(_x86_archs)s, aarch64
base_channels = oraclelinux7-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/CentOS7-Uyuni-Client-Tools/CentOS_7/
[uyuni-server-stable-tumbleweed]
name = Uyuni Server Stable for %(base_channel_name)s
archs = x86_64, aarch64
base_channels = opensuse_tumbleweed-%(arch)s
checksum = sha512
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable/images/repo/Uyuni-Server-POOL-x86_64-Media1/
[uyuni-server-devel-tumbleweed]
name = Uyuni Server Devel for %(base_channel_name)s (Development)
archs = x86_64, aarch64
base_channels = opensuse_tumbleweed-%(arch)s
checksum = sha512
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master/images/repo/Uyuni-Server-POOL-x86_64-Media1/
[uyuni-proxy-stable-tumbleweed]
name = Uyuni Proxy Stable for %(base_channel_name)s
archs = x86_64, aarch64
checksum = sha512
base_channels = opensuse_tumbleweed-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable/images/repo/Uyuni-Proxy-POOL-x86_64-Media1/
[uyuni-proxy-devel-tumbleweed]
name = Uyuni Proxy Devel for %(base_channel_name)s (Development)
archs = x86_64, aarch64
base_channels = opensuse_tumbleweed-%(arch)s
checksum = sha512
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master/images/repo/Uyuni-Proxy-POOL-x86_64-Media1/
[uyuni-server-stable-microos]
name = Uyuni Server Stable for %(base_channel_name)s
archs = x86_64, aarch64
base_channels = opensuse_microos-%(arch)s
checksum = sha512
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable/images/repo/Uyuni-Server-POOL-x86_64-Media1/
[uyuni-server-devel-microos]
name = Uyuni Server Devel for %(base_channel_name)s (Development)
archs = x86_64, aarch64
base_channels = opensuse_microos-%(arch)s
checksum = sha512
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master/images/repo/Uyuni-Server-POOL-x86_64-Media1/
[uyuni-proxy-stable-microos]
name = Uyuni Proxy Stable for %(base_channel_name)s
archs = x86_64, aarch64
checksum = sha512
base_channels = opensuse_microos-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable/images/repo/Uyuni-Proxy-POOL-x86_64-Media1/
[uyuni-proxy-devel-microos]
name = Uyuni Proxy Devel for %(base_channel_name)s (Development)
archs = x86_64, aarch64
base_channels = opensuse_microos-%(arch)s
checksum = sha512
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master/images/repo/Uyuni-Proxy-POOL-x86_64-Media1/
[ubuntu-1604-pool-amd64]
label = ubuntu-16.04-pool-amd64
checksum = sha256
archs = amd64-deb
repo_type = deb
name = ubuntu-16.04-pool for amd64
gpgkey_url =
gpgkey_id =
gpgkey_fingerprint =
repo_url = http://localhost/pub/repositories/empty-deb/?uniquekey=1604
[ubuntu-1604-amd64-main]
label = ubuntu-1604-amd64-main
checksum = sha256
archs = amd64-deb
repo_type = deb
name = Ubuntu 16.04 LTS AMD64 Main
base_channels = ubuntu-16.04-pool-amd64
repo_url = http://archive.ubuntu.com/ubuntu/dists/xenial/main/binary-amd64/
[ubuntu-1604-amd64-updates]
label = ubuntu-1604-amd64-main-updates
name = Ubuntu 16.04 LTS AMD64 Main Updates
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64
repo_url = http://archive.ubuntu.com/ubuntu/dists/xenial-updates/main/binary-amd64/
[ubuntu-1604-amd64-security]
label = ubuntu-1604-amd64-main-security
name = Ubuntu 16.04 LTS AMD64 Security
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64
repo_url = http://archive.ubuntu.com/ubuntu/dists/xenial-security/main/binary-amd64/
[ubuntu-1604-amd64-universe]
label = ubuntu-1604-amd64-universe
name = Ubuntu 16.04 LTS AMD64 Universe
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64
repo_url = http://archive.ubuntu.com/ubuntu/dists/xenial/universe/binary-amd64/
[ubuntu-1604-amd64-universe-updates]
label = ubuntu-1604-amd64-universe-updates
name = Ubuntu 16.04 LTS AMD64 Universe Updates
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64
repo_url = http://archive.ubuntu.com/ubuntu/dists/xenial-updates/universe/binary-amd64/
[ubuntu-1604-amd64-universe-security]
label = ubuntu-1604-amd64-universe-security
name = Ubuntu 16.04 LTS AMD64 Universe Security Updates
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64
repo_url = http://archive.ubuntu.com/ubuntu/dists/xenial-security/universe/binary-amd64/
[ubuntu-1604-amd64-main-backports]
label = ubuntu-1604-amd64-main-backports
name = Ubuntu 16.04 LTS AMD64 Main Backports
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64
repo_url = http://archive.ubuntu.com/ubuntu/dists/xenial-backports/main/binary-amd64/
[ubuntu-1604-amd64-multiverse-backports]
label = ubuntu-1604-amd64-multiverse-backports
name = Ubuntu 16.04 LTS AMD64 Multiverse Backports
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64
repo_url = http://archive.ubuntu.com/ubuntu/dists/xenial-backports/multiverse/binary-amd64/
[ubuntu-1604-amd64-restricted-backports]
label = ubuntu-1604-amd64-restricted-backports
name = Ubuntu 16.04 LTS AMD64 Restricted Backports
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64
repo_url = http://archive.ubuntu.com/ubuntu/dists/xenial-backports/restricted/binary-amd64/
[ubuntu-1604-amd64-universe-backports]
label = ubuntu-1604-amd64-universe-backports
name = Ubuntu 16.04 LTS AMD64 Universe Backports
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64
repo_url = http://archive.ubuntu.com/ubuntu/dists/xenial-backports/universe/binary-amd64/
[ubuntu-1604-amd64-multiverse]
label = ubuntu-1604-amd64-multiverse
name = Ubuntu 16.04 LTS AMD64 Multiverse
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64
repo_url = http://archive.ubuntu.com/ubuntu/dists/xenial/multiverse/binary-amd64/
[ubuntu-1604-amd64-restricted]
label = ubuntu-1604-amd64-restricted
name = Ubuntu 16.04 LTS AMD64 Restricted
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64
repo_url = http://archive.ubuntu.com/ubuntu/dists/xenial/restricted/binary-amd64/
[ubuntu-1604-amd64-multiverse-security]
label = ubuntu-1604-amd64-multiverse-security
name = Ubuntu 16.04 LTS AMD64 Multiverse Security
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64
repo_url = http://security.ubuntu.com/ubuntu/dists/xenial-security/multiverse/binary-amd64/
[ubuntu-1604-amd64-restricted-security]
label = ubuntu-1604-amd64-restricted-security
name = Ubuntu 16.04 LTS AMD64 Restricted Security
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64
repo_url = http://security.ubuntu.com/ubuntu/dists/xenial-security/restricted/binary-amd64/
[ubuntu-1604-amd64-multiverse-updates]
label = ubuntu-1604-amd64-multiverse-updates
name = Ubuntu 16.04 LTS AMD64 Multiverse Updates
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64
repo_url = http://archive.ubuntu.com/ubuntu/dists/xenial-updates/multiverse/binary-amd64/
[ubuntu-1604-amd64-restricted-updates]
label = ubuntu-1604-amd64-restricted-updates
name = Ubuntu 16.04 LTS AMD64 Restricted Updates
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64
repo_url = http://archive.ubuntu.com/ubuntu/dists/xenial-updates/restricted/binary-amd64/
[ubuntu-1604-pool-amd64-uyuni]
label = ubuntu-16.04-pool-amd64-uyuni
checksum = sha256
archs = amd64-deb
repo_type = deb
name = Ubuntu 16.04 LTS AMD64 Base for Uyuni
gpgkey_url =
gpgkey_id =
gpgkey_fingerprint =
repo_url = http://localhost/pub/repositories/empty-deb/?uniquekey=1604-uyuni
[ubuntu-1604-amd64-main-uyuni]
label = ubuntu-1604-amd64-main-uyuni
checksum = sha256
archs = amd64-deb
repo_type = deb
name = Ubuntu 16.04 LTS AMD64 Main for Uyuni
base_channels = ubuntu-16.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/xenial/main/binary-amd64/
[ubuntu-1604-amd64-updates-uyuni]
label = ubuntu-1604-amd64-main-updates-uyuni
name = Ubuntu 16.04 LTS AMD64 Main Updates for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/xenial-updates/main/binary-amd64/
[ubuntu-1604-amd64-security-uyuni]
label = ubuntu-1604-amd64-main-security-uyuni
name = Ubuntu 16.04 LTS AMD64 Security for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/xenial-security/main/binary-amd64/
[ubuntu-1604-amd64-universe-uyuni]
label = ubuntu-1604-amd64-universe-uyuni
name = Ubuntu 16.04 LTS AMD64 Universe for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/xenial/universe/binary-amd64/
[ubuntu-1604-amd64-universe-updates-uyuni]
label = ubuntu-1604-amd64-universe-updates-uyuni
name = Ubuntu 16.04 LTS AMD64 Universe Updates for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/xenial-updates/universe/binary-amd64/
[ubuntu-1604-amd64-universe-security-uyuni]
label = ubuntu-1604-amd64-universe-security-uyuni
name = Ubuntu 16.04 LTS AMD64 Universe Security Updates for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/xenial-security/universe/binary-amd64/
[ubuntu-1604-amd64-main-backports-uyuni]
label = ubuntu-1604-amd64-main-backports-uyuni
name = Ubuntu 16.04 LTS AMD64 Main Backports for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/xenial-backports/main/binary-amd64/
[ubuntu-1604-amd64-multiverse-backports-uyuni]
label = ubuntu-1604-amd64-multiverse-backports-uyuni
name = Ubuntu 16.04 LTS AMD64 Multiverse Backports for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/xenial-backports/multiverse/binary-amd64/
[ubuntu-1604-amd64-restricted-backports-uyuni]
label = ubuntu-1604-amd64-restricted-backports-uyuni
name = Ubuntu 16.04 LTS AMD64 Restricted Backports for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/xenial-backports/restricted/binary-amd64/
[ubuntu-1604-amd64-universe-backports-uyuni]
label = ubuntu-1604-amd64-universe-backports-uyuni
name = Ubuntu 16.04 LTS AMD64 Universe Backports for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/xenial-backports/universe/binary-amd64/
[ubuntu-1604-amd64-multiverse-uyuni]
label = ubuntu-1604-amd64-multiverse-uyuni
name = Ubuntu 16.04 LTS AMD64 Multiverse for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/xenial/multiverse/binary-amd64/
[ubuntu-1604-amd64-restricted-uyuni]
label = ubuntu-1604-amd64-restricted-uyuni
name = Ubuntu 16.04 LTS AMD64 Restricted for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/xenial/restricted/binary-amd64/
[ubuntu-1604-amd64-multiverse-security-uyuni]
label = ubuntu-1604-amd64-multiverse-security-uyuni
name = Ubuntu 16.04 LTS AMD64 Multiverse Security for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64-uyuni
repo_url = http://security.ubuntu.com/ubuntu/dists/xenial-security/multiverse/binary-amd64/
[ubuntu-1604-amd64-restricted-security-uyuni]
label = ubuntu-1604-amd64-restricted-security-uyuni
name = Ubuntu 16.04 LTS AMD64 Restricted Security for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64-uyuni
repo_url = http://security.ubuntu.com/ubuntu/dists/xenial-security/restricted/binary-amd64/
[ubuntu-1604-amd64-multiverse-updates-uyuni]
label = ubuntu-1604-amd64-multiverse-updates-uyuni
name = Ubuntu 16.04 LTS AMD64 Multiverse Updates for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/xenial-updates/multiverse/binary-amd64/
[ubuntu-1604-amd64-restricted-updates-uyuni]
label = ubuntu-1604-amd64-restricted-updates-uyuni
name = Ubuntu 16.04 LTS AMD64 Restricted Updates for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/xenial-updates/restricted/binary-amd64/
[ubuntu-1604-amd64-uyuni-client]
label = ubuntu-1604-amd64-uyuni-client
name = Uyuni Client Tools for Ubuntu 16.04 AMD64
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64-uyuni
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/Ubuntu1604-Uyuni-Client-Tools/xUbuntu_16.04/
[ubuntu-1604-amd64-uyuni-client-devel]
label = ubuntu-1604-amd64-uyuni-client-devel
name = Uyuni Client Tools for Ubuntu 16.04 AMD64 (Developement)
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-16.04-pool-amd64-uyuni
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/Ubuntu1604-Uyuni-Client-Tools/xUbuntu_16.04/
[ubuntu-1804-pool-amd64]
label = ubuntu-18.04-pool-amd64
checksum = sha256
archs = amd64-deb
repo_type = deb
name = ubuntu-18.04-pool for amd64
gpgkey_url =
gpgkey_id =
gpgkey_fingerprint =
repo_url = http://localhost/pub/repositories/empty-deb/?uniquekey=1804
[ubuntu-1804-amd64-main]
label = ubuntu-1804-amd64-main
checksum = sha256
archs = amd64-deb
repo_type = deb
name = Ubuntu 18.04 LTS AMD64 Main
base_channels = ubuntu-18.04-pool-amd64
repo_url = http://archive.ubuntu.com/ubuntu/dists/bionic/main/binary-amd64/
[ubuntu-1804-amd64-main-updates]
label = ubuntu-1804-amd64-main-updates
name = Ubuntu 18.04 LTS AMD64 Main Updates
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64
repo_url = http://archive.ubuntu.com/ubuntu/dists/bionic-updates/main/binary-amd64/
[ubuntu-1804-amd64-main-security]
label = ubuntu-1804-amd64-main-security
name = Ubuntu 18.04 LTS AMD64 Main Security
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64
repo_url = http://archive.ubuntu.com/ubuntu/dists/bionic-security/main/binary-amd64/
[ubuntu-1804-amd64-universe]
label = ubuntu-1804-amd64-universe
name = Ubuntu 18.04 LTS AMD64 Universe
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64
repo_url = http://archive.ubuntu.com/ubuntu/dists/bionic/universe/binary-amd64/
[ubuntu-1804-amd64-universe-updates]
label = ubuntu-1804-amd64-universe-updates
name = Ubuntu 18.04 LTS AMD64 Universe Updates
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64
repo_url = http://archive.ubuntu.com/ubuntu/dists/bionic-updates/universe/binary-amd64/
[ubuntu-1804-amd64-universe-security]
label = ubuntu-1804-amd64-universe-security
name = Ubuntu 18.04 LTS AMD64 Universe Security Updates
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64
repo_url = http://archive.ubuntu.com/ubuntu/dists/bionic-security/universe/binary-amd64/
[ubuntu-1804-amd64-main-backports]
label = ubuntu-1804-amd64-main-backports
name = Ubuntu 18.04 LTS AMD64 Main Backports
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64
repo_url = http://archive.ubuntu.com/ubuntu/dists/bionic-backports/main/binary-amd64/
[ubuntu-1804-amd64-multiverse-backports]
label = ubuntu-1804-amd64-multiverse-backports
name = Ubuntu 18.04 LTS AMD64 Multiverse Backports
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64
repo_url = http://archive.ubuntu.com/ubuntu/dists/bionic-backports/multiverse/binary-amd64/
[ubuntu-1804-amd64-restricted-backports]
label = ubuntu-1804-amd64-restricted-backports
name = Ubuntu 18.04 LTS AMD64 Restricted Backports
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64
repo_url = http://archive.ubuntu.com/ubuntu/dists/bionic-backports/restricted/binary-amd64/
[ubuntu-1804-amd64-universe-backports]
label = ubuntu-1804-amd64-universe-backports
name = Ubuntu 18.04 LTS AMD64 Universe Backports
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64
repo_url = http://archive.ubuntu.com/ubuntu/dists/bionic-backports/universe/binary-amd64/
[ubuntu-1804-amd64-multiverse]
label = ubuntu-1804-amd64-multiverse
name = Ubuntu 18.04 LTS AMD64 Multiverse
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64
repo_url = http://archive.ubuntu.com/ubuntu/dists/bionic/multiverse/binary-amd64/
[ubuntu-1804-amd64-restricted]
label = ubuntu-1804-amd64-restricted
name = Ubuntu 18.04 LTS AMD64 Restricted
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64
repo_url = http://archive.ubuntu.com/ubuntu/dists/bionic/restricted/binary-amd64/
[ubuntu-1804-amd64-multiverse-security]
label = ubuntu-1804-amd64-multiverse-security
name = Ubuntu 18.04 LTS AMD64 Multiverse Security
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64
repo_url = http://security.ubuntu.com/ubuntu/dists/bionic-security/multiverse/binary-amd64/
[ubuntu-1804-amd64-restricted-security]
label = ubuntu-1804-amd64-restricted-security
name = Ubuntu 18.04 LTS AMD64 Restricted Security
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64
repo_url = http://security.ubuntu.com/ubuntu/dists/bionic-security/restricted/binary-amd64/
[ubuntu-1804-amd64-multiverse-updates]
label = ubuntu-1804-amd64-multiverse-updates
name = Ubuntu 18.04 LTS AMD64 Multiverse Updates
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64
repo_url = http://archive.ubuntu.com/ubuntu/dists/bionic-updates/multiverse/binary-amd64/
[ubuntu-1804-amd64-restricted-updates]
label = ubuntu-1804-amd64-restricted-updates
name = Ubuntu 18.04 LTS AMD64 Restricted Updates
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64
repo_url = http://archive.ubuntu.com/ubuntu/dists/bionic-updates/restricted/binary-amd64/
[ubuntu-1804-pool-amd64-uyuni]
label = ubuntu-18.04-pool-amd64-uyuni
checksum = sha256
archs = amd64-deb
repo_type = deb
name = Ubuntu 18.04 LTS AMD64 Base for Uyuni
gpgkey_url =
gpgkey_id =
gpgkey_fingerprint =
repo_url = http://localhost/pub/repositories/empty-deb/?uniquekey=1804-uyuni
[ubuntu-1804-amd64-main-uyuni]
label = ubuntu-1804-amd64-main-uyuni
checksum = sha256
archs = amd64-deb
repo_type = deb
name = Ubuntu 18.04 LTS AMD64 Main for Uyuni
base_channels = ubuntu-18.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/bionic/main/binary-amd64/
[ubuntu-1804-amd64-main-updates-uyuni]
label = ubuntu-1804-amd64-main-updates-uyuni
name = Ubuntu 18.04 LTS AMD64 Main Updates for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/bionic-updates/main/binary-amd64/
[ubuntu-1804-amd64-main-security-uyuni]
label = ubuntu-1804-amd64-main-security-uyuni
name = Ubuntu 18.04 LTS AMD64 Main Security for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/bionic-security/main/binary-amd64/
[ubuntu-1804-amd64-universe-uyuni]
label = ubuntu-1804-amd64-universe-uyuni
name = Ubuntu 18.04 LTS AMD64 Universe for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/bionic/universe/binary-amd64/
[ubuntu-1804-amd64-universe-updates-uyuni]
label = ubuntu-1804-amd64-universe-updates-uyuni
name = Ubuntu 18.04 LTS AMD64 Universe Updates for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/bionic-updates/universe/binary-amd64/
[ubuntu-1804-amd64-universe-security-uyuni]
label = ubuntu-1804-amd64-universe-security-uyuni
name = Ubuntu 18.04 LTS AMD64 Universe Security Updates for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/bionic-security/universe/binary-amd64/
[ubuntu-1804-amd64-main-backports-uyuni]
label = ubuntu-1804-amd64-main-backports-uyuni
name = Ubuntu 18.04 LTS AMD64 Main Backports for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/bionic-backports/main/binary-amd64/
[ubuntu-1804-amd64-multiverse-backports-uyuni]
label = ubuntu-1804-amd64-multiverse-backports-uyuni
name = Ubuntu 18.04 LTS AMD64 Multiverse Backports for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/bionic-backports/multiverse/binary-amd64/
[ubuntu-1804-amd64-restricted-backports-uyuni]
label = ubuntu-1804-amd64-restricted-backports-uyuni
name = Ubuntu 18.04 LTS AMD64 Restricted Backports for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/bionic-backports/restricted/binary-amd64/
[ubuntu-1804-amd64-universe-backports-uyuni]
label = ubuntu-1804-amd64-universe-backports-uyuni
name = Ubuntu 18.04 LTS AMD64 Universe Backports for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/bionic-backports/universe/binary-amd64/
[ubuntu-1804-amd64-multiverse-uyuni]
label = ubuntu-1804-amd64-multiverse-uyuni
name = Ubuntu 18.04 LTS AMD64 Multiverse for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/bionic/multiverse/binary-amd64/
[ubuntu-1804-amd64-restricted-uyuni]
label = ubuntu-1804-amd64-restricted-uyuni
name = Ubuntu 18.04 LTS AMD64 Restricted for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/bionic/restricted/binary-amd64/
[ubuntu-1804-amd64-multiverse-security-uyuni]
label = ubuntu-1804-amd64-multiverse-security-uyuni
name = Ubuntu 18.04 LTS AMD64 Multiverse Security for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64-uyuni
repo_url = http://security.ubuntu.com/ubuntu/dists/bionic-security/multiverse/binary-amd64/
[ubuntu-1804-amd64-restricted-security-uyuni]
label = ubuntu-1804-amd64-restricted-security-uyuni
name = Ubuntu 18.04 LTS AMD64 Restricted Security for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64-uyuni
repo_url = http://security.ubuntu.com/ubuntu/dists/bionic-security/restricted/binary-amd64/
[ubuntu-1804-amd64-multiverse-updates-uyuni]
label = ubuntu-1804-amd64-multiverse-updates-uyuni
name = Ubuntu 18.04 LTS AMD64 Multiverse Updates for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/bionic-updates/multiverse/binary-amd64/
[ubuntu-1804-amd64-restricted-updates-uyuni]
label = ubuntu-1804-amd64-restricted-updates-uyuni
name = Ubuntu 18.04 LTS AMD64 Restricted Updates for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/bionic-updates/restricted/binary-amd64/
[ubuntu-1804-amd64-uyuni-client]
label = ubuntu-1804-amd64-uyuni-client
name = Uyuni Client Tools for Ubuntu 18.04 AMD64
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64-uyuni
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/Ubuntu1804-Uyuni-Client-Tools/xUbuntu_18.04/
[ubuntu-1804-amd64-uyuni-client-devel]
label = ubuntu-1804-amd64-uyuni-client-devel
name = Uyuni Client Tools for Ubuntu 18.04 AMD64 (Development)
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-18.04-pool-amd64-uyuni
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/Ubuntu1804-Uyuni-Client-Tools/xUbuntu_18.04/
[ubuntu-2004-pool-amd64-uyuni]
label = ubuntu-20.04-pool-amd64-uyuni
checksum = sha256
archs = amd64-deb
repo_type = deb
name = Ubuntu 20.04 LTS AMD64 Base for Uyuni
gpgkey_url =
gpgkey_id =
gpgkey_fingerprint =
repo_url = http://localhost/pub/repositories/empty-deb/?uniquekey=2004-uyuni
[ubuntu-2004-amd64-main-uyuni]
label = ubuntu-2004-amd64-main-uyuni
checksum = sha256
archs = amd64-deb
repo_type = deb
name = Ubuntu 20.04 LTS AMD64 Main for Uyuni
base_channels = ubuntu-20.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/focal/main/binary-amd64/
[ubuntu-2004-amd64-main-updates-uyuni]
label = ubuntu-2004-amd64-main-updates-uyuni
name = Ubuntu 20.04 LTS AMD64 Main Updates for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-20.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/focal-updates/main/binary-amd64/
[ubuntu-2004-amd64-main-security-uyuni]
label = ubuntu-2004-amd64-main-security-uyuni
name = Ubuntu 20.04 LTS AMD64 Main Security for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-20.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/focal-security/main/binary-amd64/
[ubuntu-2004-amd64-universe-uyuni]
label = ubuntu-2004-amd64-universe-uyuni
name = Ubuntu 20.04 LTS AMD64 Universe for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-20.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/focal/universe/binary-amd64/
[ubuntu-2004-amd64-universe-updates-uyuni]
label = ubuntu-2004-amd64-universe-updates-uyuni
name = Ubuntu 20.04 LTS AMD64 Universe Updates for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-20.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/focal-updates/universe/binary-amd64/
[ubuntu-2004-amd64-universe-security-uyuni]
label = ubuntu-2004-amd64-universe-security-uyuni
name = Ubuntu 20.04 LTS AMD64 Universe Security Updates for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-20.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/focal-security/universe/binary-amd64/
[ubuntu-2004-amd64-main-backports-uyuni]
label = ubuntu-2004-amd64-main-backports-uyuni
name = Ubuntu 20.04 LTS AMD64 Main Backports for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-20.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/focal-backports/main/binary-amd64/
[ubuntu-2004-amd64-multiverse-backports-uyuni]
label = ubuntu-2004-amd64-multiverse-backports-uyuni
name = Ubuntu 20.04 LTS AMD64 Multiverse Backports for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-20.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/focal-backports/multiverse/binary-amd64/
[ubuntu-2004-amd64-restricted-backports-uyuni]
label = ubuntu-2004-amd64-restricted-backports-uyuni
name = Ubuntu 20.04 LTS AMD64 Restricted Backports for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-20.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/focal-backports/restricted/binary-amd64/
[ubuntu-2004-amd64-universe-backports-uyuni]
label = ubuntu-2004-amd64-universe-backports-uyuni
name = Ubuntu 20.04 LTS AMD64 Universe Backports for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-20.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/focal-backports/universe/binary-amd64/
[ubuntu-2004-amd64-multiverse-uyuni]
label = ubuntu-2004-amd64-multiverse-uyuni
name = Ubuntu 20.04 LTS AMD64 Multiverse for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-20.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/focal/multiverse/binary-amd64/
[ubuntu-2004-amd64-restricted-uyuni]
label = ubuntu-2004-amd64-restricted-uyuni
name = Ubuntu 20.04 LTS AMD64 Restricted for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-20.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/focal/restricted/binary-amd64/
[ubuntu-2004-amd64-multiverse-security-uyuni]
label = ubuntu-2004-amd64-multiverse-security-uyuni
name = Ubuntu 20.04 LTS AMD64 Multiverse Security for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-20.04-pool-amd64-uyuni
repo_url = http://security.ubuntu.com/ubuntu/dists/focal-security/multiverse/binary-amd64/
[ubuntu-2004-amd64-restricted-security-uyuni]
label = ubuntu-2004-amd64-restricted-security-uyuni
name = Ubuntu 20.04 LTS AMD64 Restricted Security for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-20.04-pool-amd64-uyuni
repo_url = http://security.ubuntu.com/ubuntu/dists/focal-security/restricted/binary-amd64/
[ubuntu-2004-amd64-multiverse-updates-uyuni]
label = ubuntu-2004-amd64-multiverse-updates-uyuni
name = Ubuntu 20.04 LTS AMD64 Multiverse Updates for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-20.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/focal-updates/multiverse/binary-amd64/
[ubuntu-2004-amd64-restricted-updates-uyuni]
label = ubuntu-2004-amd64-restricted-updates-uyuni
name = Ubuntu 20.04 LTS AMD64 Restricted Updates for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-20.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/focal-updates/restricted/binary-amd64/
[ubuntu-2004-amd64-uyuni-client]
label = ubuntu-2004-amd64-uyuni-client
name = Uyuni Client Tools for Ubuntu 20.04 AMD64
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-20.04-pool-amd64-uyuni
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/Ubuntu2004-Uyuni-Client-Tools/xUbuntu_20.04/
[ubuntu-2004-amd64-uyuni-client-devel]
label = ubuntu-2004-amd64-uyuni-client-devel
name = Uyuni Client Tools for Ubuntu 20.04 AMD64 (Development)
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-20.04-pool-amd64-uyuni
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/Ubuntu2004-Uyuni-Client-Tools/xUbuntu_20.04/
[ubuntu-2204-pool-amd64-uyuni]
label = ubuntu-22.04-pool-amd64-uyuni
checksum = sha256
archs = amd64-deb
repo_type = deb
name = Ubuntu 22.04 LTS AMD64 Base for Uyuni
gpgkey_url =
gpgkey_id =
gpgkey_fingerprint =
repo_url = http://localhost/pub/repositories/empty-deb/?uniquekey=2204-uyuni
[ubuntu-2204-amd64-main-uyuni]
label = ubuntu-2204-amd64-main-uyuni
checksum = sha256
archs = amd64-deb
repo_type = deb
name = Ubuntu 22.04 LTS AMD64 Main for Uyuni
base_channels = ubuntu-22.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/jammy/main/binary-amd64/
[ubuntu-2204-amd64-main-updates-uyuni]
label = ubuntu-2204-amd64-main-updates-uyuni
name = Ubuntu 22.04 LTS AMD64 Main Updates for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-22.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/jammy-updates/main/binary-amd64/
[ubuntu-2204-amd64-main-security-uyuni]
label = ubuntu-2204-amd64-main-security-uyuni
name = Ubuntu 22.04 LTS AMD64 Main Security for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-22.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/jammy-security/main/binary-amd64/
[ubuntu-2204-amd64-universe-uyuni]
label = ubuntu-2204-amd64-universe-uyuni
name = Ubuntu 22.04 LTS AMD64 Universe for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-22.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/jammy/universe/binary-amd64/
[ubuntu-2204-amd64-universe-updates-uyuni]
label = ubuntu-2204-amd64-universe-updates-uyuni
name = Ubuntu 22.04 LTS AMD64 Universe Updates for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-22.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/jammy-updates/universe/binary-amd64/
[ubuntu-2204-amd64-universe-security-uyuni]
label = ubuntu-2204-amd64-universe-security-uyuni
name = Ubuntu 22.04 LTS AMD64 Universe Security Updates for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-22.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/jammy-security/universe/binary-amd64/
[ubuntu-2204-amd64-main-backports-uyuni]
label = ubuntu-2204-amd64-main-backports-uyuni
name = Ubuntu 22.04 LTS AMD64 Main Backports for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-22.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/jammy-backports/main/binary-amd64/
[ubuntu-2204-amd64-multiverse-backports-uyuni]
label = ubuntu-2204-amd64-multiverse-backports-uyuni
name = Ubuntu 22.04 LTS AMD64 Multiverse Backports for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-22.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/jammy-backports/multiverse/binary-amd64/
[ubuntu-2204-amd64-restricted-backports-uyuni]
label = ubuntu-2204-amd64-restricted-backports-uyuni
name = Ubuntu 22.04 LTS AMD64 Restricted Backports for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-22.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/jammy-backports/restricted/binary-amd64/
[ubuntu-2204-amd64-universe-backports-uyuni]
label = ubuntu-2204-amd64-universe-backports-uyuni
name = Ubuntu 22.04 LTS AMD64 Universe Backports for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-22.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/jammy-backports/universe/binary-amd64/
[ubuntu-2204-amd64-multiverse-uyuni]
label = ubuntu-2204-amd64-multiverse-uyuni
name = Ubuntu 22.04 LTS AMD64 Multiverse for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-22.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/jammy/multiverse/binary-amd64/
[ubuntu-2204-amd64-restricted-uyuni]
label = ubuntu-2204-amd64-restricted-uyuni
name = Ubuntu 22.04 LTS AMD64 Restricted for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-22.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/jammy/restricted/binary-amd64/
[ubuntu-2204-amd64-multiverse-security-uyuni]
label = ubuntu-2204-amd64-multiverse-security-uyuni
name = Ubuntu 22.04 LTS AMD64 Multiverse Security for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-22.04-pool-amd64-uyuni
repo_url = http://security.ubuntu.com/ubuntu/dists/jammy-security/multiverse/binary-amd64/
[ubuntu-2204-amd64-restricted-security-uyuni]
label = ubuntu-2204-amd64-restricted-security-uyuni
name = Ubuntu 22.04 LTS AMD64 Restricted Security for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-22.04-pool-amd64-uyuni
repo_url = http://security.ubuntu.com/ubuntu/dists/jammy-security/restricted/binary-amd64/
[ubuntu-2204-amd64-multiverse-updates-uyuni]
label = ubuntu-2204-amd64-multiverse-updates-uyuni
name = Ubuntu 22.04 LTS AMD64 Multiverse Updates for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-22.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/jammy-updates/multiverse/binary-amd64/
[ubuntu-2204-amd64-restricted-updates-uyuni]
label = ubuntu-2204-amd64-restricted-updates-uyuni
name = Ubuntu 22.04 LTS AMD64 Restricted Updates for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-22.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/jammy-updates/restricted/binary-amd64/
[ubuntu-2204-amd64-uyuni-client]
label = ubuntu-2204-amd64-uyuni-client
name = Uyuni Client Tools for Ubuntu 22.04 AMD64
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-22.04-pool-amd64-uyuni
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/Ubuntu2204-Uyuni-Client-Tools/xUbuntu_22.04/
[ubuntu-2204-amd64-uyuni-client-devel]
label = ubuntu-2204-amd64-uyuni-client-devel
name = Uyuni Client Tools for Ubuntu 22.04 AMD64 (Development)
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-22.04-pool-amd64-uyuni
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/Ubuntu2204-Uyuni-Client-Tools/xUbuntu_22.04/
[ubuntu-2404-pool-amd64-uyuni]
label = ubuntu-24.04-pool-amd64-uyuni
checksum = sha256
archs = amd64-deb
repo_type = deb
name = Ubuntu 24.04 LTS AMD64 Base for Uyuni
gpgkey_url =
gpgkey_id =
gpgkey_fingerprint =
repo_url = http://localhost/pub/repositories/empty-deb/?uniquekey=2404-uyuni
[ubuntu-2404-amd64-main-uyuni]
label = ubuntu-2404-amd64-main-uyuni
checksum = sha256
archs = amd64-deb
repo_type = deb
name = Ubuntu 24.04 LTS AMD64 Main for Uyuni
base_channels = ubuntu-24.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/noble/main/binary-amd64/
[ubuntu-2404-amd64-main-updates-uyuni]
label = ubuntu-2404-amd64-main-updates-uyuni
name = Ubuntu 24.04 LTS AMD64 Main Updates for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-24.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/noble-updates/main/binary-amd64/
[ubuntu-2404-amd64-main-security-uyuni]
label = ubuntu-2404-amd64-main-security-uyuni
name = Ubuntu 24.04 LTS AMD64 Main Security for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-24.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/noble-security/main/binary-amd64/
[ubuntu-2404-amd64-universe-uyuni]
label = ubuntu-2404-amd64-universe-uyuni
name = Ubuntu 24.04 LTS AMD64 Universe for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-24.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/noble/universe/binary-amd64/
[ubuntu-2404-amd64-universe-updates-uyuni]
label = ubuntu-2404-amd64-universe-updates-uyuni
name = Ubuntu 24.04 LTS AMD64 Universe Updates for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-24.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/noble-updates/universe/binary-amd64/
[ubuntu-2404-amd64-universe-security-uyuni]
label = ubuntu-2404-amd64-universe-security-uyuni
name = Ubuntu 24.04 LTS AMD64 Universe Security Updates for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-24.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/noble-security/universe/binary-amd64/
[ubuntu-2404-amd64-main-backports-uyuni]
label = ubuntu-2404-amd64-main-backports-uyuni
name = Ubuntu 24.04 LTS AMD64 Main Backports for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-24.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/noble-backports/main/binary-amd64/
[ubuntu-2404-amd64-multiverse-backports-uyuni]
label = ubuntu-2404-amd64-multiverse-backports-uyuni
name = Ubuntu 24.04 LTS AMD64 Multiverse Backports for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-24.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/noble-backports/multiverse/binary-amd64/
[ubuntu-2404-amd64-restricted-backports-uyuni]
label = ubuntu-2404-amd64-restricted-backports-uyuni
name = Ubuntu 24.04 LTS AMD64 Restricted Backports for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-24.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/noble-backports/restricted/binary-amd64/
[ubuntu-2404-amd64-universe-backports-uyuni]
label = ubuntu-2404-amd64-universe-backports-uyuni
name = Ubuntu 24.04 LTS AMD64 Universe Backports for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-24.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/noble-backports/universe/binary-amd64/
[ubuntu-2404-amd64-multiverse-uyuni]
label = ubuntu-2404-amd64-multiverse-uyuni
name = Ubuntu 24.04 LTS AMD64 Multiverse for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-24.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/noble/multiverse/binary-amd64/
[ubuntu-2404-amd64-restricted-uyuni]
label = ubuntu-2404-amd64-restricted-uyuni
name = Ubuntu 24.04 LTS AMD64 Restricted for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-24.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/noble/restricted/binary-amd64/
[ubuntu-2404-amd64-multiverse-security-uyuni]
label = ubuntu-2404-amd64-multiverse-security-uyuni
name = Ubuntu 24.04 LTS AMD64 Multiverse Security for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-24.04-pool-amd64-uyuni
repo_url = http://security.ubuntu.com/ubuntu/dists/noble-security/multiverse/binary-amd64/
[ubuntu-2404-amd64-restricted-security-uyuni]
label = ubuntu-2404-amd64-restricted-security-uyuni
name = Ubuntu 24.04 LTS AMD64 Restricted Security for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-24.04-pool-amd64-uyuni
repo_url = http://security.ubuntu.com/ubuntu/dists/noble-security/restricted/binary-amd64/
[ubuntu-2404-amd64-multiverse-updates-uyuni]
label = ubuntu-2404-amd64-multiverse-updates-uyuni
name = Ubuntu 24.04 LTS AMD64 Multiverse Updates for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-24.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/noble-updates/multiverse/binary-amd64/
[ubuntu-2404-amd64-restricted-updates-uyuni]
label = ubuntu-2404-amd64-restricted-updates-uyuni
name = Ubuntu 24.04 LTS AMD64 Restricted Updates for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-24.04-pool-amd64-uyuni
repo_url = http://archive.ubuntu.com/ubuntu/dists/noble-updates/restricted/binary-amd64/
[ubuntu-2404-amd64-uyuni-client]
label = ubuntu-2404-amd64-uyuni-client
name = Uyuni Client Tools for Ubuntu 24.04 AMD64
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-24.04-pool-amd64-uyuni
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/Ubuntu2404-Uyuni-Client-Tools/xUbuntu_24.04/
[ubuntu-2404-amd64-uyuni-client-devel]
label = ubuntu-2404-amd64-uyuni-client-devel
name = Uyuni Client Tools for Ubuntu 24.04 AMD64 (Development)
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = ubuntu-24.04-pool-amd64-uyuni
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/Ubuntu2404-Uyuni-Client-Tools/xUbuntu_24.04/
[debian-11-pool-amd64-uyuni]
label = debian-11-pool-amd64-uyuni
checksum = sha256
archs = amd64-deb
repo_type = deb
name = Debian 11 (bullseye) pool for amd64 for Uyuni
gpgkey_url =
gpgkey_id =
gpgkey_fingerprint =
repo_url = http://deb.debian.org/debian/dists/bullseye/main/binary-amd64/
[debian-11-amd64-main-updates-uyuni]
label = debian-11-amd64-main-updates-uyuni
name = Debian 11 (bullseye) AMD64 Main Updates for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = debian-11-pool-amd64-uyuni
repo_url = http://deb.debian.org/debian/dists/bullseye-updates/main/binary-amd64/
[debian-11-amd64-main-security-uyuni]
label = debian-11-amd64-main-security-uyuni
name = Debian 11 (bullseye) AMD64 Main Security for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = debian-11-pool-amd64-uyuni
repo_url = http://security.debian.org/debian-security/dists/bullseye-security/updates/main/binary-amd64/
[debian-11-amd64-main-backports-uyuni]
label = debian-11-amd64-main-backports-uyuni
name = Debian 11 (bullseye) AMD64 Main Backports for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = debian-11-pool-amd64-uyuni
repo_url = http://deb.debian.org/debian/dists/bullseye-backports/main/binary-amd64/
[debian-11-amd64-uyuni-client-devel]
label = debian-11-amd64-uyuni-client-devel
name = Uyuni Client Tools for Debian 11 Bullseye AMD64 (Development)
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = debian-11-pool-amd64-uyuni
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/Debian11-Uyuni-Client-Tools/Debian_11/
[debian-11-amd64-uyuni-client]
label = debian-11-amd64-uyuni-client
name = Uyuni Client Tools for Debian 11 Bullseye AMD64
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = debian-11-pool-amd64-uyuni
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/Debian11-Uyuni-Client-Tools/Debian_11/
[debian-12-pool-amd64-uyuni]
label = debian-12-pool-amd64-uyuni
checksum = sha256
archs = amd64-deb
repo_type = deb
name = Debian 12 (bookworm) pool for amd64 for Uyuni
gpgkey_url =
gpgkey_id =
gpgkey_fingerprint =
repo_url = http://deb.debian.org/debian/dists/bookworm/main/binary-amd64/
[debian-12-amd64-main-updates-uyuni]
label = debian-12-amd64-main-updates-uyuni
name = Debian 12 (bookworm) AMD64 Main Updates for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = debian-12-pool-amd64-uyuni
repo_url = http://deb.debian.org/debian/dists/bookworm-updates/main/binary-amd64/
[debian-12-amd64-main-security-uyuni]
label = debian-12-amd64-main-security-uyuni
name = Debian 12 (bookworm) AMD64 Main Security for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = debian-12-pool-amd64-uyuni
repo_url = http://deb.debian.org/debian-security/dists/bookworm-security/updates/main/binary-amd64/
[debian-12-amd64-main-backports-uyuni]
label = debian-12-amd64-main-backports-uyuni
name = Debian 12 (bookworm) AMD64 Main Backports for Uyuni
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = debian-12-pool-amd64-uyuni
repo_url = http://deb.debian.org/debian/dists/bookworm-backports/main/binary-amd64/
[debian-12-amd64-uyuni-client-devel]
label = debian-12-amd64-uyuni-client-devel
name = Uyuni Client Tools for Debian 12 Bookworm AMD64 (Development)
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = debian-12-pool-amd64-uyuni
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/Debian12-Uyuni-Client-Tools/Debian_12/
[debian-12-amd64-uyuni-client]
label = debian-12-amd64-uyuni-client
name = Uyuni Client Tools for Debian 12 Bookworm AMD64
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = debian-12-pool-amd64-uyuni
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/Debian12-Uyuni-Client-Tools/Debian_12/
[raspberrypios-12-pool-arm64-uyuni]
label = raspberrypios-12-pool-arm64-uyuni
checksum = sha256
archs = arm64-deb
repo_type = deb
name = Raspberry Pi OS 12 (bookworm) main for ARM64 for Uyuni
gpgkey_url =
gpgkey_id =
gpgkey_fingerprint =
repo_url = http://deb.debian.org/debian/dists/bookworm/main/binary-arm64/
[raspberrypios-12-arm64-contrib-uyuni]
label = raspberrypios-12-arm64-contrib-uyuni
name = Raspberry Pi OS 12 (bookworm) ARM64 Contrib for Uyuni
archs = arm64-deb
repo_type = deb
checksum = sha256
base_channels = raspberrypios-12-pool-arm64-uyuni
repo_url = http://deb.debian.org/debian/dists/bookworm/contrib/binary-arm64/
[raspberrypios-12-arm64-non-free-uyuni]
label = raspberrypios-12-arm64-non-free-uyuni
name = Raspberry Pi OS 12 (bookworm) ARM64 Non-free for Uyuni
archs = arm64-deb
repo_type = deb
checksum = sha256
base_channels = raspberrypios-12-pool-arm64-uyuni
repo_url = http://deb.debian.org/debian/dists/bookworm/non-free/binary-arm64/
[raspberrypios-12-arm64-non-free-firmware-uyuni]
label = raspberrypios-12-arm64-non-free-firmware-uyuni
name = Raspberry Pi OS 12 (bookworm) ARM64 Non-free-firmware for Uyuni
archs = arm64-deb
repo_type = deb
checksum = sha256
base_channels = raspberrypios-12-pool-arm64-uyuni
repo_url = http://deb.debian.org/debian/dists/bookworm/non-free-firmware/binary-arm64/
[raspberrypios-12-arm64-main-updates-uyuni]
label = raspberrypios-12-arm64-main-updates-uyuni
name = Raspberry Pi OS 12 (bookworm) ARM64 Main Updates for Uyuni
archs = arm64-deb
repo_type = deb
checksum = sha256
base_channels = raspberrypios-12-pool-arm64-uyuni
repo_url = http://deb.debian.org/debian/dists/bookworm-updates/main/binary-arm64/
[raspberrypios-12-arm64-contrib-updates-uyuni]
label = raspberrypios-12-arm64-contrib-updates-uyuni
name = Raspberry Pi OS 12 (bookworm) ARM64 Contrib Updates for Uyuni
archs = arm64-deb
repo_type = deb
checksum = sha256
base_channels = raspberrypios-12-pool-arm64-uyuni
repo_url = http://deb.debian.org/debian/dists/bookworm-updates/contrib/binary-arm64/
[raspberrypios-12-arm64-non-free-updates-uyuni]
label = raspberrypios-12-arm64-non-free-updates-uyuni
name = Raspberry Pi OS 12 (bookworm) ARM64 Non-free Updates for Uyuni
archs = arm64-deb
repo_type = deb
checksum = sha256
base_channels = raspberrypios-12-pool-arm64-uyuni
repo_url = http://deb.debian.org/debian/dists/bookworm-updates/non-free/binary-arm64/
[raspberrypios-12-arm64-non-free-firmware-updates-uyuni]
label = raspberrypios-12-arm64-non-free-firmware-updates-uyuni
name = Raspberry Pi OS 12 (bookworm) ARM64 Non-free-firmware Updates for Uyuni
archs = arm64-deb
repo_type = deb
checksum = sha256
base_channels = raspberrypios-12-pool-arm64-uyuni
repo_url = http://deb.debian.org/debian/dists/bookworm-updates/non-free-firmware/binary-arm64/
[raspberrypios-12-arm64-main-security-uyuni]
label = raspberrypios-12-arm64-main-security-uyuni
name = Raspberry Pi OS 12 (bookworm) ARM64 Main Security for Uyuni
archs = arm64-deb
repo_type = deb
checksum = sha256
base_channels = raspberrypios-12-pool-arm64-uyuni
repo_url = http://deb.debian.org/debian-security/dists/bookworm-security/updates/main/binary-arm64/
[raspberrypios-12-arm64-contrib-security-uyuni]
label = raspberrypios-12-arm64-contrib-security-uyuni
name = Raspberry Pi OS 12 (bookworm) ARM64 Contrib Security for Uyuni
archs = arm64-deb
repo_type = deb
checksum = sha256
base_channels = raspberrypios-12-pool-arm64-uyuni
repo_url = http://deb.debian.org/debian-security/dists/bookworm-security/updates/contrib/binary-arm64/
[raspberrypios-12-arm64-non-free-security-uyuni]
label = raspberrypios-12-arm64-non-free-security-uyuni
name = Raspberry Pi OS 12 (bookworm) ARM64 Non-free Security for Uyuni
archs = arm64-deb
repo_type = deb
checksum = sha256
base_channels = raspberrypios-12-pool-arm64-uyuni
repo_url = http://deb.debian.org/debian-security/dists/bookworm-security/updates/non-free/binary-arm64/
[raspberrypios-12-arm64-non-free-firmware-security-uyuni]
label = raspberrypios-12-arm64-non-free-firmware-security-uyuni
name = Raspberry Pi OS 12 (bookworm) ARM64 Non-free-firmware Security for Uyuni
archs = arm64-deb
repo_type = deb
checksum = sha256
base_channels = raspberrypios-12-pool-arm64-uyuni
repo_url = http://deb.debian.org/debian-security/dists/bookworm-security/updates/non-free-firmware/binary-arm64/
[raspberrypios-12-arm64-main-backports-uyuni]
label = raspberrypios-12-arm64-main-backports-uyuni
name = Raspberry Pi OS 12 (bookworm) ARM64 Main Backports for Uyuni
archs = arm64-deb
repo_type = deb
checksum = sha256
base_channels = raspberrypios-12-pool-arm64-uyuni
repo_url = http://deb.debian.org/debian/dists/bookworm-backports/main/binary-arm64/
[raspberrypios-12-arm64-contrib-backports-uyuni]
label = raspberrypios-12-arm64-contrib-backports-uyuni
name = Raspberry Pi OS 12 (bookworm) ARM64 Contrib Backports for Uyuni
archs = arm64-deb
repo_type = deb
checksum = sha256
base_channels = raspberrypios-12-pool-arm64-uyuni
repo_url = http://deb.debian.org/debian/dists/bookworm-backports/contrib/binary-arm64/
[raspberrypios-12-arm64-non-free-backports-uyuni]
label = raspberrypios-12-arm64-non-free-backports-uyuni
name = Raspberry Pi OS 12 (bookworm) ARM64 Non-free Backports for Uyuni
archs = arm64-deb
repo_type = deb
checksum = sha256
base_channels = raspberrypios-12-pool-arm64-uyuni
repo_url = http://deb.debian.org/debian/dists/bookworm-backports/non-free/binary-arm64/
[raspberrypios-12-arm64-non-free-firmware-backports-uyuni]
label = raspberrypios-12-arm64-non-free-firmware-backports-uyuni
name = Raspberry Pi OS 12 (bookworm) ARM64 Non-free-firmware Backports for Uyuni
archs = arm64-deb
repo_type = deb
checksum = sha256
base_channels = raspberrypios-12-pool-arm64-uyuni
repo_url = http://deb.debian.org/debian/dists/bookworm-backports/non-free-firmware/binary-arm64/
[raspberrypios-12-arm64-raspberry-uyuni]
label = raspberrypios-12-arm64-raspberry-uyuni
name = Raspberry Pi OS 12 (bookworm) ARM64 Raspberry for Uyuni
archs = arm64-deb
repo_type = deb
checksum = sha256
base_channels = raspberrypios-12-pool-arm64-uyuni
repo_url = http://archive.raspberrypi.com/debian/dists/bookworm/main/binary-arm64/
[raspberrypios-12-arm64-uyuni-client-devel]
label = raspberrypios-12-arm64-uyuni-client-devel
name = Uyuni Client Tools for Raspberry Pi OS 12 Bookworm ARM64 (Development)
archs = arm64-deb
repo_type = deb
checksum = sha256
base_channels = raspberrypios-12-pool-arm64-uyuni
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/Debian12-Uyuni-Client-Tools/Debian_12/
[raspberrypios-12-arm64-uyuni-client]
label = raspberrypios-12-arm64-uyuni-client
name = Uyuni Client Tools for Raspberry Pi OS 12 Bookworm ARM64
archs = arm64-deb
repo_type = deb
checksum = sha256
base_channels = raspberrypios-12-pool-arm64-uyuni
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/Debian12-Uyuni-Client-Tools/Debian_12/
[raspberrypios-12-pool-armhf-uyuni]
label = raspberrypios-12-pool-armhf-uyuni
checksum = sha256
archs = armhf-deb
repo_type = deb
name = Raspberry Pi OS 12 (bookworm) pool for ARMHF for Uyuni
gpgkey_url =
gpgkey_id =
gpgkey_fingerprint =
repo_url = http://raspbian.raspberrypi.com/raspbian/dists/bookworm/main/binary-armhf/
[raspberrypios-12-armhf-contrib-uyuni]
label = raspberrypios-12-armhf-contrib-uyuni
name = Raspberry Pi OS 12 (bookworm) ARMHF Contrib for Uyuni
archs = armhf-deb
repo_type = deb
checksum = sha256
base_channels = raspberrypios-12-pool-armhf-uyuni
repo_url = http://raspbian.raspberrypi.com/raspbian/dists/bookworm/contrib/binary-armhf/
[raspberrypios-12-armhf-non-free-uyuni]
label = raspberrypios-12-armhf-non-free-uyuni
name = Raspberry Pi OS 12 (bookworm) ARMHF Non-free for Uyuni
archs = armhf-deb
repo_type = deb
checksum = sha256
base_channels = raspberrypios-12-pool-armhf-uyuni
repo_url = http://raspbian.raspberrypi.com/raspbian/dists/bookworm/non-free/binary-armhf/
[raspberrypios-12-armhf-rpi-uyuni]
label = raspberrypios-12-armhf-rpi-uyuni
name = Raspberry Pi OS 12 (bookworm) ARMHF RPI for Uyuni
archs = armhf-deb
repo_type = deb
checksum = sha256
base_channels = raspberrypios-12-pool-armhf-uyuni
repo_url = http://raspbian.raspberrypi.com/raspbian/dists/bookworm/rpi/binary-armhf/
[raspberrypios-12-armhf-firmware-uyuni]
label = raspberrypios-12-armhf-firmware-uyuni
name = Raspberry Pi OS 12 (bookworm) ARMHF Firmware for Uyuni
archs = armhf-deb
repo_type = deb
checksum = sha256
base_channels = raspberrypios-12-pool-armhf-uyuni
repo_url = http://raspbian.raspberrypi.com/raspbian/dists/bookworm/firmware/binary-armhf/
[raspberrypios-12-armhf-raspberry-uyuni]
label = raspberrypios-12-armhf-raspberry-uyuni
name = Raspberry Pi OS 12 (bookworm) ARMHF Raspberry for Uyuni
archs = armhf-deb
repo_type = deb
checksum = sha256
base_channels = raspberrypios-12-pool-armhf-uyuni
repo_url = http://archive.raspberrypi.com/debian/dists/bookworm/main/binary-armhf/
[raspberrypios-12-armhf-uyuni-client-devel]
label = raspberrypios-12-armhf-uyuni-client-devel
name = Uyuni Client Tools for Raspberry Pi OS 12 Bookworm ARMHF (Development)
archs = armhf-deb
repo_type = deb
checksum = sha256
base_channels = raspberrypios-12-pool-armhf-uyuni
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/Debian12-Uyuni-Client-Tools/Debian_12/
[raspberrypios-12-armhf-uyuni-client]
label = raspberrypios-12-armhf-uyuni-client
name = Uyuni Client Tools for Raspberry Pi OS 12 Bookworm ARMHF
archs = armhf-deb
repo_type = deb
checksum = sha256
base_channels = raspberrypios-12-pool-armhf-uyuni
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/Debian12-Uyuni-Client-Tools/Debian_12/
[astralinux-orel-pool-amd64]
label = astralinux-orel-pool-amd64
checksum = sha256
archs = amd64-deb
repo_type = deb
name = Astra Linux Orel pool for amd64
gpgkey_url =
gpgkey_id =
gpgkey_fingerprint =
repo_url = https://download.astralinux.ru/astra/stable/orel/repository/dists/orel/main/binary-amd64/
[astralinux-orel-amd64-contrib]
label = astralinux-orel-amd64-contrib
name = Astra Linux Orel AMD64 Contrib
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = astralinux-orel-pool-amd64
repo_url = https://download.astralinux.ru/astra/stable/orel/repository/dists/orel/contrib/binary-amd64/
[astralinux-orel-amd64-non-free]
label = astralinux-orel-amd64-non-free
name = Astra Linux Orel AMD64 non-free
archs = amd64-deb
repo_type = deb
checksum = sha256
base_channels = astralinux-orel-pool-amd64
repo_url = https://download.astralinux.ru/astra/stable/orel/repository/dists/orel/non-free/binary-amd64/
[amazonlinux2-core]
archs = x86_64, aarch64
name = Amazon Linux 2 Core %(arch)s
label = amazonlinux2-core-%(arch)s
checksum = sha256
gpgkey_url = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-amazon-linux-2
gpgkey_id = C87F5B1A
gpgkey_fingerprint = 99E6 17FE 5DB5 27C0 D8BD 5F8E 11CF 1F95 C87F 5B1A
repo_url = http://amazonlinux.default.amazonaws.com/2/core/latest/%(arch)s/mirror.list
[amazonlinux2-extra-docker]
archs = x86_64, aarch64
name = Amazon Extras 2 repo for Docker %(arch)s
label = amazonlinux2-extras-docker-%(arch)s
base_channels = amazonlinux2-core-%(arch)s
checksum = sha256
gpgkey_id = C87F5B1A
gpgkey_fingerprint = 99E6 17FE 5DB5 27C0 D8BD 5F8E 11CF 1F95 C87F 5B1A
repo_url = http://amazonlinux.default.amazonaws.com/2/extras/docker/latest/%(arch)s/mirror.list
[amazonlinux2-uyuni-client]
name = Uyuni Client Tools for %(base_channel_name)s
archs = x86_64, aarch64
base_channels = amazonlinux2-core-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/CentOS7-Uyuni-Client-Tools/CentOS_7/
[amazonlinux2-uyuni-client-devel]
name = Uyuni Client Tools for %(base_channel_name)s (Development)
archs = x86_64, aarch64
base_channels = amazonlinux2-core-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/CentOS7-Uyuni-Client-Tools/CentOS_7/
[amazonlinux2023]
archs = x86_64, aarch64
name = Amazon Linux 2023 %(arch)s
label = amazonlinux2023-%(arch)s
checksum = sha256
gpgkey_url = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-amazon-linux-2023
gpgkey_id = D832C631
gpgkey_fingerprint = B21C 50FA 44A9 9720 EAA7 2F7F E951 904A D832 C631
repo_url = https://cdn.amazonlinux.com/al2023/core/mirrors/latest/%(arch)s/mirror.list
[amazonlinux2023-kernel-livepatch]
archs = x86_64, aarch64
label = %(base_channel)s-kernel-livepatch
base_channels = amazonlinux2023-%(arch)s
name = Amazon Linux 2023 Kernel Livepatch %(arch)s
checksum = sha256
gpgkey_url = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-amazon-linux-2023
gpgkey_id = D832C631
gpgkey_fingerprint = B21C 50FA 44A9 9720 EAA7 2F7F E951 904A D832 C631
repo_url = https://cdn.amazonlinux.com/al2023/kernel-livepatch/mirrors/al2023/%(arch)s/mirror.list
[amazonlinux2023-uyuni-client]
name = Uyuni Client Tools for %(base_channel_name)s
archs = x86_64, aarch64
base_channels = amazonlinux2023-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/EL9-Uyuni-Client-Tools/EL_9/
[amazonlinux2023-uyuni-client-devel]
name = Uyuni Client Tools for %(base_channel_name)s (Development)
archs = x86_64, aarch64
base_channels = amazonlinux2023-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/EL9-Uyuni-Client-Tools/EL_9/
[alibaba-2]
archs = x86_64
name = Alibaba Cloud Linux (Aliyun Linux) release 2 (%(arch)s)
checksum = sha256
gpgkey_url = https://mirrors.aliyun.com/alinux/RPM-GPG-KEY-ALIYUN
gpgkey_id = 873141A8
gpgkey_fingerprint = EFD7 52E7 E232 ED87 12E7 635C EB80 1C41 8731 41A8
repo_url = https://mirrors.aliyun.com/alinux/2/os/%(arch)s/
dist_map_release = 2
[alibaba-2-exp]
label = %(base_channel)s-exp
archs = x86_64
name = Development Packages for Alibaba Cloud Linux (Aliyun Linux) release 2 (%(arch)s)
base_channels = alibaba-2-%(arch)s
repo_url = https://mirrors.aliyun.com/alinux/2/exp/%(arch)s/
[alibaba-2-extras]
label = %(base_channel)s-extras
archs = x86_64
name = Extras for Alibaba Cloud Linux (Aliyun Linux) release 2 (%(arch)s)
base_channels = alibaba-2-%(arch)s
repo_url = https://mirrors.aliyun.com/alinux/2/extras/%(arch)s/
[alibaba-2-kernels]
label = %(base_channel)s-kernels
archs = x86_64
name = Additional kernels for Alibaba Cloud Linux (Aliyun Linux) release 2 (%(arch)s)
base_channels = alibaba-2-%(arch)s
repo_url = https://mirrors.aliyun.com/alinux/2/kernels/%(arch)s/
[alibaba-2-plus]
label = %(base_channel)s-plus
archs = x86_64
name = Alibaba Cloud Linux (Aliyun Linux) release 2 Plus (%(arch)s)
base_channels = alibaba-2-%(arch)s
repo_url = https://mirrors.aliyun.com/alinux/2/plus/%(arch)s/
[alibaba-2-updates]
label = %(base_channel)s-updates
archs = x86_64
name = Alibaba Cloud Linux (Aliyun Linux) release 2 Updates (%(arch)s)
base_channels = alibaba-2-%(arch)s
repo_url = https://mirrors.aliyun.com/alinux/2/updates/%(arch)s/
[alibaba-2-aarch64]
label = alibaba-2-%(arch)s
archs = aarch64
name = Alibaba Cloud Linux (Aliyun Linux) release 2 (%(arch)s)
checksum = sha256
gpgkey_url = https://mirrors.aliyun.com/alinux/RPM-GPG-KEY-ALIYUN
gpgkey_id = 873141A8
gpgkey_fingerprint = EFD7 52E7 E232 ED87 12E7 635C EB80 1C41 8731 41A8
repo_url = https://mirrors.aliyun.com/alinux/2/os-arm/%(arch)s/
dist_map_release = 2
[alibaba-2-exp-aarch64]
label = %(base_channel)s-exp-aarch64
archs = aarch64
name = Development Packages for Alibaba Cloud Linux (Aliyun Linux) release 2 (%(arch)s)
base_channels = alibaba-2-%(arch)s
repo_url = https://mirrors.aliyun.com/alinux/2/exp/%(arch)s/
[alibaba-2-extras-aarch64]
label = %(base_channel)s-extras-aarch64
archs = aarch64
name = Extras for Alibaba Cloud Linux (Aliyun Linux) release 2 (%(arch)s)
base_channels = alibaba-2-%(arch)s
repo_url = https://mirrors.aliyun.com/alinux/2/extras/%(arch)s/
[alibaba-2-kernels-aarch64]
label = %(base_channel)s-kernels-aarch64
archs = aarch64
name = Additional kernels for Alibaba Cloud Linux (Aliyun Linux) release 2 (%(arch)s)
base_channels = alibaba-2-%(arch)s
repo_url = https://mirrors.aliyun.com/alinux/2/kernels/%(arch)s/
[alibaba-2-plus-aarch64]
label = %(base_channel)s-plus-aarch64
archs = aarch64
name = Alibaba Cloud Linux (Aliyun Linux) release 2 Plus (%(arch)s)
base_channels = alibaba-2-%(arch)s
repo_url = https://mirrors.aliyun.com/alinux/2/plus/%(arch)s/
[alibaba-2-updates-aarch64]
label = %(base_channel)s-updates-aarch64
archs = aarch64
name = Alibaba Cloud Linux (Aliyun Linux) release 2 Updates (%(arch)s)
base_channels = alibaba-2-%(arch)s
repo_url = https://mirrors.aliyun.com/alinux/2/updates/%(arch)s/
[alibaba-2-uyuni-client]
name = Uyuni Client Tools for %(base_channel_name)s
archs = %(_x86_archs)s, aarch64
base_channels = alibaba-2-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/CentOS7-Uyuni-Client-Tools/CentOS_7/
[alibaba-2-uyuni-client-devel]
name = Uyuni Client Tools for %(base_channel_name)s (Development)
archs = %(_x86_archs)s, aarch64
base_channels = alibaba-2-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/CentOS7-Uyuni-Client-Tools/CentOS_7/
[almalinux8]
archs = x86_64, aarch64
checksum = sha256
name = AlmaLinux 8 (%(arch)s)
gpgkey_url = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-AlmaLinux
gpgkey_id = 3ABB34F8
gpgkey_fingerprint = 5E9B 8F56 17B5 066C E920 57C3 488F CF7C 3ABB 34F8
repo_url = https://mirrors.almalinux.org/mirrorlist/8/baseos
dist_map_release = 8
[almalinux8-appstream]
label = %(base_channel)s-appstream
archs = x86_64, aarch64
checksum = sha256
name = AlmaLinux 8 AppStream (%(arch)s)
base_channels = almalinux8-%(arch)s
repo_url = https://mirrors.almalinux.org/mirrorlist/8/appstream
[almalinux8-extras]
label = %(base_channel)s-extras
archs = x86_64, aarch64
checksum = sha256
name = AlmaLinux 8 Extras (%(arch)s)
base_channels = almalinux8-%(arch)s
repo_url = https://mirrors.almalinux.org/mirrorlist/8/extras
[almalinux8-powertools]
label = %(base_channel)s-powertools
archs = x86_64, aarch64
checksum = sha256
name = AlmaLinux 8 PowerTools (%(arch)s)
base_channels = almalinux8-%(arch)s
repo_url = https://mirrors.almalinux.org/mirrorlist/8/powertools
[almalinux8-ha]
label = %(base_channel)s-ha
archs = x86_64, aarch64
checksum = sha256
name = AlmaLinux 8 High Availability (%(arch)s)
base_channels = almalinux8-%(arch)s
repo_url = https://mirrors.almalinux.org/mirrorlist/8/ha
[almalinux8-uyuni-client]
name = Uyuni Client Tools for %(base_channel_name)s
archs = %(_x86_archs)s, aarch64
checksum = sha256
base_channels = almalinux8-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/EL8-Uyuni-Client-Tools/EL_8/
[almalinux8-uyuni-client-devel]
name = Uyuni Client Tools for %(base_channel_name)s (Development)
archs = %(_x86_archs)s, aarch64
checksum = sha256
base_channels = almalinux8-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/EL8-Uyuni-Client-Tools/EL_8/
[almalinux8-epel8]
label = epel8-%(base_channel)s
name = EPEL 8 for %(base_channel_name)s
archs = x86_64, ppc64le, aarch64
checksum = sha256
base_channels = almalinux8-%(arch)s
gpgkey_url = http://download.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-8
gpgkey_id = 2F86D6A1
gpgkey_fingerprint = 94E2 79EB 8D8F 25B2 1810 ADF1 21EA 45AB 2F86 D6A1
repo_url = http://mirrors.fedoraproject.org/mirrorlist?repo=epel-8&arch=%(arch)s
[almalinux9]
archs = x86_64, aarch64, ppc64le, s390x
checksum = sha256
name = AlmaLinux 9 (%(arch)s)
gpgkey_url = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-AlmaLinux-9
gpgkey_id = B86B3716
gpgkey_fingerprint = BF18 AC28 7617 8908 D6E7 1267 D36C B86C B86B 3716
repo_url = https://mirrors.almalinux.org/mirrorlist/9/baseos
dist_map_release = 9
[almalinux9-appstream]
label = %(base_channel)s-appstream
archs = x86_64, aarch64, ppc64le, s390x
checksum = sha256
name = AlmaLinux 9 AppStream (%(arch)s)
base_channels = almalinux9-%(arch)s
repo_url = https://mirrors.almalinux.org/mirrorlist/9/appstream
[almalinux9-extras]
label = %(base_channel)s-extras
archs = x86_64, aarch64, ppc64le, s390x
checksum = sha256
name = AlmaLinux 9 Extras (%(arch)s)
base_channels = almalinux9-%(arch)s
repo_url = https://mirrors.almalinux.org/mirrorlist/9/extras
[almalinux9-crb]
label = %(base_channel)s-crb
archs = x86_64, aarch64, ppc64le, s390x
checksum = sha256
name = AlmaLinux 9 CRB (%(arch)s)
base_channels = almalinux9-%(arch)s
repo_url = https://mirrors.almalinux.org/mirrorlist/9/crb
[almalinux9-highavailability]
label = %(base_channel)s-highavailability
archs = x86_64, aarch64, ppc64le, s390x
checksum = sha256
name = AlmaLinux 9 High Availability (%(arch)s)
base_channels = almalinux9-%(arch)s
repo_url = https://mirrors.almalinux.org/mirrorlist/9/highavailability
[almalinux9-nfv]
label = %(base_channel)s-nfv
archs = x86_64
checksum = sha256
name = AlmaLinux 9 NFV (%(arch)s)
base_channels = almalinux9-%(arch)s
repo_url = https://mirrors.almalinux.org/mirrorlist/9/nfv
[almalinux9-plus]
label = %(base_channel)s-plus
archs = x86_64, aarch64, ppc64le, s390x
checksum = sha256
name = AlmaLinux 9 Plus (%(arch)s)
base_channels = almalinux9-%(arch)s
repo_url = https://mirrors.almalinux.org/mirrorlist/9/plus
[almalinux9-resilientstorage]
label = %(base_channel)s-resilientstorage
archs = x86_64, aarch64, ppc64le, s390x
checksum = sha256
name = AlmaLinux 9 ResilientStorage (%(arch)s)
base_channels = almalinux9-%(arch)s
repo_url = https://mirrors.almalinux.org/mirrorlist/9/resilientstorage
[almalinux9-rt]
label = %(base_channel)s-rt
archs = x86_64
checksum = sha256
name = AlmaLinux 9 RT (%(arch)s)
base_channels = almalinux9-%(arch)s
repo_url = https://mirrors.almalinux.org/mirrorlist/9/rt
[almalinux9-saphana]
label = %(base_channel)s-saphana
archs = x86_64, aarch64, ppc64le, s390x
checksum = sha256
name = AlmaLinux 9 SAPHANA (%(arch)s)
base_channels = almalinux9-%(arch)s
repo_url = https://mirrors.almalinux.org/mirrorlist/9/saphana
[almalinux9-sap]
label = %(base_channel)s-sap
archs = x86_64, aarch64, ppc64le, s390x
checksum = sha256
name = AlmaLinux 9 SAP (%(arch)s)
base_channels = almalinux9-%(arch)s
repo_url = https://mirrors.almalinux.org/mirrorlist/9/sap
[almalinux9-uyuni-client]
name = Uyuni Client Tools for %(base_channel_name)s
archs = %(_x86_archs)s, aarch64, ppc64le, s390x
checksum = sha256
base_channels = almalinux9-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/EL9-Uyuni-Client-Tools/EL_9/
[almalinux9-uyuni-client-devel]
name = Uyuni Client Tools for %(base_channel_name)s (Development)
archs = %(_x86_archs)s, aarch64, ppc64le, s390x
checksum = sha256
base_channels = almalinux9-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/EL9-Uyuni-Client-Tools/EL_9/
[almalinux9-epel9]
label = epel9-%(base_channel)s
name = EPEL 9 for %(base_channel_name)s
archs = x86_64, aarch64, ppc64le, s390x
checksum = sha256
base_channels = almalinux9-%(arch)s
gpgkey_url = http://download.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-9
gpgkey_id = 3228467C
gpgkey_fingerprint = FF8A D134 4597 106E CE81 3B91 8A38 72BF 3228 467C
repo_url = http://mirrors.fedoraproject.org/mirrorlist?repo=epel-9&arch=%(arch)s
[rockylinux8]
archs = x86_64, aarch64
checksum = sha256
name = Rocky Linux 8 (%(arch)s)
gpgkey_url = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
gpgkey_id = 6D745A60
gpgkey_fingerprint = 7051 C470 A929 F454 CEBE 37B7 15AF 5DAC 6D74 5A60
repo_url = https://mirrors.rockylinux.org/mirrorlist?repo=BaseOS-8&arch=%(arch)s
dist_map_release = 8
[rockylinux8-appstream]
label = %(base_channel)s-appstream
archs = x86_64, aarch64
checksum = sha256
name = Rocky Linux 8 - AppStream (%(arch)s)
base_channels = rockylinux8-%(arch)s
repo_url = https://mirrors.rockylinux.org/mirrorlist?repo=AppStream-8&arch=%(arch)s
[rockylinux8-extras]
label = %(base_channel)s-extras
archs = x86_64, aarch64
checksum = sha256
name = Rocky Linux 8 - Extras (%(arch)s)
base_channels = rockylinux8-%(arch)s
repo_url = https://mirrors.rockylinux.org/mirrorlist?repo=extras-8&arch=%(arch)s
[rockylinux8-powertools]
label = %(base_channel)s-powertools
archs = x86_64, aarch64
checksum = sha256
name = Rocky Linux 8 - PowerTools (%(arch)s)
base_channels = rockylinux8-%(arch)s
repo_url = https://mirrors.rockylinux.org/mirrorlist?repo=PowerTools-8&arch=%(arch)s
[rockylinux8-ha]
label = %(base_channel)s-ha
archs = x86_64, aarch64
checksum = sha256
name = Rocky Linux 8 - High Availability (%(arch)s)
base_channels = rockylinux8-%(arch)s
repo_url = https://mirrors.rockylinux.org/mirrorlist?repo=HighAvailability-8&arch=%(arch)s
[rockylinux8-uyuni-client]
name = Uyuni Client Tools for %(base_channel_name)s
archs = %(_x86_archs)s, aarch64
checksum = sha256
base_channels = rockylinux8-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/EL8-Uyuni-Client-Tools/EL_8/
[rockylinux8-uyuni-client-devel]
name = Uyuni Client Tools for %(base_channel_name)s (Development)
archs = %(_x86_archs)s, aarch64
checksum = sha256
base_channels = rockylinux8-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/EL8-Uyuni-Client-Tools/EL_8/
[rockylinux8-epel8]
label = epel8-%(base_channel)s
name = EPEL 8 for %(base_channel_name)s
archs = x86_64, ppc64le, aarch64
checksum = sha256
base_channels = rockylinux8-%(arch)s
gpgkey_url = http://download.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-8
gpgkey_id = 2F86D6A1
gpgkey_fingerprint = 94E2 79EB 8D8F 25B2 1810 ADF1 21EA 45AB 2F86 D6A1
repo_url = http://mirrors.fedoraproject.org/mirrorlist?repo=epel-8&arch=%(arch)s
[rockylinux9]
archs = x86_64, aarch64, ppc64le, s390x
checksum = sha256
name = Rocky Linux 9 (%(arch)s)
gpgkey_url = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-9
gpgkey_id = 350D275D
gpgkey_fingerprint = 21CB 256A E16F C54C 6E65 2949 702D 426D 350D 275D
repo_url = https://mirrors.rockylinux.org/mirrorlist?repo=BaseOS-9&arch=%(arch)s
dist_map_release = 9
[rockylinux9-appstream]
label = %(base_channel)s-appstream
archs = x86_64, aarch64, ppc64le, s390x
checksum = sha256
name = Rocky Linux 9 AppStream (%(arch)s)
base_channels = rockylinux9-%(arch)s
repo_url = https://mirrors.rockylinux.org/mirrorlist?repo=AppStream-9&arch=%(arch)s
[rockylinux9-extras]
label = %(base_channel)s-extras
archs = x86_64, aarch64, ppc64le, s390x
checksum = sha256
name = Rocky Linux 9 Extras (%(arch)s)
base_channels = rockylinux9-%(arch)s
repo_url = https://mirrors.rockylinux.org/mirrorlist?repo=extras-9&arch=%(arch)s
[rockylinux9-crb]
label = %(base_channel)s-crb
archs = x86_64, aarch64, ppc64le, s390x
checksum = sha256
name = Rocky Linux 9 CRB (%(arch)s)
base_channels = rockylinux9-%(arch)s
repo_url = https://mirrors.rockylinux.org/mirrorlist?repo=CRB-9&arch=%(arch)s
[rockylinux9-highavailability]
label = %(base_channel)s-highavailability
archs = x86_64, aarch64, ppc64le, s390x
checksum = sha256
name = Rocky Linux 9 High Availability (%(arch)s)
base_channels = rockylinux9-%(arch)s
repo_url = https://mirrors.rockylinux.org/mirrorlist?repo=HighAvailability-9&arch=%(arch)s
[rockylinux9-nfv]
label = %(base_channel)s-nfv
archs = x86_64, aarch64, ppc64le, s390x
checksum = sha256
name = Rocky Linux 9 NFV (%(arch)s)
base_channels = rockylinux9-%(arch)s
repo_url = https://mirrors.rockylinux.org/mirrorlist?repo=NFV-9&arch=%(arch)s
[rockylinux9-plus]
label = %(base_channel)s-plus
archs = x86_64, aarch64, ppc64le, s390x
checksum = sha256
name = Rocky Linux 9 Plus (%(arch)s)
base_channels = rockylinux9-%(arch)s
repo_url = https://mirrors.rockylinux.org/mirrorlist?repo=plus-9&arch=%(arch)s
[rockylinux9-resilientstorage]
label = %(base_channel)s-resilientstorage
archs = x86_64, aarch64, ppc64le, s390x
checksum = sha256
name = Rocky Linux 9 ResilientStorage (%(arch)s)
base_channels = rockylinux9-%(arch)s
repo_url = https://mirrors.rockylinux.org/mirrorlist?repo=ResilientStorage-9&arch=%(arch)s
[rockylinux9-rt]
label = %(base_channel)s-rt
archs = x86_64, aarch64, ppc64le, s390x
checksum = sha256
name = Rocky Linux 9 RT (%(arch)s)
base_channels = rockylinux9-%(arch)s
repo_url = https://mirrors.rockylinux.org/mirrorlist?repo=RT-9&arch=%(arch)s
[rockylinux9-saphana]
label = %(base_channel)s-saphana
archs = x86_64, aarch64, ppc64le, s390x
checksum = sha256
name = Rocky Linux 9 SAPHANA (%(arch)s)
base_channels = rockylinux9-%(arch)s
repo_url = https://mirrors.rockylinux.org/mirrorlist?repo=SAPHANA-9&arch=%(arch)s
[rockylinux9-sap]
label = %(base_channel)s-sap
archs = x86_64, aarch64, ppc64le, s390x
checksum = sha256
name = Rocky Linux 9 SAP (%(arch)s)
base_channels = rockylinux9-%(arch)s
repo_url = https://mirrors.rockylinux.org/mirrorlist?repo=SAP-9&arch=%(arch)s
[rockylinux9-altarch-common]
label = %(base_channel)s-altarch-common
archs = aarch64
checksum = sha256
name = Rocky Linux 9 SIG AltArch Common (%(arch)s)
gpgkey_url = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-SIG-AltArch
gpgkey_id = 121A7A26
gpgkey_fingerprint = F00C 8F0C 8082 E9F4 8675 C30A 51A8 2D3E 121A 7A26
base_channels = rockylinux9-%(arch)s
repo_url = https://mirrors.rockylinux.org/mirrorlist?repo=rocky-sig-altarch-common-9&arch=%(arch)s
[rockylinux9-altarch-rockyrpi]
label = %(base_channel)s-altarch-rockyrpi
archs = aarch64
checksum = sha256
name = Rocky Linux 9 Rasperry Pi (%(arch)s)
gpgkey_url = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-SIG-AltArch
gpgkey_id = 121A7A26
gpgkey_fingerprint = F00C 8F0C 8082 E9F4 8675 C30A 51A8 2D3E 121A 7A26
base_channels = rockylinux9-%(arch)s
repo_url = https://mirrors.rockylinux.org/mirrorlist?repo=rocky-sig-altarch-rockyrpi-9&arch=%(arch)s
[rockylinux9-uyuni-client]
name = Uyuni Client Tools for %(base_channel_name)s
archs = %(_x86_archs)s, aarch64, ppc64le, s390x
checksum = sha256
base_channels = rockylinux9-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/EL9-Uyuni-Client-Tools/EL_9/
[rockylinux9-uyuni-client-devel]
name = Uyuni Client Tools for %(base_channel_name)s (Development)
archs = %(_x86_archs)s, aarch64, ppc64le, s390x
checksum = sha256
base_channels = rockylinux9-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/EL9-Uyuni-Client-Tools/EL_9/
[rockylinux9-epel9]
label = epel9-%(base_channel)s
name = EPEL 9 for %(base_channel_name)s
archs = x86_64, aarch64, ppc64le, s390x
checksum = sha256
base_channels = rockylinux9-%(arch)s
gpgkey_url = https://download.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-9
gpgkey_id = 3228467C
gpgkey_fingerprint = FF8A D134 4597 106E CE81 3B91 8A38 72BF 3228 467C
repo_url = https://mirrors.fedoraproject.org/mirrorlist?repo=epel-9&arch=%(arch)s
[sll8-uyuni-client]
name = Uyuni Client Tools for %(base_channel_name)s
archs = %(_x86_archs)s
base_channels = rhel8-pool-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/EL8-Uyuni-Client-Tools/EL_8/
[sll8-uyuni-client-devel]
name = Uyuni Client Tools for %(base_channel_name)s (Development)
archs = %(_x86_archs)s
base_channels = rhel8-pool-%(arch)s
gpgkey_url = %(_uyuni_gpgkey_url)s
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/EL8-Uyuni-Client-Tools/EL_8/
[openeuler2203]
archs = x86_64, aarch64
name = openEuler 22.03 %(arch)s
gpgkey_url = https://repo.openeuler.org/openEuler-22.03-LTS/OS/x86_64/RPM-GPG-KEY-openEuler
gpgkey_id = AC26B6D3
gpgkey_fingerprint = 12EA 74AC 9DF4 8D46 C69C A0BE D557 065E B25E 7F66
repo_url = https://repo.openeuler.org/openEuler-22.03-LTS/OS/%(arch)s
[openeuler2203-update]
archs = x86_64, aarch64
name = openEuler 22.03 Update %(arch)s
label = openeuler2203-update-%(arch)s
base_channels = openeuler2203-%(arch)s
gpgkey_url = https://repo.openeuler.org/openEuler-22.03-LTS/OS/x86_64/RPM-GPG-KEY-openEuler
gpgkey_id = AC26B6D3
gpgkey_fingerprint = 12EA 74AC 9DF4 8D46 C69C A0BE D557 065E B25E 7F66
repo_url = https://repo.openeuler.org/openEuler-22.03-LTS/update/%(arch)s
[openeuler2203-everything]
archs = x86_64, aarch64
name = openEuler 22.03 Everything %(arch)s
label = openeuler2203-everything-%(arch)s
base_channels = openeuler2203-%(arch)s
gpgkey_url = https://repo.openeuler.org/openEuler-22.03-LTS/everything/x86_64/RPM-GPG-KEY-openEuler
gpgkey_id = AC26B6D3
gpgkey_fingerprint = 12EA 74AC 9DF4 8D46 C69C A0BE D557 065E B25E 7F66
repo_url = https://repo.openeuler.org/openEuler-22.03-LTS/everything/%(arch)s
[openeuler2203-epol]
archs = x86_64, aarch64
name = openEuler 22.03 EPOL %(arch)s
label = openeuler2203-epol-%(arch)s
base_channels = openeuler2203-%(arch)s
gpgkey_url = https://repo.openeuler.org/openEuler-22.03-LTS/OS/x86_64/RPM-GPG-KEY-openEuler
gpgkey_id = AC26B6D3
gpgkey_fingerprint = 12EA 74AC 9DF4 8D46 C69C A0BE D557 065E B25E 7F66
repo_url = https://repo.openeuler.org/openEuler-22.03-LTS/EPOL/main/%(arch)s
[openeuler2203-uyuni-client]
archs = x86_64, aarch64
name = Uyuni client tools for %(base_channel_name)s
base_channels = openeuler2203-%(arch)s
gpgkey_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/EL8-Uyuni-Client-Tools/EL_8/repodata/repomd.xml.key
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/EL8-Uyuni-Client-Tools/EL_8/
[openeuler2203-uyuni-client-devel]
archs = x86_64, aarch64
name = Uyuni client tools for %(base_channel_name)s (Development)
base_channels = openeuler2203-%(arch)s
gpgkey_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/EL8-Uyuni-Client-Tools/EL_8/repodata/repomd.xml.key
gpgkey_id = %(_uyuni_gpgkey_id)s
gpgkey_fingerprint = %(_uyuni_gpgkey_fingerprint)s
repo_url = https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Master:/EL8-Uyuni-Client-Tools/EL_8/
0707010000000E000081FD00000000000000000000000168DD3ED300005A47000000000000000000000000000000000000003300000000spacewalk-utils/spacewalk-manage-channel-lifecycle#!/usr/bin/python3
# pylint: disable=invalid-name,consider-using-f-string
#
# Licensed under the GNU General Public License Version 3
#
# 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 3 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.
#
# Copyright 2012 Aron Parsons <aronparsons@gmail.com>
#
# coding: utf-8
"""
Manage channels lifecycle.
"""
import os
import getpass
import logging
import re
import sys
import time
import typing
from optparse import Option, OptionParser # pylint: disable=W0402
import xmlrpc.client as xmlrpclib
import configparser as ConfigParser
class Config:
"""
Configuration parser with defaults handling.
"""
SECTION_GENERAL = "general"
OPT_PHASES = "phases"
OPT_EXCLUDE_CHNL = "exclude channels"
def __init__(self, path):
self.path = path
self.default_section = Config.SECTION_GENERAL
self._cfg = ConfigParser.RawConfigParser()
def get(self, section: str, option: str, default: typing.Any = None) -> typing.Any:
"""
Get data from the configuration.
:param section:
:param option:
:param default:
:return:
"""
if not self._cfg.has_section(section):
if not self._cfg.has_section(self.default_section):
return default
if not self._cfg.has_option(self.default_section, option):
return default
return self._cfg.get(self.default_section, option)
if not self._cfg.has_option(section, option):
return default
return self._cfg.get(section, option)
def set(self, section: str, option: str, value: typing.Any) -> None:
"""
Set section to the configuration structure.
:param section: name of the section
:param option: option name
:param value: value
:return: None
"""
if not self._cfg.has_section(section):
self._cfg.add_section(section)
self._cfg.set(section, option, value)
def write(self) -> None:
"""
Write configuration to the INI file.
:return: None
"""
with open(self.path, "w", encoding="UTF-8") as handle:
self._cfg.write(handle)
def read(self) -> None:
"""
Read configuration from the INI file.
:return: None
"""
self._cfg.read(self.path)
# pylint: disable-next=deprecated-attribute
def sections(self) -> typing.List[typing.AnyStr]:
"""
Returns sections of the configuration INI.
:return: list of the sections
"""
return [
section
for section in self._cfg.sections()
if section != self.default_section
]
CONF_DIR = os.path.expanduser("~/.spacewalk-manage-channel-lifecycle")
USER_CONF_FILE = os.path.join(CONF_DIR, "settings.conf")
SESSION_CACHE = os.path.join(CONF_DIR, "session")
def setup_config(cfg):
"""
Setup configuration.
"""
if os.path.isfile(CONF_DIR):
os.unlink(CONF_DIR)
if not os.path.exists(CONF_DIR):
logging.debug("Creating directory: %s", CONF_DIR)
try:
os.mkdir(CONF_DIR, 0o700)
except IOError:
logging.error("Unable to create %s", CONF_DIR)
sys.exit(1)
if not os.path.exists(USER_CONF_FILE):
logging.debug("Creating configuration file: %s", USER_CONF_FILE)
cfg.set(Config.SECTION_GENERAL, Config.OPT_PHASES, "dev, test, prod")
cfg.set(Config.SECTION_GENERAL, Config.OPT_EXCLUDE_CHNL, "")
cfg.write()
else:
cfg.read()
def ask(msg, password=False):
"""
Ask input from the console. Hide the echo, in case of password or sensitive information.
"""
msg += ": "
return getpass.getpass(msg) if password else input(msg)
def parse_enumerated(data):
"""
Parse comma-separated elements.
"""
items = []
if data:
items = [_f for _f in [i.strip() for i in data.split(",")] if _f]
return items
def get_next_phase(current_name: str) -> str:
"""
Gets the name of the next phase of the workflow.
:param current_name:
:return:
"""
# pylint: disable-next=possibly-used-before-assignment
if current_name not in phases:
logging.error("Invalid phase name: %s", current_name)
sys.exit(1)
else:
current_num = phases.index(current_name)
# return the next phase name
if current_num + 1 < len(phases):
return phases[current_num + 1]
logging.error("Maximum phase exceeded! You can't move past '%s'.", phases[-1])
sys.exit(1)
def print_channel_tree() -> None:
"""
Prints the tree of existing channels to STDOUT.
:return: None
"""
tree = {}
# determine parent channels so we can make a pretty tree for the user
# pylint: disable-next=possibly-used-before-assignment
for ch_data in all_channels:
if ch_data.get("parent_label"):
if ch_data.get("parent_label") not in tree:
tree[ch_data.get("parent_label")] = []
tree[ch_data.get("parent_label")].append(ch_data.get("label"))
else:
if ch_data.get("label") not in tree:
tree[ch_data.get("label")] = []
# print the channels in a tree format
print("Channel tree:")
index = 1
step = len(str(len(list(tree.keys()))))
for parent in sorted(tree.keys()):
if tree[parent]:
print()
print(" %s. %s" % (str(index).rjust(step), parent))
index += 1
if tree[parent]:
for child in sorted(tree[parent]):
print((" " * step) + " \\__ %s" % child)
print()
print()
def channel_exists(ch_label, quiet=False) -> bool:
"""
Check if named channel exists.
:param ch_label: channel label
:param quiet: suppresses error log if True
:return: returns True if channel exists.
"""
try:
# pylint: disable-next=possibly-used-before-assignment
client.channel.software.getDetails(session, ch_label)
exists = True
except xmlrpclib.Fault as e:
# pylint: disable-next=possibly-used-before-assignment
if options.debug:
logging.exception(e)
if not quiet:
logging.error("Channel %s does not exist", ch_label)
exists = False
return exists
# pylint: disable=R0912
def merge_channels(source_label, dest_label) -> None:
"""
Merge channels data.
:param source_label:
:param dest_label:
:return: None
"""
if dest_label.startswith("rhel") and not options.tolerant:
logging.error("Destination label starts with 'rhel'. Aborting!")
logging.error("Pass --tolerant to override this")
sys.exit(1)
if options.exclude_channel:
for pattern in options.exclude_channel:
if source_label == pattern:
logging.info("Skipping %s due to an exclude filter", source_label)
return
# remove all the packages from the channel if requested
if options.clear_channel or options.rollback:
clear_channel(dest_label)
logging.info("Merging packages from %s into %s", source_label, dest_label)
if not options.dry_run:
# merge the packages from one channel into another
try:
packages = client.channel.software.mergePackages(
session, source_label, dest_label, True
)
logging.info("Added %i packages", len(packages))
except xmlrpclib.Fault as e:
if options.debug:
logging.exception(e)
logging.error("Failed to merge packages")
if not options.tolerant:
sys.exit(1)
if not options.no_errata:
logging.info("Merging errata into %s", dest_label)
if not options.dry_run:
# merge the errata from one channel into another
try:
errata = client.channel.software.mergeErrata(
session, source_label, dest_label
)
logging.info("Added %i errata", len(errata))
except xmlrpclib.Fault as e:
if options.debug:
logging.exception(e)
logging.error("Failed to merge errata")
if not options.tolerant:
sys.exit(1)
print()
# pylint: enable=R0912
def clone_channel(source_label, source_details) -> None:
"""
Clone channel.
:param source_label:
:param source_details:
:return: None
"""
if options.exclude_channel:
for pattern in options.exclude_channel:
if source_label == pattern:
logging.info("Skipping %s due to an exclude filter", source_label)
return
# channel doesn't exist, clone it from the original
logging.info("Cloning %s from %s", source_details["label"], source_label)
if not options.dry_run:
try:
client.channel.software.clone(session, source_label, source_details, False)
except xmlrpclib.Fault as e:
if options.debug:
logging.exception(e)
logging.error("Failed to clone channel")
if not options.tolerant:
sys.exit(1)
def clear_channel(lbl) -> None:
"""
Clears all the errata in the channel.
:param lbl:
:return: None
"""
logging.info("Clearing all errata from %s", lbl)
if not options.dry_run:
# attempt to clear the errata from the channel
try:
all_errata = client.channel.software.listErrata(session, lbl)
errata_names = [e.get("advisory_name") for e in all_errata]
client.channel.software.removeErrata(session, lbl, errata_names, False)
except xmlrpclib.Fault as e:
if options.debug:
logging.exception(e)
logging.warning("Failed to clear errata from %s", lbl)
if not options.dry_run:
logging.info("Clearing all packages from %s", lbl)
all_packages = client.channel.software.listAllPackages(session, lbl)
package_ids = [p.get("id") for p in all_packages]
client.channel.software.removePackages(session, lbl, package_ids)
def get_current_phase(source):
"""
Get current phase from the source channel label.
"""
out = None
for phase in phases:
if source.startswith("{phase}{dlm}".format(phase=phase, dlm=options.delimiter)):
out = phase
break
return out
def build_channel_labels(source):
"""
Build channel labels.
:param source:
:return: source, destination
"""
destination = None
if options.archive:
# prefix the existing channel with 'archive-YYYYMMDD-'
date_string = time.strftime("%Y%m%d", time.gmtime())
destination = "archive{dlm}{date}{dlm}{src}".format(
dlm=options.delimiter, date=date_string, src=source
)
elif options.init:
destination = "{phase}{dlm}{src}".format(
phase=phases[0], dlm=options.delimiter, src=source
)
if channel_exists(destination, quiet=True):
logging.error("%s already exists. Use --promote instead.", destination)
sys.exit(1)
elif options.promote:
# get the phase label from the channel label
current_phase = get_current_phase(source)
if current_phase:
next_phase = get_next_phase(current_phase)
# replace the name of the phase in the destination label
destination = re.sub("^%s" % current_phase, next_phase, source)
else:
destination = "{phase}{dlm}{src}".format(
phase=phases[0], dlm=options.delimiter, src=source
)
elif options.rollback:
# strip off the archive prefix when rolling back
destination = re.sub(
r"archive{dlm}\d{{8}}{dlm}".format(dlm=options.delimiter), "", source
)
return source, destination
def get_config_credentials(conf, opts):
"""
Look into configuration for credentials for the admin user.
"""
username = conf.get("general", "username")
password = conf.get("general", "password")
if username and password:
opts.username = username
opts.password = password
if __name__ == "__main__":
usage = """usage: %prog [options]
Create a 'dev' channel based on the latest packages:
spacewalk-manage-channel-lifecycle -c sles11-sp3-pool-x86_64 --init
Promote the packages from 'dev' to 'test':
spacewalk-manage-channel-lifecycle -c dev-sles11-sp3-pool-x86_64 --promote
Promote the packages from 'test' to 'prod':
spacewalk-manage-channel-lifecycle -c test-sles11-sp3-pool-x86_64 --promote
Archive a production channel:
spacewalk-manage-channel-lifecycle -c prod-sles11-sp3-pool-x86_64 --archive
Rollback the production channel to an archived version:
spacewalk-manage-channel-lifecycle \\
-c archive-20110520-prod-sles11-sp3-pool-x86_64 --rollback"""
option_list = [
Option(
"-l", "--list-channels", help="list existing channels", action="store_true"
),
Option(
"", "--init", help="initialize a development channel", action="store_true"
),
Option("-w", "--workflow", help="use configured workflow", default=""),
Option(
"-D",
"--delimiter",
type="choice",
choices=["-", "_", "."],
help="delimiter used between workflow and channel name",
default="-",
),
Option(
"-f",
"--list-workflows",
help="list configured workflows",
default=False,
action="store_true",
),
Option(
"",
"--promote",
help="promote a channel to the next phase",
action="store_true",
),
Option("", "--archive", help="archive a channel", action="store_true"),
Option("", "--rollback", help="rollback", action="store_true"),
Option("-c", "--channel", help="channel to init/promote/archive/rollback"),
Option(
"-C",
"--clear-channel",
help="clear all packages/errata from the channel before merging",
action="store_true",
),
Option("-x", "--exclude-channel", help="skip these channels", action="append"),
Option(
"",
"--no-errata",
help="don't merge errata data with --promote",
action="store_true",
),
Option(
"",
"--no-children",
help="don't operate on child channels",
action="store_true",
),
Option(
"-P",
"--phases",
default="",
help="comma-separated list of phases [default: dev,test,prod]",
),
Option("-u", "--username", help="Spacewalk username"),
Option("-p", "--password", help="Spacewalk password"),
Option(
"-s",
"--server",
help="Spacewalk server [default: %default]",
default="localhost",
),
Option(
"-n", "--dry-run", help="don't perform any operations", action="store_true"
),
Option("-t", "--tolerant", help="be tolerant of errors", action="store_true"),
Option("-d", "--debug", help="enable debug logging", action="count"),
]
parser = OptionParser(option_list=option_list, usage=usage)
(options, args) = parser.parse_args()
if options.debug:
level = logging.DEBUG
else:
level = logging.INFO
logging.basicConfig(level=level, format="%(levelname)s: %(message)s")
options.workflow = options.workflow or Config.SECTION_GENERAL
config = Config(USER_CONF_FILE)
try:
setup_config(config)
except ConfigParser.ParsingError as ex:
logging.error("Unable to process configuration:\n%s", str(ex))
sys.exit(1)
if options.list_workflows:
workflows = config.sections()
if not workflows:
print("There are no additinal configured workflows except default.")
sys.exit(0)
print("Configured additional workflows:")
idx = 1
for workflow in workflows:
print(" %s. %s" % (idx, workflow))
idx += 1
print()
sys.exit(0)
# sanity check
if not (
options.init
or options.promote
or options.archive
or options.rollback
or options.list_channels
):
logging.error(
"You must provide an action: %s",
"(--init/--promote/--archive/--rollback/--list-channels)",
)
sys.exit(1)
elif not options.list_channels and not options.channel:
logging.error("--channel is required")
sys.exit(1)
# parse the list of phases
phases = parse_enumerated(
options.phases
or config.get(options.workflow, Config.OPT_PHASES, "dev,test,prod")
)
# update exclude channel option
options.exclude_channel = options.exclude_channel or parse_enumerated(
config.get(options.workflow, Config.OPT_EXCLUDE_CHNL, "")
)
if len(phases) < 2:
logging.error("You must define at least 2 phases")
sys.exit(1)
# determine if you want to enable XMLRPC debugging
xmlrpc_debug = options.debug and options.debug > 1
# connect to the server
url = "http://localhost/rpc/api"
if options.server != "localhost":
url = "https://%s/rpc/api" % options.server
client = xmlrpclib.Server(url, verbose=xmlrpc_debug)
session = None
# check for an existing session
if os.path.exists(SESSION_CACHE):
try:
fh = open(SESSION_CACHE, "r", encoding="UTF-8")
session = fh.readline()
fh.close()
except IOError as e:
if options.debug:
logging.exception(e)
logging.debug("Failed to read session cache")
# validate the session
try:
client.channel.listMyChannels(session)
except xmlrpclib.Fault as e:
if options.debug:
logging.exception(e)
logging.warning("Existing session is invalid")
session = None
# Look for credentials in settings.conf
get_config_credentials(config, options)
if not session:
# prompt for the username
if not options.username:
while not options.username:
options.username = ask("Spacewalk Username")
# prompt for the password
if not options.password:
options.password = ask("Spacewalk Password", password=True)
if not options.password:
logging.warning("Empty password is not a good practice!")
# login to the server
try:
session = client.auth.login(options.username, options.password)
except xmlrpclib.Fault as e:
if options.debug:
logging.exception(e)
logging.error("Failed to log into %s", options.server)
sys.exit(1)
# save the session for subsuquent runs
try:
fh = open(SESSION_CACHE, "w", encoding="UTF-8")
fh.write(session)
fh.close()
except IOError as e:
if options.debug:
logging.exception(e)
logging.warning("Failed to write session cache")
# list all of the channels once
try:
all_channels = client.channel.listSoftwareChannels(session)
all_channel_labels = [c.get("label") for c in all_channels]
except xmlrpclib.Fault as e:
if options.debug:
logging.exception(e)
logging.error("Could not retrieve the list of software channels")
sys.exit(1)
# list the available custom channels and exit
if options.list_channels:
print_channel_tree()
sys.exit(0)
# ensure the source channel exists
if not channel_exists(options.channel):
sys.exit(1)
# determine the channel labels for the parent channel
(parent_source, parent_dest) = build_channel_labels(options.channel)
# inform the user that no changes will take place
if options.dry_run:
logging.info("DRY RUN - No changes are being made to the channels")
time.sleep(2)
print()
# merge packages/errata if the destination channel label already exists,
# otherwise clone it from the source channel
if parent_dest in all_channel_labels:
merge_channels(parent_source, parent_dest)
else:
# channel doesn't exist, clone it from the original
# let's check if there's a parent for the original channel and if so, clone it in the right place
new_parent_source = client.channel.software.getDetails(session, parent_source)[
"parent_channel_label"
]
new_parent_dest = ""
if new_parent_source:
(new_parent_source, new_parent_dest) = build_channel_labels(
new_parent_source
)
details = {
"label": parent_dest,
"name": parent_dest,
"summary": parent_dest,
"parent_label": new_parent_dest,
}
clone_channel(parent_source, details)
if not options.no_children:
children = []
# get the child channels for the source parent channel
for channel in all_channels:
if channel.get("parent_label") == parent_source:
children.append(channel.get("label"))
for label in children:
# determine the child channels for the source parent channel
(child_source, child_dest) = build_channel_labels(label)
# merge packages/errata if the destination channel label already exists,
# otherwise clone it from the source channel
if child_dest in all_channel_labels:
merge_channels(child_source, child_dest)
else:
details = {
"label": child_dest,
"name": child_dest,
"summary": child_dest,
"parent_label": parent_dest,
}
clone_channel(child_source, details)
0707010000000F000081B400000000000000000000000168DD3ED300008C5E000000000000000000000000000000000000002800000000spacewalk-utils/spacewalk-utils.changes-------------------------------------------------------------------
Tue Jun 17 18:56:54 CEST 2025 - marina.latini@suse.com
- version 5.1.6-0
* Fix base channel for openSUSE Micro 6.1 Uyuni Client Devel in spacewalk-common-channels
* Fix base channel for Oracle Linux 6 mysql57 in spacewalk-common-channels
-------------------------------------------------------------------
Mon May 12 23:04:22 CEST 2025 - marina.latini@suse.com
- version 5.1.5-0
* Remove rhn-ssl-tool --gen-server RPM feature and options
(bsc#1235696)
-------------------------------------------------------------------
Fri Apr 11 17:05:09 CEST 2025 - marina.latini@suse.com
- version 5.1.4-0
* Fix SSL error when connecting to localhost in the container
(bsc#1240023)
* Remove commented code
* Drop spacewalk-sync-setup tool
-------------------------------------------------------------------
Fri Jan 24 14:50:24 CET 2025 - marina.latini@suse.com
- version 5.1.3-0
* Add Uyuni Client Tools for SL Micro 6.2
* Add Uyuni Client Tools for SUSE Linux Enterprise 15 SP7 family
-------------------------------------------------------------------
Thu Dec 12 09:25:29 CET 2024 - rosuna@suse.com
- version 5.1.2-0
* Force login to spacecmd from spacewalk-hostname-rename (bsc#1229848)
* Remove unmaintained snapshot and export tools from package
`spacewalk-utils-extras`
* Add openSUSE Leap Micro 6.0 and 6.1 with Uyuni Client Tools
* Add Uyuni Client Tools for SL Micro 6.1
* Remove tools from spacewalk-utils-extra and move them to Uyuni
contrib repository
-------------------------------------------------------------------
Mon Oct 14 15:56:01 CEST 2024 - rosuna@suse.com
- version 5.1.1-0
* Add repositories for Ubuntu 24.04 LTS
* Drop unsupported tool spacewalk-final-archive as it is broken
and may disclose sensitive information (bsc#1228945)
* Bump version to 5.1.0
* Move taskotop tool to spacewalk-utils package
-------------------------------------------------------------------
Mon Jun 10 17:13:13 CEST 2024 - marina.latini@suse.com
- version 5.0.4-0
* Move server-only functions out of uyuni.common (bsc#1222325)
* Add SL Micro 6.0 Uyuni Client Tools Channel via
spacewalk-common-channels
-------------------------------------------------------------------
Thu Apr 04 17:59:01 CEST 2024 - marina.latini@suse.com
- version 5.0.3-0
* Remove apply_errata script
* spacewalk-hostname-rename should always set cobbler.host to localhost (bsc#1219887)
* Add openSUSE Leap 15.6 and its client tools
* Add Uyuni client tools for SUSE Linux Enterprise 15 SP6
-------------------------------------------------------------------
Mon Jan 29 11:48:40 CET 2024 - rosuna@suse.com
- version 5.0.2-1
* Use HTTP for localhost and HTTPS for other FQDN for spacewalk-common-channels
-------------------------------------------------------------------
Tue Jan 16 08:12:07 CET 2024 - jgonzalez@suse.com
- version 5.0.1-1
* Fix conflicting NAME for SLES and SLES4SAP channels of uyuni tools
in spacewalk-common-channels
-------------------------------------------------------------------
Fri Dec 15 17:24:43 CET 2023 - rosuna@suse.com
- version 4.4.11-1
* Amazon Linux 2023 channels
* Update the openSUSE Tumbleweed and MicroOS repositories
* Add SUSE Linux Enterprise Micro 5.5 to spacewalk-commons-channels
* Add Raspberry Pi OS 12 repositories
-------------------------------------------------------------------
Mon Nov 06 13:37:46 CET 2023 - rosuna@suse.com
- version 4.4.10-1
* Fix Debian 12 wrong repo url for Uyuni client tools (stable)
-------------------------------------------------------------------
Wed Nov 01 20:15:51 CET 2023 - marina.latini@suse.com
- version 4.4.9-1
* Add Debian 12 repositories
* add openSUSE Leap Micro 5.5 to spacewalk-commons-channels
-------------------------------------------------------------------
Mon Sep 18 14:36:37 CEST 2023 - rosuna@suse.com
- version 4.4.8-1
* Add missing Debian 10 and 11 backports repositories for spacewalk-common-channels
* Add openSUSE Leap 15.5 common channels
* Drop Python2 compatibility
* Add RHEL 7, 8, 9 pool and tools channels
* Add openSUSE Leap Micro 5.4 repositories
* Add SLE Micro 5.4 Uyuni Client Tools repositories
* spacewalk-hostname-rename remains stuck at refreshing pillars (bsc#1207550)
-------------------------------------------------------------------
Wed Apr 19 12:58:26 CEST 2023 - marina.latini@suse.com
- version 4.4.7-1
* change GPG Key URL for openSUSE Leap to local file URL
* Avoid conflicting names for openSUSE channels
* Add openEuler 22.03 repositories
-------------------------------------------------------------------
Tue Feb 28 11:54:37 CET 2023 - jgonzalez@suse.com
- version 4.4.6-1
* Use json instead of simplejson for spacewalk-clone-by-date
-------------------------------------------------------------------
Tue Feb 21 12:31:34 CET 2023 - jgonzalez@suse.com
- version 4.4.5-1
* Add openSUSE Leap Micro 5.3 and openSUSE MicroOS repositories
* Add SLES 15 SP5 client tools repositories to spacewalk-common-channels
* Add openSUSE Leap 15.5 repositories to spacewalk-common-channels
-------------------------------------------------------------------
Mon Jan 23 08:24:57 CET 2023 - jgonzalez@suse.com
- version 4.4.4-1
* Add Uyuni SLE-Micro Client Tools repositories
* fix Oracle Linux 9 repository definition
-------------------------------------------------------------------
Wed Dec 14 14:08:09 CET 2022 - jgonzalez@suse.com
- version 4.4.3-1
* remove jabberd and osa-dispatcher
* spacewalk-hostname-rename changes also report db host (bsc#1200801)
-------------------------------------------------------------------
Fri Nov 18 15:02:27 CET 2022 - jgonzalez@suse.com
- version 4.4.2-1
* Add EL9 Client Tools for SUSE Liberty Linux
-------------------------------------------------------------------
Wed Sep 28 10:46:25 CEST 2022 - jgonzalez@suse.com
- version 4.4.1-1
* Make spacewalk-hostname-rename working with settings.yaml
cobbler config file (bsc#1203564)
* Add Rocky Linux 9 to spacewalk-common-channels
* spacewalk-common-channels now syncs the channels automatically
on creation, if the new configuration property named
'unify_custom_channel_management' is enabled
-------------------------------------------------------------------
Wed Jul 27 14:09:58 CEST 2022 - jgonzalez@suse.com
- version 4.3.13-1
* change gpg key urls to file urls where possible
* spacewalk-hostname-rename now correctly replaces the hostname for
the mgr-sync configuration file (bsc#1198356)
* spacewalk-hostname-rename now utilizes the "--apache2-conf-dir"
flag for spacewalk-setup-cobbler
* Add repositories for Ubuntu 22.04 LTS
* Add AlmaLinux 9 and Oracle Linux 9 to spacewalk-common-channels
* Add missing SLES 15 SP4 client tools repositories to
spacewalk-common-channels.ini
-------------------------------------------------------------------
Tue Jun 21 18:31:46 CEST 2022 - jgonzalez@suse.com
- version 4.3.12-1
* add deprecation warning for spacewalk-clone-by-date
* Add EPEL8 for Almalinux 8 and Rocky 8 in spacewalk-common-channels.ini
-------------------------------------------------------------------
Fri May 20 00:12:42 CEST 2022 - jgonzalez@suse.com
- version 4.3.11-1
* openSUSE Leap 15.4 repositories
-------------------------------------------------------------------
Wed May 04 15:23:36 CEST 2022 - jgonzalez@suse.com
- version 4.3.10-1
* use mgr-ssl-cert-setup tool in spacewalk-hostname-rename to
deploy certificates on the server
-------------------------------------------------------------------
Sat Apr 23 00:33:09 CEST 2022 - jgonzalez@suse.com
- version 4.3.9-1
* Fix the channel name for the Debian11 Client Tools
-------------------------------------------------------------------
Tue Apr 19 12:42:43 CEST 2022 - jgonzalez@suse.com
- version 4.3.8-1
* Use the official URL for Debian11 security updates
-------------------------------------------------------------------
Fri Mar 11 15:22:33 CET 2022 - jgonzalez@suse.com
- version 4.3.7-1
* Fix changelog format
-------------------------------------------------------------------
Fri Mar 11 14:54:06 CET 2022 - jgonzalez@suse.com
- version 4.3.6-1
* Removed pylint according to Fedora packaging guidelines.
-------------------------------------------------------------------
Tue Jan 18 14:01:26 CET 2022 - jgonzalez@suse.com
- version 4.3.5-1
* require python macros for building
* Add Debian 11 repositories
-------------------------------------------------------------------
Fri Dec 03 12:29:48 CET 2021 - jgonzalez@suse.com
- version 4.3.4-1
* Use Almalinux Mirror List
* Use EL8 Client Tools for EL8 clones, as CentOS8 will be end of
life by the end of the year
-------------------------------------------------------------------
Tue Nov 16 10:07:42 CET 2021 - jgonzalez@suse.com
- version 4.3.3-1
* Enable aarch64 for AlmaLinux 8
-------------------------------------------------------------------
Fri Sep 17 12:12:12 CEST 2021 - jgonzalez@suse.com
- version 4.3.2-1
* When renaming: don't regenerate CA, allow using third-party
certificate and trigger pillar refresh (bsc#1190123)
-------------------------------------------------------------------
Mon Aug 09 11:07:38 CEST 2021 - jgonzalez@suse.com
- version 4.3.1-1
- Enable Uyuni Server and Proxy Stable for openSUSE Leap 15.3
- Add Rocky Linux 8 repositories
- Fix a typo at the AlmaLinux 8 Uyuni client tools for devel
- Fix the GPG key fingerprint for Springdale Linux 8
- Updated cloneByDate.py formatting to allow pylint pass.
-------------------------------------------------------------------
Fri Jun 18 15:18:20 CEST 2021 - jgonzalez@suse.com
- version 4.2.11-1
- Use the right URLs for the AlmaLinux 8 Uyuni client tools
- Add SLE Updates and Backport Updates repositories for openSUSE
Leap 15.3
-------------------------------------------------------------------
Fri Jun 04 12:43:25 CEST 2021 - jgonzalez@suse.com
- version 4.2.10-1
- Update devel common channels definitions to openSUSE Leap 15.3
-------------------------------------------------------------------
Mon May 24 12:38:52 CEST 2021 - jgonzalez@suse.com
- version 4.2.9-1
- spacewalk-hostname-rename: change hostname in /root/.mgr-sync (bsc#1183994)
- adapt hostname rename check to allow also short hostname in various
hostname files on the filesystem (bsc#1176512)
-------------------------------------------------------------------
Wed May 05 16:39:14 CEST 2021 - jgonzalez@suse.com
- version 4.2.8-1
- Align the modules.yaml of target channel after cloning errata (bsc#1182810)
- Add client tools for SLES12SP5 and SLES4SAP 12SP4/12SP5/15SP2/15SP3
- Fix the URLs for SLE15 Stable client tools
- Add openSUSE Tumbleweed/microOS
-------------------------------------------------------------------
Mon Apr 19 16:54:14 CEST 2021 - jgonzalez@suse.com
- version 4.2.7-1
- Add SLE15SP3
-------------------------------------------------------------------
Mon Apr 19 11:37:47 CEST 2021 - jgonzalez@suse.com
- version 4.2.6-1
- Bugfix for ubuntu-18.04 repo urls: multiverse, restricted and backports
-------------------------------------------------------------------
Fri Apr 16 13:24:29 CEST 2021 - jgonzalez@suse.com
- version 4.2.5-1
- Add openSUSE Leap 15.3
- Add aarch64 for CentOS7/8 and Oracle7/8
- Add AlmaLinux 8 repositories
- Add Amazon Linux 2 repositories
- Add Alibaba Cloud Linux 2 repositories
- Add current UEK repos to Oracle Linux
- Add multiverse, restricted and backports to Ubuntu 16.04, 18.04 and 20.04
- Add the Universe Security repositories for Ubuntu
- Complete the fix arch handling in spacewalk-common-channels
-------------------------------------------------------------------
Wed Jan 27 13:06:52 CET 2021 - jgonzalez@suse.com
- version 4.2.4-1
- Fix arch handling in spacewalk-common-channels
- Fix modular data handling for cloned channels (bsc#1177508)
- spacewalk-common-channels: Update CentOS6 URLs to use vault.centos.org
- spacewalk-common-channels: re-use repositories when different channels
use the same one
-------------------------------------------------------------------
Thu Dec 03 13:54:48 CET 2020 - jgonzalez@suse.com
- version 4.2.3-1
- Fixed Python files to pass pylint.
- Modified SPEC to work with RHEL8.
- Remove Debian 9 and 10 channels for SUSE Manager, now provided by SCC data
-------------------------------------------------------------------
Wed Nov 25 12:25:22 CET 2020 - jgonzalez@suse.com
- version 4.2.2-1
- Enable ppc64le for CentOS7 and CentOS8
-------------------------------------------------------------------
Fri Sep 18 12:17:53 CEST 2020 - jgonzalez@suse.com
- version 4.2.1-1
- Avoid exceptions on the logs when looking for channels that do
not exist (bsc#1175529)
- Update package version to 4.2.0
-------------------------------------------------------------------
Thu Jul 23 13:32:55 CEST 2020 - jgonzalez@suse.com
- version 4.1.11-1
- Channels for Uyuni Proxy and Server for openSUSE Leap 15.2
- Add aarch64 for openSUSE Leap 15.1 and 15.2
-------------------------------------------------------------------
Wed Jun 10 12:21:25 CEST 2020 - jgonzalez@suse.com
- version 4.1.10-1
- Add channels for openSUSE Leap 15.1 and Uyuni Client Tools, and
Uyuni Client Tools for SLE15SP2
- Use HTTPS for Oracle repositories
-------------------------------------------------------------------
Wed May 20 10:56:39 CEST 2020 - jgonzalez@suse.com
- version 4.1.9-1
- Create separate channels for Oracle Client Tools (use CentOS URLs)
- Add repositories for Ubuntu 20.04 LTS
-------------------------------------------------------------------
Mon Apr 13 09:34:52 CEST 2020 - jgonzalez@suse.com
- version 4.1.8-1
- Add Astra Linux CE "Orel" repositories
- check for delimiter as well when detecting current phase (bsc#1164771)
-------------------------------------------------------------------
Thu Mar 19 12:16:45 CET 2020 - jgonzalez@suse.com
- version 4.1.7-1
- fix spacewalk-common-channel when base channel exists
- Add Springdale Linux 6, 7 and 8 repositories
-------------------------------------------------------------------
Wed Mar 11 10:57:45 CET 2020 - jgonzalez@suse.com
- version 4.1.6-1
- Split spacewalk-utils into two packages:
* spacewalk-utils with tools supported on SUSE Manager
* spacewalk-utils-extras with tools unsupported on SUSE Manager
-------------------------------------------------------------------
Mon Feb 17 12:52:28 CET 2020 - jgonzalez@suse.com
- version 4.1.5-1
- Add Oracle Enterprise Linux 8 repositories
-------------------------------------------------------------------
Thu Jan 30 17:17:13 CET 2020 - jgonzalez@suse.com
- version 4.1.4-1
- Use new URLs for Uyuni Server and Proxy Stable, and unify channel
names for Devel
-------------------------------------------------------------------
Thu Jan 30 14:49:16 CET 2020 - jgonzalez@suse.com
- version 4.1.3-1
- Add FQDN resolver for spacewalk-manage-channel-lifecycle (bsc#1153578)
- Fix typo in CentOS 7 Software Collection
-------------------------------------------------------------------
Wed Jan 22 12:14:49 CET 2020 - jgonzalez@suse.com
- version 4.1.2-1
- Add universe updates to Ubuntu common channels
- Rename ubuntu-XXXX-amd64-main-universe to ubuntu-XXXX-amd64-universe and
ubuntu-XXXX-amd64-main-universe-uyuni to ubuntu-XXXX-amd64-universe-uyuni
in common channels
- Enable CentOS8 at spacewalk-common-channels (bsc#1159206)
-------------------------------------------------------------------
Wed Nov 27 17:04:04 CET 2019 - jgonzalez@suse.com
- version 4.1.1-1
- Add FQDN resolver for spacewalk-manage-channel-lifecycle (bsc#1153578)
- build as python3 only package
- require uyuni-common-libs
- add Fedora 30 to spacewalk-common-channels
- remove EOL products Fedora 27 and 28 from spacewalk-common-channels
- add command line argument --ssl-city=<SSL_CITY> to spacewalk-hostname-rename
- Update URLs for Uyuni Master Server and Proxy
- Bump version to 4.1.0 (bsc#1154940)
- fix hostname-rename script for cobbler files
- Set openSUSE Leap 15.1 as new Base OS for Uyuni Server and Proxy
- Remove EOL openSUSE Leap 42.3 from spacewalk-common-channels
- Require uyuni-base-common for /etc/rhn
- add spacewalk-watch-channel-sync.sh to spacewalk-utils
-------------------------------------------------------------------
Thu Aug 01 19:00:44 CEST 2019 - jgonzalez@suse.com
- version 4.0.12-1
- common-channels: Duplicate Ubuntu channels for Uyuni
-------------------------------------------------------------------
Wed Jul 31 17:37:23 CEST 2019 - jgonzalez@suse.com
- version 4.0.11-1
- common-channels: Fix repo type assignment for type YUM (bsc#1151683)
- Use the same client tools for openSUSE Leap 15.0 for all openSUSE Leap
15.X releases.
- Fixes SSL hostname matching (bsc#1141663)
- hostname-rename: change hostname in cobbler db and autoinst data
- Adds support for Ubuntu and Debian channels to spacewalk-common-channels.
-------------------------------------------------------------------
Wed May 15 15:20:26 CEST 2019 - jgonzalez@suse.com
- version 4.0.10-1
- SPEC cleanup
- Add support for openSUSE Leap 15.1
- Fixes numerous Python3 errors in spacewalk-manage-channel-lifecycle
- Fixes an attempt to write in binary mode a string type (bsc#1132361)
- Adds some integration and unit tests
-------------------------------------------------------------------
Mon Apr 22 12:17:00 CEST 2019 - jgonzalez@suse.com
- version 4.0.9-1
- Fix spacewalk-common-channels interpolation error (bsc#1131988)
- add makefile and pylint configuration
-------------------------------------------------------------------
Fri Mar 29 10:33:32 CET 2019 - jgonzalez@suse.com
- version 4.0.8-1
- Add support on depsolver to use a custom input file and produce YAML output.
- Fix depsolver to use libsolv instead of yum library.
- Fix spacewalk-clone-by-date to not depend on yum.
- Fix issues in spacewalk scripts after migration to Python 3.
-------------------------------------------------------------------
Mon Mar 25 16:48:23 CET 2019 - jgonzalez@suse.com
- version 4.0.7-1
- Sync with Spacewalk
- fix taskotop crash caused by integer argument expected
-------------------------------------------------------------------
Wed Feb 27 13:04:42 CET 2019 - jgonzalez@suse.com
- version 4.0.6-1
- Fix package installation on python3 based operating systems
- Sync with Spacewalk
- Fix typo in spacewalk-manage-channel-lifecycle
-------------------------------------------------------------------
Thu Jan 17 14:45:24 CET 2019 - jgonzalez@suse.com
- version 4.0.5-1
- Make spacewalk-utils python3 compatible
-------------------------------------------------------------------
Wed Jan 16 12:25:40 CET 2019 - jgonzalez@suse.com
- version 4.0.4-1
- Create directory with correct ownership to prevent file conflicts
-------------------------------------------------------------------
Mon Dec 17 14:42:10 CET 2018 - jgonzalez@suse.com
- version 4.0.3-1
- Exit with an error if spacewalk-common-channels does not match
any channel
- Add Uyuni Client Tools for CentOS, openSUSE and SLES
- Removed channels for distributions EoL
- Removed Spacewalk Server channels
- Removed Spacewalk Client Tools channels for CentOS and openSUSE
- Fix typo at --phases option help
-------------------------------------------------------------------
Fri Oct 26 10:46:14 CEST 2018 - jgonzalez@suse.com
- version 4.0.2-1
- remove spacewalk-archive-audits
-------------------------------------------------------------------
Fri Aug 10 15:34:58 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)
-------------------------------------------------------------------
Tue Jun 05 10:12:23 CEST 2018 - jgonzalez@suse.com
- version 2.8.18.2-1
- remove unmaintained openSUSE Leap versions from common channels
- add openSUSE Leap 15.0 to common channels
- Add an ability to specify admin credentials in settings.conf (bsc#1085484)
-------------------------------------------------------------------
Mon May 07 15:25:51 CEST 2018 - jgonzalez@suse.com
- version 2.8.18.1-1
- clone-by-date removes packages only if the list is not empty (bsc#1089396)
-------------------------------------------------------------------
Mon Apr 23 09:19:20 CEST 2018 - jgonzalez@suse.com
- version 2.8.17.1-1
- Sync with upstream (bsc#1083294)
- Update gpgs in database
- Update common channels with latest releases
-------------------------------------------------------------------
Mon Mar 26 09:09:33 CEST 2018 - jgonzalez@suse.com
- version 2.8.14.1-1
- Sync with upstream (bsc#1083294)
- 1537766 - make sure to send output to log and stdout
- 1537766 - reject negative numbers for batch/interval/age
-------------------------------------------------------------------
Mon Mar 05 09:00:29 CET 2018 - jgonzalez@suse.com
- version 2.8.13.2-1
- remove empty clean section from spec (bsc#1083294)
-------------------------------------------------------------------
Wed Feb 28 10:05:43 CET 2018 - jgonzalez@suse.com
- version 2.8.13.1-1
- 1537766 - Fix broken DELETE in postgresql
-------------------------------------------------------------------
Fri Feb 02 13:10:37 CET 2018 - jgonzalez@suse.com
- version 2.8.9.2-1
- 1537766 - Add spacewalk-manage-snapshots, to give sw-admin a snapshot-mgt
tool
-------------------------------------------------------------------
Wed Jan 17 13:02:31 CET 2018 - jgonzalez@suse.com
- version 2.8.8.1-1
- add nightly-server repository for Fedora 27
- add nightly-client repository for Fedora 27
- add Fedora 27 repositories
1bedaa21757e199b0a88bb1562506040ca33fd8a remove Fedora 24 as it is EOL now
- Remove restrictions imposed on regex used in 'removelist' parameter passed
to spacewalk-clone-by-date that allowed only exact match
(bsc#1075254)
-------------------------------------------------------------------
Tue Aug 08 11:32:45 CEST 2017 - fkobzik@suse.de
- version 2.7.10.5-1
- Don't show password on input in spacewalk-manage-channel-lifecycle
(bsc#1043795)
-------------------------------------------------------------------
Mon Jun 12 09:03:22 CEST 2017 - mc@suse.de
- version 2.7.10.4-1
- add opensuse_leap42_3 and remove opensuse13_2 (bsc#1043778)
-------------------------------------------------------------------
Mon May 29 15:33:16 CEST 2017 - mc@suse.de
- version 2.7.10.3-1
- minor tweak to archive-audits manpage
- taskotop retrieve list of each task by end date, not start date
-------------------------------------------------------------------
Wed May 03 16:09:12 CEST 2017 - michele.bologna@suse.com
- version 2.7.10.2-1
- update CentOS7 addon repos
- removed definitions of EOLed products
- add new channels Fedora 25 and Spacewalk 2.6
-------------------------------------------------------------------
Mon Apr 03 14:45:30 CEST 2017 - mc@suse.de
- version 2.7.10.1-1
- add UTF-8 encoding before output on stdout
- Update taskotop man page
- Add command line argument to optionally specify the number of times
taskotop should iterate before exiting.
- Modify output columns to include task run end time and optional
task run start time. Drop the status column because its redundant.
- Add new 'each task' display mode
-------------------------------------------------------------------
Fri Mar 31 09:39:51 CEST 2017 - mc@suse.de
- version 2.7.8.1-1
- docbook manpage for delete-old-systems-interactive
- rewrite delete-old-systems-interactive into python
- add taskomaticd process info in optional header to taskotop
- remove system currency generation script
- taskotop enhancements
-------------------------------------------------------------------
Tue Mar 07 14:42:32 CET 2017 - mc@suse.de
- version 2.7.6.1-1
- Updated links to github in spec files
- add exception processing in taskotop
- tweaked manpage a bit
- add additional info about taskotop
- add Fedora 25 repositories
-------------------------------------------------------------------
Tue Feb 07 15:10:11 CET 2017 - michele.bologna@suse.com
- version 2.7.1.1-1
- Use spacewalk 2.6 for openSUSE Leap 42.2
- Add channels for openSUSE Leap 42.2
-------------------------------------------------------------------
Wed Jan 11 16:40:21 CET 2017 - michele.bologna@suse.com
- version 2.7.0.1-1
- Bumping package versions for 2.7.
-------------------------------------------------------------------
Fri Dec 16 13:55:48 CET 2016 - michele.bologna@suse.com
- version 2.5.6.5-1
- use spacewalk 2.6 for openSUSE Leap 42.2
- add channels for openSUSE Leap 42.2
-------------------------------------------------------------------
Tue May 24 15:29:34 CEST 2016 - kwalter@suse.com
- version 2.5.6.4-1
- taskotop: a utility to monitor what Taskomatic is doing
-------------------------------------------------------------------
Wed Apr 06 08:48:55 CEST 2016 - mc@suse.de
- version 2.5.6.3-1
- spacewalk-clone-by-date - package names may contain special regexp
chars now
-------------------------------------------------------------------
Mon Mar 21 16:25:39 CET 2016 - mc@suse.de
- version 2.5.6.2-1
- fix file permissions (bsc#970550)
-------------------------------------------------------------------
Tue Jan 26 14:03:16 CET 2016 - mc@suse.de
- version 2.5.6.1-1
- Extended allowed delimiters to include '.'
- Added UEK4 channels for Oracle Linux 6 and 7.
- add openSUSE Leap 42.1 (bsc#961353)
- remove outdated openSUSE distribution 13.1
-------------------------------------------------------------------
Sat Jan 16 11:19:15 CET 2016 - mc@suse.de
- version 2.5.4.1-1
- fixing typo in 'archs'
-------------------------------------------------------------------
Tue Jan 05 15:54:59 CET 2016 - mc@suse.de
- version 2.5.3.2-1
- Add delimiter option for spacewalk-manage-channel-lifecycle
-------------------------------------------------------------------
Wed Dec 16 11:16:50 CET 2015 - mc@suse.de
- version 2.5.3.1-1
- Updated Oracle yum repo URLs and added new repositories for OL6 and OL7.
- make clone-by-date python 2.4 compatible
-------------------------------------------------------------------
Mon Nov 30 11:05:27 CET 2015 - mc@suse.de
- version 2.5.1.1-1
- adapt checks for cert trust dirs
- disable spacewalk-dump-schema functionality when rhn-upgrade
package is found
-------------------------------------------------------------------
Wed Oct 07 13:32:35 CEST 2015 - mc@suse.de
- version 2.5.0.1-1
- spacewalk-hostname-rename knows to start postgresql
- prevent spacewalk-hostname-rename to fail with an IPv6 address
- general bugfixes
-------------------------------------------------------------------
Tue Mar 31 14:39:32 CEST 2015 - mc@suse.de
- version 2.1.27.13-1
- spacewalk-manage-channel-lifecycle: Fix automatic assumption of
first phase (bsc#922294)
-------------------------------------------------------------------
Tue Feb 03 11:58:46 CET 2015 - mc@suse.de
- version 2.1.27.12-1
- make sql queries Oracle 10g compatible
- disable and enable indexes in Oracle, set time format and control parameters
- added Fedora 21 channels
-------------------------------------------------------------------
Thu Dec 04 13:28:41 CET 2014 - mc@suse.de
- version 2.1.27.11-1
- prevent empty dir creation by scbd
- Updated spacewalk-common-channels.ini to include Oracle Linux 7
- fix error if blacklist / removelist not in scbd config file
- improve error messaging in scbd
-------------------------------------------------------------------
Fri Nov 07 13:15:08 CET 2014 - mc@suse.de
- version 2.1.27.10-1
- Add openSUSE 13.2 repositories to spacewalk-common-channels
- extending spacewalk-api man page with usage of boolean values
-------------------------------------------------------------------
Tue Oct 14 15:15:59 CEST 2014 - mc@suse.de
- version 2.1.27.9-1
- spacewalk-manage-channel-lifecycle: put default phases in help output
- Allow use of "-" symbol in phase names
-------------------------------------------------------------------
Fri Sep 12 15:47:56 CEST 2014 - mc@suse.de
- version 2.1.27.8-1
- man page update: clone-by-date doesn't support 3rd party repos
- improve clone-by-date dependency resolution
- Check if dest parent is cloned
- sw-clone-by-date --dry-run
- make clone-by-date able to specify --parents from config file
- you should not have to specify both parent channels for clone-by-
date
- CentOS 7 + EPEL 7 channels
-------------------------------------------------------------------
Tue Jun 17 10:17:09 CEST 2014 - jrenner@suse.de
- version 2.1.27.7-1
- Fixed spacewalk-hostname-rename to work with postgresql backend
- Added limitation of spacewalk-clone-by-date for RHEL4 and earlier
-------------------------------------------------------------------
Tue May 27 17:13:27 CEST 2014 - mc@suse.de
- version 2.1.27.6-1
- Show SLES channels in help output
-------------------------------------------------------------------
Wed May 21 11:07:19 CEST 2014 - mc@suse.de
- version 2.1.27.5-1
- spacewalk-manage-channel-lifecycle: Added better channel tree printing
- spacewalk-manage-channel-lifecycle: Added multiple workflows
- spacewalk-manage-channel-lifecycle: Fixing None-channel
- spacewalk-manage-channel-lifecycle: introduce a configuration file
-------------------------------------------------------------------
Fri May 16 13:02:44 CEST 2014 - mc@suse.de
- version 2.1.27.4-1
- Assume raw mode if the directory with definition files doesn't exist
- spacewalk-sync-setup: Refined error message when apply or describe-templates
is passed w/o hosts
- spacewalk-sync-setup: Renamed options,'dry-run' to 'describe-templates' with
'dt' and 'default-ok' to 'configured-hosts' with 'ch'
- spacewalk-sync-setup: Show help, if no options passed but config already
exists.
- spacewalk-sync-setup: Dry run default should be False.
- spacewalk-sync-setup: Processing master and slave credentials in this order.
- spacewalk-sync-setup: Require master or slave hostname or --default-ok option
on apply or dry run modes.
- spacewalk-sync-setup: Always initialize config with the real values.
- spacewalk-sync-setup: Asking for username and password
- spacewalk-sync-setup: Branding change from Satellite to Spacewalk
- spacewalk-sync-setup: Fix duplicate error messaging.
- spacewalk-sync-setup: Fix test FQDN input.
- spacewalk-sync-setup: Fix crash on accessing required fields before
validation. Fix plain text visible password.
- spacewalk-sync-setup: Fix option parsing
-------------------------------------------------------------------
Tue May 06 15:16:37 CEST 2014 - mc@suse.de
- version 2.1.27.3-1
- sw-clone-by-date validation update
- fix problem where --channels=src_label dst_label threw an error
-------------------------------------------------------------------
Thu Mar 27 10:18:42 CET 2014 - fcastelli@suse.com
- version 2.1.27.2-1
- Make it possible to specify description from clone-be-date
- Fixing possible nonetype error
- Let spacewalk-api send username and password as strings
- Fixing long lines in clone-by-date
- Add option to clone-by-date to only clone specified errata
- Allow user to specify channel name through clone-by-date
- Spacwalk-repo-sync prints the same message for every channel.
-------------------------------------------------------------------
Fri Feb 07 13:54:04 CET 2014 - mc@suse.de
- version 2.1.27.1-1
- create api for channel errata syncing, have clone-by-date call it
- adding postgresql92-postgresql to possible db service names
- Changed gpg keys so they match reality.
- Removing unsupported Fedora 17
- Adding Fedora 20 to spacewalk-common-channels
- adding 2.1 repositories to spacewalk-common-channels
- remove openSUSE 12.2 and add openSUSE 13.1 channels
- clone-by-date: fix with dependency check enabled (bnc#858652)
- Updating the copyright years info
-------------------------------------------------------------------
Mon Jan 13 09:43:53 CET 2014 - mc@suse.de
- version 2.1.23.1-1
- fix man page generation on SUSE
- fixed man page encoding
-------------------------------------------------------------------
Mon Dec 09 16:20:01 CET 2013 - mc@suse.de
- version 2.1.22.1-1
- switch to 2.1
-------------------------------------------------------------------
Wed Jun 12 13:38:38 CEST 2013 - mc@suse.de
- version 1.7.15.11-1
- work around buggy perl version in SLES11
(manually specify encoding options for spacewalk-dump-schema)
- check to see if the key exists before initializing parent channel key
- fixed promote phase naming errors
- correctly quote the database name
- disable, enable & rebuild indexes for migrations
-------------------------------------------------------------------
Thu Apr 04 15:28:11 CEST 2013 - mc@suse.de
- version 1.7.15.10-1
- add openSUSE 12.3 to spacewalk-common-channels config
- add script for automated user creation from LDAP (FATE#312615)
-------------------------------------------------------------------
Thu Nov 22 15:49:53 CET 2012 - jrenner@suse.de
- version 1.7.15.9-1
- add openSUSE 12.2 to common channels
- spacewalk-setup-cobbler do not support --enable-tftp option (bnc#787931)
- install missing spacewalk-manage-channel-lifecycle script
-------------------------------------------------------------------
Fri Sep 28 16:10:08 CEST 2012 - mc@suse.de
- version 1.7.15.8-1
- make sure the regular expressions actually match.
- The Enhancement Advisory is actually Product Enhancement Advisory.
- strip non-number chars from date format
-------------------------------------------------------------------
Tue Aug 07 16:41:16 CEST 2012 - mc@suse.de
- version 1.7.15.7-1
- prevent spacewalk-hostname-rename to fail with an IPv6 address
-------------------------------------------------------------------
Mon Jun 25 10:24:30 CEST 2012 - mc@suse.de
- version 1.7.15.6-1
- adding license files for gpl v2+v3 (bnc#764869)
- system.list_user_systems() now returns localtime
-------------------------------------------------------------------
Thu May 31 10:53:01 CEST 2012 - mc@suse.de
- version 1.7.15.5-1
- spacewalk-clone-by-date failes with TypeError when on Postgres
database.
- use spacewalk-setup-cobbler instead of outdated cobbler-setup
- Revert "set localhost instead of hostname to tnsnames.ora and listener.ora"
- added version for scientific linux default channel mapping
-------------------------------------------------------------------
Mon May 14 10:50:14 CEST 2012 - mc@suse.de
- version 1.7.15.4-1
- The plan_table is not part of our schema, do not dump it.
- added dist_map_release for automatic OS->base channel mapping
- set dist release map via setDefaultMap
- removed fedora12/13/14 which are long time EOL
-------------------------------------------------------------------
Fri Apr 27 16:24:46 CEST 2012 - mc@suse.de
- version 1.7.15.3-1
- Better regex for getting system_id in apply_errata
- determine the advisory type by parsing "advisory_type"
- implement -n for apply_errata
-------------------------------------------------------------------
Fri Apr 20 15:31:39 CEST 2012 - mc@suse.de
- version 1.7.15.2-1
- make generated SSL certificate publicly available
- new option to list snapshot details
- support for psql syntax
- added spacewalk-manage-channel-lifecycle script
- spacewalk-clone-by-date manpage bugfixes/cleanups
- reused function from spacewalk.common.cli
-------------------------------------------------------------------
Wed Mar 21 17:54:26 CET 2012 - mc@suse.de
- version 1.7.15.1-1
- Bumping package version
-------------------------------------------------------------------
Sun Jan 30 15:32:23 CET 2011 - mc@suse.de
- backport upstrem fixes
-------------------------------------------------------------------
Wed Sep 15 10:09:06 CEST 2010 - mantel@suse.de
- Initial release of spacewalk-utils
07070100000010000081B400000000000000000000000168DD3ED300000021000000000000000000000000000000000000004100000000spacewalk-utils/spacewalk-utils.changes.agraul.pylint-everything- Allow existing pylint failures
07070100000011000081B400000000000000000000000168DD3ED300000022000000000000000000000000000000000000003E00000000spacewalk-utils/spacewalk-utils.changes.agraul.reformat-black- Reformat Python code with black
07070100000012000081B400000000000000000000000168DD3ED300000042000000000000000000000000000000000000005E00000000spacewalk-utils/spacewalk-utils.changes.carlo.uyuni-fix-spacewalk-common-channels-rhel-clones- Fix errors in spacewalk common channels init file (RHEL clones)
07070100000013000081B400000000000000000000000168DD3ED30000003E000000000000000000000000000000000000003F00000000spacewalk-utils/spacewalk-utils.changes.cbosdo.hostname-rename- Fix spacewalk-hostname-rename with containers (bsc#1229825)
07070100000014000081B400000000000000000000000168DD3ED300000020000000000000000000000000000000000000004600000000spacewalk-utils/spacewalk-utils.changes.mcalmer.fix-changelog-formats- Fix syntax error in changelog
07070100000015000081B400000000000000000000000168DD3ED30000002B000000000000000000000000000000000000003E00000000spacewalk-utils/spacewalk-utils.changes.mcalmer.leap-micro-62- Add openSUSE Leap Micro 6.2 repositories
07070100000016000081B400000000000000000000000168DD3ED300000139000000000000000000000000000000000000004A00000000spacewalk-utils/spacewalk-utils.changes.mcalmer.uyuni-tumbleweed-channels- Change Uyuni Server and Proxy repositories for new tumbleweed
and microos base channels
- Drop Debian 9 and 10 repositories after end of LTS
- Drop EOL SLES and SLE Micro repositories
- Drop EOL openSUSE Leap and Leap Micro repositories
- Drop all legacy spacewalk repositories
- Drop all Centos 6 and clones
07070100000017000081B400000000000000000000000168DD3ED30000003A000000000000000000000000000000000000004100000000spacewalk-utils/spacewalk-utils.changes.meaksh.master-bsc1244027- Use a dedicated path for Cobbler settings (bsc#1244027)
07070100000018000081B400000000000000000000000168DD3ED300000E72000000000000000000000000000000000000002500000000spacewalk-utils/spacewalk-utils.spec#
# spec file for package spacewalk-utils
#
# Copyright (c) 2025 SUSE LLC
# 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/
#
# The productprettyname macros is controlled in the prjconf. If not defined, we fallback here
%{!?productprettyname: %global productprettyname Uyuni}
Name: spacewalk-utils
Version: 5.2.0
Release: 0
Summary: Utilities that may be run against a %{productprettyname} server
License: GPL-2.0-only AND GPL-3.0-or-later
Group: Productivity/Other
URL: https://github.com/uyuni-project/uyuni
Source0: https://github.com/spacewalkproject/spacewalk/archive/%{name}-%{version}.tar.gz
BuildRequires: docbook-utils
BuildRequires: fdupes
BuildRequires: make
BuildRequires: python3
BuildRequires: python3-rpm-macros
BuildRequires: uyuni-base-common
# Required by depsolver.py
Requires: (python3-PyYAML or python3-pyyaml)
# Required by spacewalk-watch-channel-sync.sh
Requires: bash
# Required by depsolver.py
Requires: python3-solv
# Required by depsolver.py, cloneByDate.py, spacewalk-common-channels
Requires: python3-uyuni-common-libs
# Required by cloneByDate.py, spacewalk-clone-by-date, spacewalk-common-channels
Requires: spacewalk-backend
# Required by cloneByDate.py
Requires: spacewalk-backend-sql
# Required by cloneByDate.py, depsolver.py
Requires: spacewalk-backend-tools >= 2.2.27
# Required by cloneByDate.py, depsolver.py,spacewalk-clone-by-date
Requires(pre): uyuni-base-common
# Required by taskotop
Requires: python3-curses
# Required by taskotop
Requires: spacewalk-backend-sql
BuildArch: noarch
%if 0%{?suse_version}
Requires: perl = %{perl_version}
%else
Requires: perl(:MODULE_COMPAT_%(eval "`perl -V:version`"; echo $version))
%endif
%description
Utilities that may be run against a %{productprettyname} server
%prep
%setup -q
%build
make all
%install
make install PREFIX=%{buildroot} ROOT=%{python3_sitelib} \
MANDIR=%{_mandir}
pushd %{buildroot}
%if 0%{?suse_version}
%py3_compile -O %{buildroot}%{python3_sitelib}
%fdupes %{buildroot}%{python3_sitelib}
%else
%py_byte_compile %{__python3} %{buildroot}%{python3_sitelib}
%endif
popd
%check
%files
%defattr(-,root,root)
%license COPYING.GPLv2 COPYING.GPLv3
%attr(755,root,root) %{_bindir}/spacewalk-common-channels
%attr(755,root,root) %{_bindir}/spacewalk-clone-by-date
%attr(755,root,root) %{_bindir}/spacewalk-manage-channel-lifecycle
%attr(755,root,root) %{_bindir}/taskotop
%attr(755,root,root) %{_bindir}/spacewalk-watch-channel-sync.sh
%config %{_sysconfdir}/rhn/spacewalk-common-channels.ini
%dir %{python3_sitelib}/utils
%{python3_sitelib}/utils/__init__.py*
%{python3_sitelib}/utils/cloneByDate.py*
%{python3_sitelib}/utils/depsolver.py*
%dir %{python3_sitelib}/utils/__pycache__
%{python3_sitelib}/utils/__pycache__/__init__.*
%{python3_sitelib}/utils/__pycache__/cloneByDate.*
%{python3_sitelib}/utils/__pycache__/depsolver.*
%{_mandir}/man8/spacewalk-clone-by-date.8%{?ext_man}
%{_mandir}/man8/taskotop.8%{?ext_man}
%changelog
07070100000019000081FD00000000000000000000000168DD3ED3000001F1000000000000000000000000000000000000003000000000spacewalk-utils/spacewalk-watch-channel-sync.sh#!/bin/bash
###################################################
#
# The script will display the progress of latest
# channel sync and update every 3 seconds
#
# Anthony Tortola 2019
#
###################################################
while [ 1 ]
do
filename=`ls -tr /var/log/rhn/reposync|tail -1`
clear
echo -e "\nWatching $filename\n\n\tPress Ctrl-C to Break\n"
echo -e "\t$(date)\n"
tail -n20 /var/log/rhn/reposync/$filename
sleep 3
done
exit
0707010000001A000081B400000000000000000000000168DD3ED300000029000000000000000000000000000000000000003800000000spacewalk-utils/susemanager.changes.mbussolotto.postfix- setup postfix hostname using conf file
0707010000001B000081FD00000000000000000000000168DD3ED3000072A6000000000000000000000000000000000000001900000000spacewalk-utils/taskotop#!/usr/bin/python3
# pylint: disable=missing-module-docstring
#
# Displays a summary of Taskomatic activities in progress
#
# Copyright (c) 2016 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 datetime
import time
import struct
import signal
import sys
import curses
import logging
import argparse
import os.path
from spacewalk.server import rhnSQL
from io import BytesIO
DEFAULT_LOGFILE = "./taskotop.log"
parser = argparse.ArgumentParser(
description="Taskotop is a tool to monitor what taskomatic " + "is currently doing."
)
mode_group = parser.add_mutually_exclusive_group()
mode_group.add_argument(
"-e",
"--each-task",
action="store_true",
dest="eachTask",
help="Display most recent run for each task instead of recent task run history.",
)
mode_group.add_argument(
"-r",
"--recent-history",
action="store_true",
dest="recentHistory",
help="Display recent history of task runs. This is the default display mode.",
)
parser.add_argument(
"-H",
"--human-readable",
action="store_true",
dest="humanReadable",
help="Use human readable time output. Time will be displayed "
+ "in the format [[days:]hours:]min:sec instead of total seconds.",
)
parser.add_argument(
"-m",
"--max-age",
type=int,
dest="maxAge",
default=60,
help="Retrieve past events up to this old (in seconds, default 60). "
+ "This has no effect if -e/--each-task is specified.",
)
parser.add_argument(
"-n",
type=int,
dest="numIterations",
default=0,
help="taskotop will iterate the specified number of times and then exit. "
+ "If not specified or 0 (the default), taskotop will run until the user exits taskotop.",
)
parser.add_argument(
"-t",
"--taskomatic",
action="store_true",
dest="displayTaskomatic",
help="Include taskomaticd process information in the output.",
)
parser.add_argument(
"-v",
"--verbose",
action="count",
dest="verbose",
default=0,
help="Increase log output verbosity. Specify multiple times, up to 4 "
+ "to increase verbosity.",
)
parser.add_argument(
"--hide-elapsed",
action="store_true",
dest="hideElapsed",
help="Hide the ELAPSED column in the display.",
)
parser.add_argument(
"--show-start",
action="store_true",
dest="showStart",
help="Include the START column in the display.",
)
parser.add_argument(
"--logfile",
dest="logfile",
default=DEFAULT_LOGFILE,
help="Specify logfile to use if at least one verbose arg specified. "
# pylint: disable-next=consider-using-f-string
+ "Default is %s" % DEFAULT_LOGFILE,
)
args = parser.parse_args()
DISPLAY_TASKOMATIC = args.displayTaskomatic
DISPLAY_MODE_RECENT_HISTORY = 0
DISPLAY_MODE_EACH_TASK = 1
DISPLAY_MODE = DISPLAY_MODE_RECENT_HISTORY
SHOW_ELAPSED_TIME = True
SHOW_START_TIME = False
HUMAN_READABLE = args.humanReadable
MAXIMUM_AGE = args.maxAge
LOGGING_ENABLED = False
INTERACTIVE_HELP = [
"Help for taskotop interactive commands",
"",
" e Change display mode to show each task's latest run.",
" h Display this help page.",
" H Toggle human readable format. This toggles the time display between",
" [[days:]hours:]min:sec format and total seconds.",
" q Quit taskotop.",
" r Change display mode to show recent history of task runs.",
" t Toggle taskomatic process information display.",
"",
]
# pylint: disable-next=redefined-outer-name
def log_debug(msg, *args, **kwargs):
if LOGGING_ENABLED:
logging.debug(msg, *args, **kwargs)
# pylint: disable-next=redefined-outer-name
def log_info(msg, *args, **kwargs):
if LOGGING_ENABLED:
logging.info(msg, *args, **kwargs)
# pylint: disable-next=redefined-outer-name
def log_warning(msg, *args, **kwargs):
if LOGGING_ENABLED:
logging.warning(msg, *args, **kwargs)
# pylint: disable-next=redefined-outer-name
def log_error(msg, *args, **kwargs):
if LOGGING_ENABLED:
logging.error(msg, *args, **kwargs)
class CursesDisplayBuilder:
"""Builder class to make laying out a curses display in a table format easier"""
JUSTIFY_LEFT = 0
JUSTIFY_CENTER = 1
JUSTIFY_RIGHT = 2
row = []
def add_column(
self,
width,
heading,
heading_justify,
data_justify,
format_data_callable,
data_key="",
):
self.row.append(
CursesDisplayColumn(
width,
heading,
heading_justify,
data_justify,
format_data_callable,
data_key,
)
)
def string_of_length(self, length, char="*"):
retval = ""
# pylint: disable-next=unused-variable
for i in range(0, length):
retval += char
return retval
def add_column_value_to_screen(
self, screen, value, ypos, xpos, column_width, justify, maxy, maxx
):
if len(value) > column_width:
value = self.string_of_length(column_width)
addxpos = int(xpos + justify * (column_width - len(value)) / 2)
# need to skip writing to the last character on the last line
# so the cursor has a place to exist, even though its not
# visible
if ypos == maxy - 1 and addxpos + len(value) == maxx:
value = value[0:-1]
log_debug(
# pylint: disable-next=consider-using-f-string
"y=%d x=%d value '%s' value length %d" % (ypos, addxpos, value, len(value))
)
if len(value) > 0:
screen.addstr(ypos, addxpos, value)
return column_width
def output_to_screen(self, screen, data, starty=0):
maxy, maxx = screen.getmaxyx()
# pylint: disable-next=consider-using-f-string
log_debug("maxy, maxx is %d %d" % (maxy, maxx))
last_column_to_display = 0
current_width = 0
for column in self.row:
if current_width + column.width <= maxx:
last_column_to_display += 1
current_width += column.width + 1
else:
break
log_debug(
# pylint: disable-next=consider-using-f-string
"column '%s': width %d, next column starts at %d"
% (column.heading, column.width, current_width)
)
current_row = 0
if current_row + starty < maxy:
current_x = 0
for colindex in range(0, last_column_to_display):
column = self.row[colindex]
width = column.width
if width == -1:
width = maxx - current_x
value = column.heading
current_x += (
self.add_column_value_to_screen(
screen,
value,
current_row + starty,
current_x,
width,
column.heading_justify,
maxy,
maxx,
)
+ 1
)
current_row += 1
for rowdata in data:
if current_row + starty >= maxy:
break
current_x = 0
for colindex in range(0, last_column_to_display):
column = self.row[colindex]
width = column.width
if width == -1:
width = maxx - current_x
value = column.format_data_callable(rowdata, column.data_key, width)
current_x += (
self.add_column_value_to_screen(
screen,
value,
current_row + starty,
current_x,
width,
column.data_justify,
maxy,
maxx,
)
+ 1
)
current_row += 1
return current_row - 1
class CursesDisplayColumn:
"""Data structure for representing a column within CursesDisplayBuilder"""
def __init__(
self,
width,
heading,
heading_justify,
data_justify,
format_data_callable,
data_key="",
):
self.width = width
self.heading = heading
self.heading_justify = heading_justify
self.data_justify = data_justify
self.format_data_callable = format_data_callable
self.data_key = data_key
def get_tasko_runs_newer_than_age(maximum_age):
"""Returns data about recent Taskomatic task runs from the database."""
task_query = rhnSQL.prepare(
"""
SELECT
task.name AS name,
run.id AS id,
run.start_time AS start_time,
run.end_time AS end_time,
schedule.data AS data
FROM rhnTaskoRun run
JOIN rhnTaskoSchedule schedule ON schedule.id = run.schedule_id
JOIN rhnTaskoTemplate template ON template.id = run.template_id
JOIN rhnTaskoTask task ON task.id = template.task_id
WHERE
run.start_time IS NOT NULL
AND (run.end_time IS NULL OR run.end_time > :timelimit)
ORDER BY end_time DESC NULLS FIRST, start_time ASC
"""
)
# trim those older than maximum_age
task_query.execute(
timelimit=datetime.datetime.now() - datetime.timedelta(seconds=maximum_age)
)
# HACK: simulate fetchall_dict() in such a way BLOBs are only read once
# (otherwise we get exceptions)
result = []
row = task_query.fetchone_dict()
while row is not None:
row["data"] = rhnSQL.read_lob(row["data"])
result.append(row)
row = task_query.fetchone_dict()
return result
def get_tasko_runs_latest_each_task():
"""Returns data about latest of each Taskomatic task runs from the database."""
task_query = rhnSQL.prepare(
"""
SELECT
task.name AS name,
run.id AS id,
run.start_time AS start_time,
run.end_time AS end_time,
schedule.data AS data
FROM (SELECT template_id,
CASE WHEN MAX(CASE WHEN end_time IS NULL THEN 1 ELSE 0 END) = 0
THEN MAX(end_time)
END AS end_time
FROM rhnTaskoRun GROUP BY template_id) m
JOIN rhnTaskoRun run ON run.template_id = m.template_id
AND (run.end_time = m.end_time OR (run.end_time IS NULL AND m.end_time IS NULL))
JOIN rhnTaskoSchedule schedule ON schedule.id = run.schedule_id
JOIN rhnTaskoTemplate template ON template.id = run.template_id
JOIN rhnTaskoTask task ON task.id = template.task_id
ORDER BY end_time DESC NULLS FIRST, start_time ASC
"""
)
task_query.execute()
# HACK: simulate fetchall_dict() in such a way BLOBs are only read once
# (otherwise we get exceptions)
result = []
row = task_query.fetchone_dict()
while row is not None:
row["data"] = rhnSQL.read_lob(row["data"])
result.append(row)
row = task_query.fetchone_dict()
return result
def get_channel_names(ids):
"""Gets the channel names corresponding to channel ids from the database."""
if len(ids) == 0:
return []
query = rhnSQL.prepare(
# pylint: disable-next=consider-using-f-string
"""
SELECT DISTINCT label
FROM rhnChannel
WHERE id IN ({0})
ORDER BY label
""".format(
",".join(ids)
)
)
query.execute()
return [tuple[0] for tuple in query.fetchall()]
def get_current_repodata_channel_names():
"""Gets the channel names of currenlty running repodata tasks from the database."""
query = rhnSQL.prepare(
"""
SELECT DISTINCT channel_label
FROM rhnRepoRegenQueue
WHERE next_action IS NULL
ORDER BY channel_label
"""
)
query.execute()
return [row[0] for row in query.fetchall()]
# pylint: disable-next=redefined-builtin
def extract_channel_ids(bytes):
"""Extracts channel ids from a Java Map in serialized form."""
# HACK: this heuristicallty looks for strings, which are marked with 't',
# two bytes for the length and the string chars themselves. If they
# represent numbers, we assume they are channel_ids
# (currently this is the case)
java_strings = []
io = BytesIO(bytes)
while True:
char = io.read(1)
if char == b"":
break
elif char == b"t":
oldpos = io.tell()
try:
length = struct.unpack(">H", io.read(2))[0]
# pylint: disable-next=consider-using-f-string
java_string = struct.unpack(">{0}s".format(length), io.read(length))
java_strings += java_string
except struct.error:
pass # not a real string, ignore
io.seek(oldpos)
# of those found, filter the ones looking like a number
return [
java_string.decode() for java_string in java_strings if java_string.isdigit()
]
# column indexes for ps output
IX_PID = 0
IX_PPID = 1
IX_PCPU = 2
IX_PMEM = 3
IX_RSS = 4
IX_TIME = 5
# comm can have whitespace, but taskomaticd does not and
# is the only process for which we parse start time. As
# such, comm must be the second to last column, followed
# by lstart.
IX_COMM = 6
# lstart displays in format [weekday month day time year]
# ex Mon Mar 13 06:56:22 2017
IX_START_MON = 8
IX_START_DAY = 9
IX_START_TIME = 10
IX_START_YEAR = 11
def taskomaticd_ps():
"""use ps command to retrieve pids[], cputimeseconds, cpupercent, memsize, mempercent, upsince"""
# pylint: disable-next=import-outside-toplevel
import subprocess
pids = []
upsince = ""
cputimeseconds = 0
cpupercent = 0.0
mempercent = 0.0
memsize = 0
out = (
subprocess.Popen(
["ps", "--no-headers", "-eHo", "pid,ppid,pcpu,pmem,rss,time,comm,lstart"],
stdout=subprocess.PIPE,
)
.communicate()[0]
.splitlines()
)
for line in out:
values = line.split()
if values[IX_COMM] == "taskomaticd" or values[IX_PPID] in pids:
pids.append(values[IX_PID])
if not upsince:
# pylint: disable-next=consider-using-f-string
upsince = "%s %s %s %s" % (
values[IX_START_DAY],
values[IX_START_MON],
values[IX_START_YEAR],
values[IX_START_TIME],
)
cputimeseconds += seconds_from_time(values[IX_TIME])
cpupercent += float(values[IX_PCPU])
mempercent += float(values[IX_PMEM])
memsize += int(values[IX_RSS])
return pids, cputimeseconds, cpupercent, memsize, mempercent, upsince
# pylint: disable-next=redefined-outer-name
def seconds_from_time(time):
"""convert time in [DD-]hh:mm:ss format to total seconds"""
parts = time.split(":")
days = 0
hours = 0
# pylint: disable-next=redefined-builtin
min = int(parts[1])
sec = int(parts[2])
if "-" in parts[0]:
dh = parts[0].split("-")
days = int(dh[0])
hours = int(dh[1])
else:
hours = int(parts[0])
return (((((days * 24) + hours) * 60) + min) * 60) + sec
def add_line(screen, line, ypos):
"""Truncate the given line and add it to the screen at the specified position"""
maxy, maxx = screen.getmaxyx()
last_line = 0
if ypos >= maxy:
return 0
# need to skip writing to the last character on the last line
# so the cursor has a place to exist, even though its not
# visible. If last_line is 1, we truncate that last character
# from the line being added to the screen.
if ypos == maxy - 1:
last_line = 1
if len(line) > maxx - last_line:
line = line[0 : maxx - last_line]
screen.addstr(ypos, 0, line)
return 1
def show_taskomatic_header(screen):
"""Get taskomatic telemetry and display up to maxy, maxx"""
ypos = 0
try:
pids, cputimeseconds, cpupercent, memsize, mempercent, upsince = (
taskomaticd_ps()
)
line = "taskomaticd is not running"
if len(pids) > 0:
# pylint: disable-next=consider-using-f-string
line = "taskomaticd pid: %s up since: %s child processes: %d" % (
pids[0],
upsince,
len(pids) - 1,
)
ypos += add_line(screen, line, ypos)
if HUMAN_READABLE:
# pylint: disable-next=consider-using-f-string
line = "cpu %%: %2.1f cpu total time: %s" % (
cpupercent,
seconds_to_hms_string(cputimeseconds),
)
else:
# pylint: disable-next=consider-using-f-string
line = "cpu %%: %2.1f cpu total seconds: %d" % (cpupercent, cputimeseconds)
ypos += add_line(screen, line, ypos)
# pylint: disable-next=consider-using-f-string
line = "mem %%: %2.1f mem total (kB): %d" % (mempercent, memsize)
ypos += add_line(screen, line, ypos)
# pylint: disable-next=broad-exception-caught
except Exception:
log_error("failed to issue ps command to retrieve taskomaticd information")
line = "failed to issue ps command to retrieve taskomaticd information"
ypos += add_line(screen, line, ypos)
return ypos
def display_interactive_help(screen):
"""Display the interactive help on the screen"""
log_debug("Displaying interactive help")
while True:
screen.erase()
# pylint: disable-next=unused-variable
maxy, maxx = screen.getmaxyx()
ypos = 0
for line in INTERACTIVE_HELP:
if ypos > maxy - 2:
break
ypos += add_line(screen, line, ypos)
presskey_text = "Press any key "
ypos += add_line(screen, presskey_text, ypos)
screen.refresh()
try:
c = screen.getch()
if c > -1 and c < 256:
break
# pylint: disable-next=broad-exception-caught
except Exception:
pass
def process_interactive_input(c, screen):
"""Process the interactive input from the user"""
global DISPLAY_MODE
global HUMAN_READABLE
global DISPLAY_TASKOMATIC
if c == ord("q"):
system_exit(0)
elif c == ord("e"):
DISPLAY_MODE = DISPLAY_MODE_EACH_TASK
log_debug("Display Mode is now Each Task")
elif c == ord("r"):
DISPLAY_MODE = DISPLAY_MODE_RECENT_HISTORY
log_debug("Display Mode is now Recent History")
elif c == ord("H"):
HUMAN_READABLE = not HUMAN_READABLE
# pylint: disable-next=consider-using-f-string
log_debug("HUMAN_READABLE is now %s" % HUMAN_READABLE)
elif c == ord("t"):
DISPLAY_TASKOMATIC = not DISPLAY_TASKOMATIC
# pylint: disable-next=consider-using-f-string
log_debug("DISPLAY_TASKOMATIC is now %s" % DISPLAY_TASKOMATIC)
elif c == ord("h"):
# turn off half delay with nocbreak(), then
# turn cbreak back on so no need to hit 'enter'
curses.nocbreak()
curses.cbreak()
curses.curs_set(1)
display_interactive_help(screen)
curses.curs_set(0)
curses.halfdelay(10)
def seconds_to_hms_string(seconds):
result, s = divmod(seconds, 60)
result, m = divmod(result, 60)
result, h = divmod(result, 24)
retval = ""
if result > 0:
# pylint: disable-next=consider-using-f-string
retval += "%d:" % result
if h > 0:
# pylint: disable-next=consider-using-f-string
retval += "%02d:" % h
# pylint: disable-next=consider-using-f-string
retval += "%02d:" % m
# pylint: disable-next=consider-using-f-string
retval += "%02d" % s
return retval
# pylint: disable-next=unused-argument,unused-argument
def format_elapsed_time(rowdata, data_key, width):
"""Formats the elapsed time for display."""
end = datetime.datetime.now()
if rowdata["end_time"]:
end = rowdata["end_time"]
td = end.replace(tzinfo=None) - rowdata["start_time"].replace(tzinfo=None)
seconds = int(
(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
)
if HUMAN_READABLE:
return seconds_to_hms_string(seconds)
# pylint: disable-next=consider-using-f-string
return "{0}s".format(seconds)
# pylint: disable-next=unused-argument
def format_datetime(rowdata, data_key, width):
if rowdata[data_key]:
return rowdata[data_key].strftime("%Y-%m-%d %H:%M:%S")
return ""
# pylint: disable-next=unused-argument
def format_start_time(rowdata, data_key, width):
if rowdata["start_time"]:
return format_datetime(rowdata, "start_time", width)
return ""
# pylint: disable-next=unused-argument
def format_end_time(rowdata, data_key, width):
if rowdata["end_time"]:
return format_datetime(rowdata, "end_time", width)
if rowdata["start_time"]:
if SHOW_ELAPSED_TIME:
return "(running)"
# pylint: disable-next=consider-using-f-string
return "(running {0})".format(format_elapsed_time(rowdata, "", width))
return ""
# pylint: disable-next=unused-argument
def format_channel_names(rowdata, data_key, width):
"""format channel names for display"""
channel_names = []
if rowdata["data"]:
channel_names = get_channel_names(extract_channel_ids(rowdata["data"]))
if rowdata["name"] == "channel-repodata" and not rowdata["end_time"]:
channel_names = get_current_repodata_channel_names()
retval = ", ".join(channel_names)
if len(retval) > width:
retval = retval[0:width]
return retval
# pylint: disable-next=unused-argument,unused-argument
def format_int(rowdata, data_key, width):
"""format an int for display"""
# pylint: disable-next=consider-using-f-string
return "{id:d}".format(**rowdata)
# pylint: disable-next=unused-argument
def format_string(rowdata, data_key, width):
"""format a string for display"""
return rowdata[data_key]
def main(screen):
"""Computes and displays runs every second."""
curses.halfdelay(10)
rhnSQL.initDB()
# exit gracefully on ctrl-c
signal.signal(signal.SIGINT, lambda signal, frame: sys.exit(0))
# hide cursor
curses.curs_set(0)
# set up curses display builder
display_builder = CursesDisplayBuilder()
# pylint: disable-next=expression-not-assigned
display_builder.add_column(
11,
"RUN ID",
display_builder.JUSTIFY_RIGHT,
display_builder.JUSTIFY_LEFT,
format_int,
"id",
),
# pylint: disable-next=expression-not-assigned
display_builder.add_column(
30,
"TASK NAME",
display_builder.JUSTIFY_RIGHT,
display_builder.JUSTIFY_RIGHT,
format_string,
"name",
),
if SHOW_START_TIME:
# pylint: disable-next=expression-not-assigned
display_builder.add_column(
19,
"START",
display_builder.JUSTIFY_CENTER,
display_builder.JUSTIFY_RIGHT,
format_start_time,
),
if SHOW_ELAPSED_TIME:
# pylint: disable-next=expression-not-assigned
display_builder.add_column(
9,
"ELAPSED",
display_builder.JUSTIFY_RIGHT,
display_builder.JUSTIFY_RIGHT,
format_elapsed_time,
),
# pylint: disable-next=expression-not-assigned
display_builder.add_column(
19,
"END",
display_builder.JUSTIFY_CENTER,
display_builder.JUSTIFY_RIGHT,
format_end_time,
),
display_builder.add_column(
-1,
"CHANNEL",
display_builder.JUSTIFY_CENTER,
display_builder.JUSTIFY_RIGHT,
format_channel_names,
)
num_iterations = args.numIterations
if args.numIterations == 0:
num_iterations = -1
while num_iterations != 0:
if num_iterations > 0:
num_iterations -= 1
# pylint: disable-next=consider-using-f-string
log_debug("updating screen (%d remaining)" % num_iterations)
else:
log_debug("updating screen")
screen.erase()
current_y = 0
if DISPLAY_TASKOMATIC:
current_y += show_taskomatic_header(screen) + 1
result = []
if DISPLAY_MODE == DISPLAY_MODE_EACH_TASK:
result = get_tasko_runs_latest_each_task()
else:
result = get_tasko_runs_newer_than_age(MAXIMUM_AGE)
display_builder.output_to_screen(screen, result, current_y)
screen.refresh()
try:
# given up to a 1 second to retrieve user input
# because of halfdelay(10) call earlier
c = screen.getch()
if c != curses.ERR:
process_interactive_input(c, screen)
# pylint: disable-next=broad-exception-caught
except Exception:
# pylint: disable-next=redefined-outer-name
e = sys.exc_info()[1]
# pylint: disable-next=consider-using-f-string
log_warning("getch() exception %s" % e)
pass
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)
if args.numIterations < 0:
system_exit(2, "ERROR: NUMITERATIONS must not be a negative value")
if args.maxAge < 0:
system_exit(2, "ERROR: MAXAGE must not be a negative value")
if args.logfile != DEFAULT_LOGFILE and args.verbose == 0:
system_exit(
2, "ERROR: --logfile command line option requires use of -v or --verbose option"
)
if args.verbose > 0:
LOGGING_ENABLED = True
loglevel = logging.NOTSET
if args.verbose == 1:
loglevel = logging.ERROR
elif args.verbose == 2:
loglevel = logging.WARNING
elif args.verbose == 3:
loglevel = logging.INFO
else:
loglevel = logging.DEBUG
dirname = os.path.dirname(args.logfile)
if dirname != "" and not os.path.isdir(os.path.dirname(args.logfile)):
system_exit(
# pylint: disable-next=consider-using-f-string
1, "ERROR: Directory %s in specified logfile doesn't exist" % dirname
)
try:
# pylint: disable-next=unspecified-encoding
lfile = open(args.logfile, "a")
lfile.write(
# pylint: disable-next=consider-using-f-string
"Logging started with verbosity %d on %s\n"
% (args.verbose, time.strftime("%c"))
)
# pylint: disable-next=consider-using-f-string
lfile.write("taskotop command args: %s\n" % " ".join(sys.argv[1:]))
lfile.close()
# pylint: disable-next=broad-exception-caught
except Exception:
# pylint: disable-next=consider-using-f-string
system_exit(1, "ERROR: Failed to open and write to logfile %s" % args.logfile)
logging.basicConfig(
filename=args.logfile,
level=loglevel,
format="%(asctime)s %(levelname)s:%(message)s",
)
# pylint: disable-next=consider-using-f-string
log_debug("HUMAN_READABLE is %s" % HUMAN_READABLE)
# pylint: disable-next=consider-using-f-string
log_debug("MAXIMUM_AGE is %d" % MAXIMUM_AGE)
if args.eachTask:
DISPLAY_MODE = DISPLAY_MODE_EACH_TASK
log_debug("Display Mode is Each Task")
if args.recentHistory:
DISPLAY_MODE = DISPLAY_MODE_RECENT_HISTORY
log_debug("Display Mode is Recent History")
if args.showStart:
SHOW_START_TIME = True
log_debug("START column will be displayed")
if args.hideElapsed:
SHOW_ELAPSED_TIME = False
log_debug("ELAPSED column will be hidden")
try:
curses.wrapper(main)
except rhnSQL.SQLConnectError:
e = sys.exc_info()[1]
system_exit(
20,
[
# pylint: disable-next=consider-using-f-string
"ERROR: Can't connect to the database: %s" % str(e),
"Check if your database is running.",
],
)
# pylint: disable-next=broad-exception-caught
except Exception:
e = sys.exc_info()[1]
system_exit(
1,
# pylint: disable-next=consider-using-f-string
"ERROR: Some problems occurred during getting information about tasks: %s"
% str(e),
)
0707010000001C000081B400000000000000000000000168DD3ED300002168000000000000000000000000000000000000001E00000000spacewalk-utils/taskotop.sgml<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V3.1//EN">
<refentry>
<RefMeta>
<RefEntryTitle>taskotop</RefEntryTitle><manvolnum>8</manvolnum>
<RefMiscInfo>Version 1.0</RefMiscInfo>
</RefMeta>
<RefNameDiv>
<RefName><command>taskotop</command></RefName>
<RefPurpose>
Utility to monitor what the taskomatic daemon is doing.
</RefPurpose>
</RefNameDiv>
<RefSynopsisDiv>
<cmdsynopsis>
<command>taskotop</command>
<group>
<arg choice="plain">-e</arg>
<arg choice="plain">-r</arg>
</group>
<arg>-m <replaceable>MAXAGE</replaceable></arg>
<arg>-n <replaceable>NUMITERATIONS</replaceable></arg>
<arg>-t</arg>
<arg>-v<arg>-v<arg>-v<arg>-v</arg></arg></arg></arg>
<arg>--hide-elapsed</arg>
<arg>--show-start</arg>
<arg>--logfile <replaceable>LOGFILE</replaceable></arg>
</cmdsynopsis>
<cmdsynopsis>
<command>taskotop</command>
<group>
<arg choice="plain">--each-task</arg>
<arg choice="plain">--recent-history</arg>
</group>
<arg>--max-age <replaceable>MAXAGE</replaceable></arg>
<arg>-n <replaceable>NUMITERATIONS</replaceable></arg>
<arg>--taskomatic</arg>
<arg>--verbose<arg>--verbose<arg>--verbose<arg>--verbose</arg></arg></arg></arg>
<arg>--hide-elapsed</arg>
<arg>--show-start</arg>
<arg>--logfile <replaceable>LOGFILE</replaceable></arg>
</cmdsynopsis>
<cmdsynopsis>
<command>taskotop</command>
<arg>-h</arg>
</cmdsynopsis>
<cmdsynopsis>
<command>taskotop</command>
<arg>--help</arg>
</cmdsynopsis>
</RefSynopsisDiv>
<RefSect1><Title>Description</Title>
<para>
<command>taskotop</command> is a utility that displays the status of currently-executing or recently-completed taskomatic tasks. It optionally displays information about the running taskomatic daemon.
</para>
<para>
<command>taskotop</command> provides an updating terminal-window view of the currently-executing taskomatic tasks, similar to the way the <application>top</application> command works for general processes. It provides the following information for tasks that are currently executing or which have finished within the last minute:
<variablelist>
<varlistentry>
<term>RUN ID</term>
<listitem>
<para>
Unique ID of the run. An ID can be used to obtain additional information. If a specific task produced any standard output or error output during its run, it can be found in /var/log/rhn/tasko/sat/*/*_RUN_ID_{out,err}.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>TASK NAME</term>
<listitem>
<para>
Name of a taskomatic task as shown on Admin/Task Schedules, 'Bunch' details. For example, the <emphasis>cleanup-data-bunch</emphasis> includes the TASK NAMEs 'cleanup-packagechangelog-data' and 'cleanup-timeseries-data'.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>START</term>
<listitem>
<para>
The date and time the task run was started. This column of information is hidden by default and can be enabled with the <option>--show-start</option> command line argument.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>ELAPSED</term>
<listitem>
<para>
How long the task has been running. This column of information is displayed by default and can be hidden with the <option>--hide-elapsed</option> command line option.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>END</term>
<listitem>
<para>
The date and time the task run ended.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>CHANNEL</term>
<listitem>
<para>
When a channel-repodata task is in the running state, this column shows the label of the channel for which taskomatic is currently processing data.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
<para>
The general taskomatic log file can be found at /var/log/rhn/rhn_taskomatic_daemon.log
</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>-e, --each-task</term>
<listitem>
<para>
Display most recent run for each task instead of recent task run history.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>-r, --recent-history</term>
<listitem>
<para>
Display recent history of task runs. This is the default display mode.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>-H, --human-readable</term>
<listitem>
<para>
Use human readable time output. Time will be displayed in the format [[days:]hours:]min:sec instead of total seconds.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>-m <replaceable>MAXAGE</replaceable>, --max-age <replaceable>MAXAGE</replaceable></term>
<listitem>
<para>
Retrieve past events up to this old (in seconds, default 60). This has no effect if -e/--each-task is specified.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>-n <replaceable>NUMITERATIONS</replaceable></term>
<listitem>
<para>
<command>taskotop</command> will iterate the specified number of times and then exit. If not specified or 0 (the default), <command>taskotop</command> will run until the user exits taskotop.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>-t, --taskomatic</term>
<listitem>
<para>
Include taskomaticd process information in the output.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>-v [-v [-v [-v] ] ], --verbose [--verbose [--verbose [--verbose] ] ]</term>
<listitem>
<para>
Increase log output verbosity. Specify multiple times, up to 4 to increase verbosity.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>--hide-elapsed</term>
<listitem>
<para>
Hide the ELAPSED column in the display.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>--show-start</term>
<listitem>
<para>
Include the START column in the display.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>--logfile <replaceable>LOGFILE</replaceable></term>
<listitem>
<para>
Specify logfile to use if at least one verbose arg specified. Default is ./taskotop.log
</para>
</listitem>
</varlistentry>
</variablelist>
</RefSect1>
<RefSect1><Title>Interactive Commands</Title>
<para>
While <command>taskotop</command> is running, these one-character interactive commands may be used.
</para>
<variablelist>
<varlistentry>
<term>e</term>
<listitem>
<para>
Change display mode to show each task's latest run.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>h</term>
<listitem>
<para>
Display the interactive command help page.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>H</term>
<listitem>
<para>
Toggle human readable format. This toggles the time display between [[days:]hours:]min:sec format and total seconds.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>q</term>
<listitem>
<para>
Quit <command>taskotop</command>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>r</term>
<listitem>
<para>
Change display mode to show recent history of task runs.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>t</term>
<listitem>
<para>
Toggle taskomatic process information display.
</para>
</listitem>
</varlistentry>
</variablelist>
</RefSect1>
<RefSect1><Title>Authors</Title>
<simplelist>
<member>Tomas Kasparek<email>tkasparek@redhat.com</email></member>
<member>Eric Herget<email>eherget@redhat.com</email></member>
</simplelist>
</RefSect1>
</RefEntry>
0707010000001D000041FD00000000000000000000000268DD3ED300000000000000000000000000000000000000000000001600000000spacewalk-utils/tests0707010000001E000081B400000000000000000000000168DD3ED300000000000000000000000000000000000000000000002200000000spacewalk-utils/tests/__init__.py0707010000001F000081B400000000000000000000000168DD3ED3000004C9000000000000000000000000000000000000002100000000spacewalk-utils/tests/helpers.py# coding: utf-8
"""
Helpers for the test suite.
"""
import os
def symlink_source(script_name: str, mod_name: str, path: str = None) -> None:
"""
Create a symlink for Python source that contains no .py extension.
:param script_name: script name
:param mod_name: name of the module
:param path: path to that script.
:return: None
"""
if path is None:
path = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir))
# pylint: disable-next=consider-using-f-string
s_link_path = os.path.join(path, "tests", "{}.py".format(mod_name))
if not os.path.exists(s_link_path):
os.symlink(os.path.join(path, script_name), s_link_path)
def unsymlink_source(mod_name: str, path: str = None) -> None:
"""
Remove symlink for Python source that contains no .py extension.
:param mod_name: name of the symlink without an extension
:param path:
:return:
"""
if path is None:
path = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir))
# pylint: disable-next=consider-using-f-string
mod_path = os.path.join(path, "tests", "{}.py".format(mod_name))
if os.path.exists(mod_path):
os.unlink(mod_path)
07070100000020000081B400000000000000000000000168DD3ED300000947000000000000000000000000000000000000004100000000spacewalk-utils/tests/test_spacewalk_manage_channel_lifecycle.py# coding: utf-8
"""
Tests for spacewalk-manager-channel-lifecycle script.
"""
import os
import pytest
import tempfile
# pylint: disable-next=unused-import,unused-import
from mock import MagicMock, patch
from . import helpers
helpers.symlink_source("spacewalk-manage-channel-lifecycle", "smcl")
# pylint: disable-next=wrong-import-position
from . import smcl
helpers.unsymlink_source("smcl")
class TestSMCL:
"""
Integration/unit tests fusion for spacewalk-manage-channel-lifecycle script.
"""
def test_get_current_phase(self):
"""
Get configuration credentials.
:return:
"""
smcl.phases = ["dev", "test", "prod"]
class DummyOptions:
delimiter = "-"
smcl.options = DummyOptions
assert smcl.get_current_phase("develop") is None
assert smcl.get_current_phase("dev-develop") == "dev"
@pytest.mark.skip(reason="TBD")
def test_argparse_port(self):
"""
Dummy stub test for porting deprecated optparser to argparse.
:return:
"""
def test_configuration_saved_read(self):
"""
Test configuration file is saved to the disk and can be read.
:return:
"""
with tempfile.TemporaryDirectory(prefix="smcl-", dir="/tmp") as tmpdir:
smcl.CONF_DIR = os.path.join(tmpdir, ".spacewalk-manage-channel-lifecycle")
smcl.USER_CONF_FILE = os.path.join(smcl.CONF_DIR, "settings.conf")
smcl.SESSION_CACHE = os.path.join(smcl.CONF_DIR, "session")
config = smcl.Config(smcl.USER_CONF_FILE)
config.set("Millenium Falcon", "space speed", "75 MGLT")
config.set("Millenium Falcon", "atmospheric speed", "1050 km/h")
smcl.setup_config(config)
# Save
assert os.path.exists(
os.path.join(
tmpdir, ".spacewalk-manage-channel-lifecycle/settings.conf"
)
)
r_cfg = smcl.Config(smcl.USER_CONF_FILE)
smcl.setup_config(r_cfg)
assert r_cfg.get("Millenium Falcon", "space speed") == "75 MGLT"
assert r_cfg.get("Millenium Falcon", "atmospheric speed") == "1050 km/h"
assert r_cfg.get("general", "phases") == "dev, test, prod"
assert r_cfg.get("general", "exclude channels") == ""
07070100000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000B00000000TRAILER!!!