diff --git a/.fmf/version b/.fmf/version new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/.fmf/version @@ -0,0 +1 @@ +1 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/LICENSE @@ -0,0 +1,339 @@ + 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. + + + Copyright (C) + + 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. + + , 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. diff --git a/Regression/bz1580492-hostname-A-failed-to-parse-long-hostnames/Makefile b/Regression/bz1580492-hostname-A-failed-to-parse-long-hostnames/Makefile new file mode 100644 index 0000000..74485f9 --- /dev/null +++ b/Regression/bz1580492-hostname-A-failed-to-parse-long-hostnames/Makefile @@ -0,0 +1,64 @@ +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Makefile of /CoreOS/hostname/Regression/bz1580492-hostname-A-failed-to-parse-long-hostnames +# Description: Test for BZ#1580492 (hostname -A failed to parse long hostnames) +# Author: Ondrej Mejzlik +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2018 Red Hat, Inc. +# +# 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, see http://www.gnu.org/licenses/. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +export TEST=/CoreOS/hostname/Regression/bz1580492-hostname-A-failed-to-parse-long-hostnames +export TESTVERSION=1.0 + +BUILT_FILES= + +FILES=$(METADATA) runtest.sh Makefile PURPOSE + +.PHONY: all install download clean + +run: $(FILES) build + ./runtest.sh + +build: $(BUILT_FILES) + test -x runtest.sh || chmod a+x runtest.sh + +clean: + rm -f *~ $(BUILT_FILES) + + +include /usr/share/rhts/lib/rhts-make.include + +$(METADATA): Makefile + @echo "Owner: Ondrej Mejzlik " > $(METADATA) + @echo "Name: $(TEST)" >> $(METADATA) + @echo "TestVersion: $(TESTVERSION)" >> $(METADATA) + @echo "Path: $(TEST_DIR)" >> $(METADATA) + @echo "Description: Test for BZ#1580492 (hostname -A failed to parse long hostnames)" >> $(METADATA) + @echo "Type: Regression" >> $(METADATA) + @echo "TestTime: 15m" >> $(METADATA) + @echo "RunFor: hostname" >> $(METADATA) + @echo "Requires: hostname" >> $(METADATA) + @echo "Priority: Normal" >> $(METADATA) + @echo "License: GPLv2+" >> $(METADATA) + @echo "Confidential: no" >> $(METADATA) + @echo "Destructive: no" >> $(METADATA) + @echo "Bug: 1580492" >> $(METADATA) + @echo "Releases: -RHEL4 -RHELClient5 -RHELServer5" >> $(METADATA) + + rhts-lint $(METADATA) diff --git a/Regression/bz1580492-hostname-A-failed-to-parse-long-hostnames/PURPOSE b/Regression/bz1580492-hostname-A-failed-to-parse-long-hostnames/PURPOSE new file mode 100644 index 0000000..93404eb --- /dev/null +++ b/Regression/bz1580492-hostname-A-failed-to-parse-long-hostnames/PURPOSE @@ -0,0 +1,14 @@ +PURPOSE of /CoreOS/hostname/Regression/bz1580492-hostname-A-failed-to-parse-long-hostnames +Description: Test for BZ#1580492 (hostname -A failed to parse long hostnames) +Author: Ondrej Mejzlik +Bug summary: hostname -A failed to parse long hostnames +Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=1580492 + +The test tries to set various hostnames beginning with one character long hostname. +Up to the maximum allowed 64 chars long hostname. And including a 65 chars hostname testing that +hostname command forbids that. +Hostname -A should display hostnames up to the maximum allowed lenght. Because of the bug names longer +than 45 chars did not work. +Hostname -A uses DNS to resolve hostname, so /etc/resolv.conf must be empty in order to be able to set +hostname manually and have it affect the hostname -A command. + diff --git a/Regression/bz1580492-hostname-A-failed-to-parse-long-hostnames/main.fmf b/Regression/bz1580492-hostname-A-failed-to-parse-long-hostnames/main.fmf new file mode 100644 index 0000000..23e2540 --- /dev/null +++ b/Regression/bz1580492-hostname-A-failed-to-parse-long-hostnames/main.fmf @@ -0,0 +1,38 @@ +summary: Test for BZ#1580492 (hostname -A failed to parse long hostnames) +description: |+ + Bug summary: hostname -A failed to parse long hostnames + Bugzilla link: https://bugzilla.redhat.com/show_bug.cgi?id=1580492 + + The test tries to set various hostnames beginning with one character long hostname. + Up to the maximum allowed 64 chars long hostname. And including a 65 chars hostname testing that + hostname command forbids that. + Hostname -A should display hostnames up to the maximum allowed lenght. Because of the bug names longer + than 45 chars did not work. + Hostname -A uses DNS to resolve hostname, so /etc/resolv.conf must be empty in order to be able to set + hostname manually and have it affect the hostname -A command. + +contact: Petr Dancak +component: hostname +test: ./runtest.sh +framework: beakerlib +recommend: + - hostname +duration: 15m +enabled: true +tag: + - NoRHEL4 + - NoRHEL5 + - TIPfail_infra + - TIPpass + - Tier1 + - noExpectedness +tier: '1' +link: + - relates: https://bugzilla.redhat.com/show_bug.cgi?id=1580492 +adjust: + - enabled: false + when: distro == rhel-4, rhel-5 + continue: false +extra-nitrate: TC#0570966 +extra-summary: /CoreOS/hostname/Regression/bz1580492-hostname-A-failed-to-parse-long-hostnames +extra-task: /CoreOS/hostname/Regression/bz1580492-hostname-A-failed-to-parse-long-hostnames diff --git a/Regression/bz1580492-hostname-A-failed-to-parse-long-hostnames/runtest.sh b/Regression/bz1580492-hostname-A-failed-to-parse-long-hostnames/runtest.sh new file mode 100755 index 0000000..a637e25 --- /dev/null +++ b/Regression/bz1580492-hostname-A-failed-to-parse-long-hostnames/runtest.sh @@ -0,0 +1,101 @@ +#!/bin/bash +# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /CoreOS/hostname/Regression/bz1580492-hostname-A-failed-to-parse-long-hostnames +# Description: Test for BZ#1580492 (hostname -A failed to parse long hostnames) +# Author: Ondrej Mejzlik +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2018 Red Hat, Inc. +# +# 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, see http://www.gnu.org/licenses/. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +PACKAGE="hostname" +HOSTNAME_BACKUP="" +TEST_hostname="" + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +create_hostname() { + local length="$1" + TEST_hostname="" + for x in `seq 1 $length`; do + TEST_hostname=${TEST_hostname}a + done + rlAssertEquals "assert size of created hostname" $length ${#TEST_hostname} +} + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +function doTest { + local hostname_length="$1" + local comment="$2" + + # set new hostname to specified length + create_hostname "$hostname_length" + + # setup /etc/hosts - localhost + rlRun ": >/etc/hosts" 0 "Clear /etc/hosts" + rlRun "echo '127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4' > /etc/hosts" 0 "Fill /etc/hosts with defaults for ipv4 localhost" + rlRun "echo '::1 localhost localhost.localdomain localhost6 localhost6.localdomain6' >> /etc/hosts" 0 "Fill /etc/hosts with defaults for ipv6 localhost" + + # setup /etc/hosts - set new hostname to every IP address + rlLog "Setting new hostnames for all active IP addresses:" + for IP in $(hostname -I); do + rlRun "echo \"$IP $TEST_hostname\" >> /etc/hosts" 0 "Set $IP $1" + done + + # run hostname -A + rlLog "---------------------------------------------------------------------" + rlLog "----- $comment" + rlRun "hostname -A" + rlRun "hostname -A | grep -w $TEST_hostname" 0 "hostname -A check new hostname present" +} + + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +rlJournalStart + ########## SETUP PHASE ########## + rlPhaseStartSetup + rlAssertRpm $PACKAGE || rlDie "Package $PACKAGE not installed" + + rlRun "HOSTNAME_BACKUP=\"$(cat /proc/sys/kernel/hostname)\"" 0 "Backing up original hostname: $HOSTNAME_BACKUP" + rlRun "rlFileBackup --clean /etc/hosts `readlink -f /etc/hosts`" 0 "Backing up /etc/hosts" + + rlRun "TmpDir=\$(mktemp -d)" 0 "Creating tmp directory" + rlRun "pushd $TmpDir" + rlPhaseEnd + + ##################### TEST PHASE #################### + rlPhaseStartTest + doTest 1 "Test short hostname 1 char" + doTest 45 "Test medium hostname 45 chars" + doTest 46 "Test long hostname (reproducer) 46 chars" + doTest $(getconf HOST_NAME_MAX) "Test max hostname (reproducer) $(getconf HOST_NAME_MAX) chars" + rlPhaseEnd + + ########## CLEANUP PHASE ########## + rlPhaseStartCleanup + rlRun "rlFileRestore" 0 "Restoring /etc/hosts" + rlRun "hostname $HOSTNAME_BACKUP" 0 "Restoring original hostname $HOSTNAME_BACKUP" + rlRun "popd" + rlRun "rm -r $TmpDir" 0 "Removing tmp directory" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/Regression/bz1580492-hostname-A-failed-to-parse-long-hostnames/testinfo.desc b/Regression/bz1580492-hostname-A-failed-to-parse-long-hostnames/testinfo.desc new file mode 100644 index 0000000..1109467 --- /dev/null +++ b/Regression/bz1580492-hostname-A-failed-to-parse-long-hostnames/testinfo.desc @@ -0,0 +1,15 @@ +Owner: Ondrej Mejzlik +Name: /CoreOS/hostname/Regression/bz1580492-hostname-A-failed-to-parse-long-hostnames +TestVersion: 1.0 +Path: /mnt/tests/CoreOS/hostname/Regression/bz1580492-hostname-A-failed-to-parse-long-hostnames +Description: Test for BZ#1580492 (hostname -A failed to parse long hostnames) +Type: Regression +TestTime: 15m +RunFor: hostname +Requires: hostname +Priority: Normal +License: GPLv2+ +Confidential: no +Destructive: no +Bug: 1580492 +Releases: -RHEL4 -RHELClient5 -RHELServer5 diff --git a/Sanity/basic/.runtest.sh.swp b/Sanity/basic/.runtest.sh.swp new file mode 100644 index 0000000..fca03f4 Binary files /dev/null and b/Sanity/basic/.runtest.sh.swp differ diff --git a/Sanity/basic/Makefile b/Sanity/basic/Makefile new file mode 100644 index 0000000..f1c1748 --- /dev/null +++ b/Sanity/basic/Makefile @@ -0,0 +1,64 @@ +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Makefile of /CoreOS/hostname/Sanity/basic +# Description: sanity + basic white-box testing of hostname +# Author: Patrik Mosko +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2019 Red Hat, Inc. +# +# 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, see http://www.gnu.org/licenses/. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +export TEST=/CoreOS/hostname/Sanity/basic +export TESTVERSION=1.0 + +BUILT_FILES= + +FILES=$(METADATA) runtest.sh Makefile PURPOSE + +.PHONY: all install download clean + +run: $(FILES) build + ./runtest.sh + +build: $(BUILT_FILES) + test -x runtest.sh || chmod a+x runtest.sh + +clean: + rm -f *~ $(BUILT_FILES) + + +include /usr/share/rhts/lib/rhts-make.include + +$(METADATA): Makefile + @echo "Owner: Patrik Mosko " > $(METADATA) + @echo "Name: $(TEST)" >> $(METADATA) + @echo "TestVersion: $(TESTVERSION)" >> $(METADATA) + @echo "Path: $(TEST_DIR)" >> $(METADATA) + @echo "Description: Basic sanity test for hostname" >> $(METADATA) + @echo "Type: Sanity" >> $(METADATA) + @echo "TestTime: 10m" >> $(METADATA) + @echo "RunFor: hostname" >> $(METADATA) + @echo "Requires: hostname net-tools" >> $(METADATA) + @echo "Requires: kmod bind-utils" >> $(METADATA) + @echo "Priority: Normal" >> $(METADATA) + @echo "License: GPLv2+" >> $(METADATA) + @echo "Confidential: no" >> $(METADATA) + @echo "Destructive: no" >> $(METADATA) + @echo "Releases: -RHEL4 -RHELClient5 -RHELServer5" >> $(METADATA) + + rhts-lint $(METADATA) diff --git a/Sanity/basic/PURPOSE b/Sanity/basic/PURPOSE new file mode 100644 index 0000000..22e74e6 --- /dev/null +++ b/Sanity/basic/PURPOSE @@ -0,0 +1,3 @@ +PURPOSE of /CoreOS/hostname/Sanity/basic +Description: sanity + basic white-box testing of hostname +Author: Patrik Mosko diff --git a/Sanity/basic/main.fmf b/Sanity/basic/main.fmf new file mode 100644 index 0000000..3b9bbac --- /dev/null +++ b/Sanity/basic/main.fmf @@ -0,0 +1,32 @@ +summary: Basic sanity test for hostname +description: '' +contact: + - Petr Dancak + - Patrik Moško +component: hostname +test: ./runtest.sh +framework: beakerlib +recommend: + - hostname + - net-tools + - kmod + - bind-utils +duration: 10m +enabled: true +tag: + - NoRHEL4 + - NoRHEL5 + - TIPfail_infra + - TIPpass + - Tier1 +tier: '1' +adjust: + - enabled: false + when: distro == rhel-4, rhel-5 + continue: false + - enabled: false + when: arch == aarch64 + continue: false +extra-nitrate: TC#0602798 +extra-summary: /CoreOS/hostname/Sanity/basic +extra-task: /CoreOS/hostname/Sanity/basic diff --git a/Sanity/basic/runtest.sh b/Sanity/basic/runtest.sh new file mode 100755 index 0000000..dfef7c7 --- /dev/null +++ b/Sanity/basic/runtest.sh @@ -0,0 +1,352 @@ +#!/bin/bash +# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# runtest.sh of /CoreOS/hostname/Sanity/basic +# Description: sanity + basic white-box testing of hostname +# Author: Patrik Mosko +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# Copyright (c) 2019 Red Hat, Inc. +# +# 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, see http://www.gnu.org/licenses/. +# +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +# Include Beaker environment +. /usr/share/beakerlib/beakerlib.sh || exit 1 + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +PACKAGE="hostname" + +TEST_hostname="myhostname" +TEST_domain="sanitytesting.com" +TEST_FQDN="$TEST_hostname.$TEST_domain" + +TEST_hostname2="myhostname2" +TEST_domain2="sanitytesting2.com" +TEST_FQDN2="$TEST_hostname2.$TEST_domain2" + +DUMMIES_NUM=5 #number of dummy interfaces we are gonna operate with + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +backup_files() { + rlFileBackup --clean --missing-ok "/etc/hosts" + rlFileBackup --clean --missing-ok "/etc/hostname" + rlFileBackup --clean --missing-ok "/etc/host.conf" + rlFileBackup --clean --missing-ok "/etc/resolv.conf" +} + +hostname_backup() { + rlLog "Backing up actual \`hostname\` value" + rlRun 'hostname_bak="$(hostname)"' +} +hostname_reset() { + rlLog "Reseting hostname to the last backed up value" + rlRun "hostname $hostname_bak" +} + +set_hostname_by_length() { + local length="$1" + rlLog "Prepare hostname string of specified length ($length)" + test_hostname="$(printf 'h%.0s' $(seq 1 $length))" + rlRun "echo $test_hostname | wc -c" + rlAssertEquals "assert size of created string" $length ${#test_hostname} +} + +etc-hosts_reset() { + rlLog "Reseting /etc/hosts to localhost mappings only" + rlRun ": >/etc/hosts" + rlRun "echo '127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4' > /etc/hosts" + rlRun "echo '::1 localhost localhost.localdomain localhost6 localhost6.localdomain6' >> /etc/hosts" +} + +etc-hosts_add() { + local ip_addr="$1" + local domain="$2" + local alias="$3" + rlLog "Adding new entry into /etc/hosts" + echo "$ip_addr $domain $alias" >> /etc/hosts +} +resolv-conf_add() { + local str="$1" + rlLog "Adding new entry into /etc/resolv.conf" + echo "$str" >> /etc/resolv.conf +} + +create_dummy_ifc() { + local dummies_num="$1" + rlLog "Create '$1' dummy interfaces and assign them static IPs" + + rlRun "modprobe dummy numdummies=$dummies_num" + for ifc in `seq 0 $(( ${dummies_num}-1 ))`; do + rlRun "ip address add 9.8.7.${ifc}/32 dev dummy${ifc}" + rlRun "ip link set dev dummy${ifc} up" + done + ip address +} + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +rlJournalStart + ########## SETUP PHASE ########## + rlPhaseStartSetup + rlIsRHEL '<=6' && rlAssertRpm "net-tools" + rlIsRHEL '>6' && rlAssertRpm "hostname" + backup_files + rlRun "HOSTNAME_backup=$(hostname)" + + rlRun "TmpDir=\$(mktemp -d)" 0 "Creating tmp directory" + rlRun "pushd $TmpDir" + rlPhaseEnd + + ##################### TEST PHASE #################### + rlPhaseStartTest "hostname - basic GET/SET/FQDN - localhost - options alternatives- /etc/hosts" + # set FQDN in /etc/hosts + rlRun "hostname $TEST_hostname" + rlRun "etc-hosts_add '5.5.4.4' $TEST_FQDN $TEST_hostname" 0 "insert random 'ip fqdn alias' into /etc/hosts" + + # -s, --short + #_______________________________________________________________ + rlRun '_s=$(hostname -s)' 0 "GET short name (-s)" + rlRun '_short=$(hostname --short)' 0 "GET short name (--short)" + rlAssertEquals "Check if hostname returned expected shortname" "$_s" "$TEST_hostname" + rlAssertEquals "compare output of '-s' and '--short'" "$_s" "$_short" + + # -d, --domain + #_______________________________________________________________ + rlRun '_d=$(hostname -d)' 0 "GET short name (-d)" + rlRun '_domain=$(hostname --domain)' 0 "GET short name (--domain)" + rlAssertEquals "Check if hostname returned expected domain" "$_d" "$TEST_domain" + rlAssertEquals "compare output of '-d' and '--domain'" "$_d" "$_domain" + + # -f, --long, --fqdn + #_______________________________________________________________ + rlRun '_f=$(hostname -f)' 0 "GET fqdn (-f)" + rlRun '_fqdn=$(hostname --fqdn)' 0 "GET fqdn (--fqdn)" + rlRun '_long=$(hostname --long)' 0 "GET fqdn (--long)" + rlAssertEquals "Check if hostname returned expected FQDN" "$_fqdn" "$TEST_FQDN" + rlAssertEquals "compare output of '--fqdn' and '--long'" "$_fqdn" "$_long" + rlAssertEquals "compare output of '--fqdn' and '-f'" "$_fqdn" "$_f" + rlPhaseEnd + + + ##################### TEST PHASE #################### + rlPhaseStartTest "hostname - advanced GET/SET" + rlRun "HFile=$(mktemp)" + rlRun "echo $TEST_hostname2 > $HFile" + > file_empty + + # try to set hostname with unsupported characters + if rlIsRHEL '>6'; then #rhel-6 permits disallowed hostnames syntax + rlRun "hostname invalid+hostname" 1 + rlRun "hostname invalid/host/name" 1 + rlRun "hostname _invalidhostname" 1 + rlRun "hostname ~invalidhostname" 1 + fi + + # -f, --file no-exists + #_______________________________________________________________ + rlRun "_F=\$(hostname -F nonexist_file)" 1 "SET hostname from (non-existing) file (-F)" + rlRun "_file=\$(hostname --file nonexist_file)" 1 "SET hostname from (non-existing) file (--file)" + # -f, --file exists_empty + rlRun "_F=\$(hostname -F $HFile)" 0 "SET hostname from (existing/empty) file (-F)" + rlRun "_file=\$(hostname --file $HFile)" 0 "SET hostname from (existing/empty) file (--file)" + + if rlIsRHEL '>6'; then + # --boot && --file no-exists + #_______________________________________________________________ + rlRun '_F=$(hostname -F nonexist_file --boot)' 0 "SET hostname from (non-existing) file (-F, --boot)" + rlRun '_file=$(hostname --file nonexist_file -b)' 0 "SET hostname from (non-existing) file (--file)" + # --boot && --file exists_empty + rlRun "_F=\$(hostname -F $HFile --boot)" 0 "SET hostname from (existing/empty) file (-F, --boot)" + rlRun "_file=\$(hostname --file $HFile -b)" 0 "SET hostname from (existing/empty) file (--file)" + fi + rlPhaseEnd + + + ##################### TEST PHASE #################### + rlPhaseStartTest "hostname - multiple IP addresses" + etc-hosts_reset + + # -i, --ip-address + # -I, --all-ip-addresses + # whitebox: foreach getaddrinfo() => getnameinfo(NI_NUMERICHOST) + #_______________________________________________________________ + # a) hostname has DNS record(s) - check all A|AAAA IP addresses + rlRun "hostname example.com" 0 "set hostname to example.com - ugly workaround to test getaddrinfo being run internally" + if rlIsRHEL; then + if rpm -q --quiet bind-utils; then + if host $(hostname); then + hostname_backup + rlRun "hostname example.com" + # --ip-address + for addr in $(hostname -i); do + rlAssertGrep "$addr" <(dig $(hostname) any |sed -nre "s|^$(hostname)\\..*IN\\s+A+\\s+||gp") + rlAssertNotGrep "$addr" <(ip a sh up) + done + # --all-ip-addresses: example.com addresses shouldn't be returned + for addr in $(hostname -I); do + rlAssertNotGrep "$addr" <(dig $(hostname) any |sed -nre "s|^$(hostname)\\..*IN\\s+A+\\s+||gp") + rlAssertGrep "$addr" <(ip a sh up) + done + hostname_reset + fi + fi + fi + + # b) Set hostname in /etc/hosts + hostname_backup + rlRun "hostname $TEST_hostname2" 0 "set random hostname - shouldn't have entry in DNS server/zone" + rlRun "etc-hosts_add 8.1.2.3 $TEST_hostname2" + rlRun "etc-hosts_add 8.1.2.4 $TEST_hostname2" + rlRun "etc-hosts_add 8.1.2.5 $TEST_hostname2" + rlRun "etc-hosts_add abcd:ef00::1 $TEST_hostname2" + rlRun "etc-hosts_add abcd:ef00::2 $TEST_hostname2" + rlRun "hostname -i | xargs -I % -d' ' grep % /etc/hosts" 0 'hostname --ip-address: IPs inserted into /etc/hosts should be recognized' + rlRun "hostname -I | xargs -I % -d' ' grep % /etc/hosts" 123 'hostname --all-ip-addresses: IPs inserted into /etc/hosts should NOT be recognized' + hostname_reset + etc-hosts_reset + + # c) no DNS record for hostname, print IPs of some (up) interfaces + create_dummy_ifc $DUMMIES_NUM + hostname_backup + rlRun "hostname random-hostname" + sleep 5 + if rlIsRHEL '<=6'; then + rlRun "hostname -i" 1 + else + rlRun -l "hostname" + rlRun -l "hostname -i" + # --ip-address + rlLog "Check if IPs returned by 'hostname -i' are present in 'ip addr show up'" + for ip in $(hostname -i | tr ' ' '\n' | awk -F'%' '{print $1}'); do + rlLog "Checking IP '${ip}' returned by 'hostname -i'" + rlAssertGrep "${ip}" <(ip a sh up) + done +# TODO: +#failing part needs update: +# LOG: http://beaker-archive.host.prod.eng.bos.redhat.com/beaker-logs/2019/11/39117/3911716/7601680/102569594/taskout.log +# rlRun "[ \$(hostname -i | wc -w) -gt \$(hostname -I | wc -w) ]" 0 "hostname -i gives lesser number of IPs - it omits IPv6's link local IPs" + fi + # --all-ip-addresses + rlLog "Check if IPs returned by 'hostname -I' are present in 'ip addr show up'" + for ip in $(hostname -I | tr ' ' '\n' | awk -F'%' '{print $1}'); do + rlLog "Checking IP '${ip}' returned by \`hostname -I\`" + rlAssertGrep "${ip}" <(ip a sh up) + done + rlPhaseEnd + + + ##################### TEST PHASE #################### + rlPhaseStartTest "hostname - advanced FQDN" + etc-hosts_reset + hostname_backup + + # -A, --all-fqdns + # whitebox: foreach getaddrinfo() => getnameinfo(NI_NAMEREQD) + # tries to get FQDN from all system's IPs with getnameinfo() - ignore downed interfaces, loopback and link-local + #_______________________________________________________________ + rlRun -l "hostname -I | tr ' ' '\\n'" + rlRun -l "hostname -A" + + # each dummy interfaces shall return the same hostname + if rlIsRHEL '>6'; then #bug not fixed (yet) on rhel-6 net-tools version of hostname (length is INET6_ADDRSTRLEN, should be 255) + rlRun "hostname $TEST_hostname" + rlRun "[ \$(hostname -A | tr ' ' '\\n' | grep $TEST_hostname | wc -w) -ge $DUMMIES_NUM ]" + rlRun "[ \$(hostname --all-fqdns | tr ' ' '\\n' | grep $TEST_hostname | wc -w) -ge $DUMMIES_NUM ]" + fi + + # hostname -A should be able to find PTR DNS records for our initial hostname + if rpm -q --quiet bind-utils; then + if host $HOSTNAME_backup; then + rlRun "hostname example.com" + # simply assume that our initial hostnames have always an IPv4 addr + for addr in $(dig $HOSTNAME_backup any |sed -nre "s|^$(hostname)\\..*IN\\s+A+\\s+||gp"); do + rlAssertNotGrep "$addr" <(hostname --all-fqdns) + rlAssertNotGrep "$addr" <(hostname -A) + done + fi + fi + + hostname_reset + rlRun "rmmod dummy" + rlPhaseEnd + + + ##################### TEST PHASE #################### + rlPhaseStartTest "Check other options" + # -V, --version + #_______________________________________________________________ + rlIsRHEL '<=6' && ret=5 || ret=0 + rlRun '_V="$(hostname -V 2>&1)"' $ret "GET version (-V)" + rlRun '_version="$(hostname --version 2>&1)"' $ret "GET version (--version)" + if rlIsRHEL '<=6'; then + rlAssertGrep "$(rpm -q --qf %{V} net-tools)" <(echo $_V | grep net-tools) + else + rlAssertGrep "$(rpm -q --qf %{V} hostname)" <(echo $_V) + fi + rlAssertEquals "compare output of '-V' and '--version'" "$_V" "$_version" + + #-h, --help + #_______________________________________________________________ + rlIsRHEL '<=6' && ret=4 || ret=255 + rlRun "hostname -h" $ret "basic CLI help page (-h)" + rlRun "hostname --help" $ret "basic CLI help page (--help)" + rlPhaseEnd + + + ##################### TEST PHASE #################### + rlPhaseStartTest "hostname - SET - length boundaries" + # lower limits + if rlIsRHEL '>6'; then # probably should be considered as bug in rhel-6 net-tools version of hostname + rlRun "hostname ''" 1 "hostname shoudln't accept string of size 0" + rlRun "[ \"$(hostname | wc -c)\" -gt 0 -a \"$(hostname | wc -c)\" -lt $(($(getconf HOST_NAME_MAX)+2)) ]" + fi + + rlRun "set_hostname_by_length 1" + rlRun "hostname $test_hostname" + rlRun "[ \"$(hostname | wc -c)\" -gt 0 -a \"$(hostname | wc -c)\" -lt $(($(getconf HOST_NAME_MAX)+2)) ]" + + # upper limits + rlRun "set_hostname_by_length 47" 0 "testing old buffer length (INET6_ADDRSTRLEN (46)) bug " + rlRun "hostname $test_hostname" + rlRun "[ \"\$(hostname)\" = \"$test_hostname\" ]" + rlRun "[ \"$(hostname | wc -c)\" -gt 0 -a \"$(hostname | wc -c)\" -lt $(($(getconf HOST_NAME_MAX)+2)) ]" + + rlRun "set_hostname_by_length \$(getconf HOST_NAME_MAX)" + rlRun "hostname $test_hostname" + rlRun "[ \"\$(hostname)\" = \"$test_hostname\" ]" + rlRun "[ \"$(hostname | wc -c)\" -gt 0 -a \"$(hostname | wc -c)\" -lt $(($(getconf HOST_NAME_MAX)+2)) ]" + + rlRun "set_hostname_by_length \$(( \$(getconf HOST_NAME_MAX)+1 ))" + rlRun "hostname $test_hostname" 1 "OS should prevent setting hostname bigger than default MAX length" + rlPhaseEnd + + + #TODO: NIS-related magic + options (-y, --yp, --nis) + ##################### TEST PHASE #################### + #rlPhaseStartTest "Check other options" + #rlPhaseEnd + + + ########## CLEANUP PHASE ########## + rlPhaseStartCleanup + rlRun "hostname $HOSTNAME_backup" + rlFileRestore + rlRun "popd" + rlRun "rm -r $TmpDir" 0 "Removing tmp directory" + rlPhaseEnd +rlJournalPrintText +rlJournalEnd diff --git a/Sanity/basic/testinfo.desc b/Sanity/basic/testinfo.desc new file mode 100644 index 0000000..c5d2405 --- /dev/null +++ b/Sanity/basic/testinfo.desc @@ -0,0 +1,15 @@ +Owner: Patrik Mosko +Name: /CoreOS/hostname/Sanity/basic +TestVersion: 1.0 +Path: /mnt/tests/CoreOS/hostname/Sanity/basic +Description: Basic sanity test for hostname +Type: Sanity +TestTime: 10m +RunFor: hostname +Requires: hostname net-tools +Requires: kmod bind-utils +Priority: Normal +License: GPLv2+ +Confidential: no +Destructive: no +Releases: -RHEL4 -RHELClient5 -RHELServer5